Createdon:2012-10-17Author:zhangbin
本文引用地址:https://www.eepw.com.cn/article/201611/322856.htm
学习笔记
forucos-iiMC9S12XS128lcd12864ser_2_pin
redesignedbyzhangbin
2012-10-17
versions:V-0.1
AllRightsReserved
//本程序实现lcd的显示和led的闪烁,这两个任务通过信号量进行通信,要实现的效果如下:
//lcd任务申请一个信号量后显示完一个周期后停止显示并且释放信号量,led任务申请到信号量后开始闪烁,闪烁了10
//次后停止,释放信号量,lcd任务再申请信号量,继续开始显示,如此循环
//本程序实现lcd的显示和led的闪烁,这两个任务通过信号量进行通信,要实现的效果如下:
//lcd任务申请一个信号量后显示完一个周期后停止显示并且释放信号量,led任务申请到信号量后开始闪烁,闪烁了10
//次后停止,释放信号量,lcd任务再申请信号量,继续开始显示,如此循环
#include"includes.h"
#include"pll.h"
#include"string.h"
#include"ser_12864.h"
#defineTASK_STK_SIZE128//定义任务堆栈长度
#defineTASK_START_PRIO5//此版本的uC/OS-II最多支持256个用户定义任务。优先级号越低,任务的优先级别就越高
#defineTASK_1_PRIO10
#defineTASK_2_PRIO12
#defineTASK_3_PRIO8
#defineTASK_4_PRIO16
#defineTASK_5_PRIO18
#defineTASK_6_PRIO20
#defineTASK_7_PRIO22
#defineTASK_8_PRIO24
#defineTASK_9_PRIO26
#defineTASK_A_PRIO28
#defineTASK_B_PRIO30
#defineTASK_C_PRIO32
#defineTASK_D_PRIO34
#defineTASK_E_PRIO36
#defineTASK_F_PRIO38
#defineMUTEX_PIP_18
#defineMUTEX_PIP_29
#defineEVENT_Q_1_SIZE10
#defineEVENT_Q_2_SIZE20
#defineMEM_BLKS_110
#defineMEM_BLK_SIZE_18
#defineMEM_BLKS_28
#defineMEM_BLK_SIZE_212
OS_STKlcd_task_stk[TASK_STK_SIZE];//定义任务堆栈
OS_STKled_task_stk[TASK_STK_SIZE];
OS_STKAppStartTaskStk[TASK_STK_SIZE];//创建任务堆栈OS_STK创建任务参数指针TASKDATA,调用函数创建任务
OS_STKAppTask1Stk[TASK_STK_SIZE];
OS_STKAppTask2Stk[TASK_STK_SIZE];
OS_STKAppTask3Stk[TASK_STK_SIZE];
OS_STKAppTask4Stk[TASK_STK_SIZE];
OS_STKAppTask5Stk[TASK_STK_SIZE];
OS_STKAppTask6Stk[TASK_STK_SIZE];
OS_STKAppTask7Stk[TASK_STK_SIZE];
OS_STKAppTask8Stk[TASK_STK_SIZE];
OS_STKAppTask9Stk[TASK_STK_SIZE];
OS_STKAppTaskAStk[TASK_STK_SIZE];
OS_STKAppTaskBStk[TASK_STK_SIZE];
OS_STKAppTaskCStk[TASK_STK_SIZE];
OS_STKAppTaskDStk[TASK_STK_SIZE];
OS_STKAppTaskEStk[TASK_STK_SIZE];
OS_STKAppTaskFStk[TASK_STK_SIZE];
INT16UAppTask1Ctr;
INT16UAppTask2Ctr;
INT16UAppTask3Ctr;
INT16UAppTask4Ctr;
INT16UAppTask5Ctr;
INT16UAppTask6Ctr;
INT16UAppTask7Ctr;
INT16UAppTask8Ctr;
INT16UAppTask9Ctr;
INT16UAppTaskACtr;
INT16UAppTaskBCtr;
INT16UAppTaskCCtr;
INT16UAppTaskDCtr;
INT16UAppTaskECtr;
INT16UAppTaskFCtr;
INT8Usensor=0;//定义8路传感器采集变量
INT8Utest_value;//定义第八路传感器故障时的变量
//下面定义一些事件等,方便使用,不习惯使用下面的定义,自己定义也可以
#ifOS_SEM_EN>0//如果信号量使能位允许
OS_EVENT*EventSem1;//声明信号量是事件控制块ECB类型的指针存放创建信号量函数返回的创建的
OS_EVENT*EventSem2;//信号量的指针
#endif
#ifOS_MBOX_EN>0
OS_EVENT*EventMbox1;//声明消息邮箱是事件控制块ECB类型的指针
OS_EVENT*EventMbox2;
#endif
#ifOS_Q_EN>0
OS_EVENT*EventQ1;//声明消息队列
OS_EVENT*EventQ2;
void*EventQTbl1[EVENT_Q_1_SIZE];
void*EventQTbl2[EVENT_Q_2_SIZE];
//定义消息指针数组
//创建消息队列,首先需要定义一个指针数组(用于存放消息邮箱),然后把各个消息数据缓冲区的首地址存入这个数组中
//最后再调用函数OSQCreate()来创建消息队列
#endif
#ifOS_MUTEX_EN>0
OS_EVENT*EventMutex1;//声明互斥信号量
OS_EVENT*EventMutex2;
#endif
#ifOS_FLAG_EN>0
OS_FLAG_GRP*FlagGrp1;//声明事件标志组是标志组OS_FLAG_GRP类型的指针
OS_FLAG_GRP*FlagGrp2;//事件控制块用来描述信号量,消息邮箱,消息队列。标志组用来描述事件标志组
#endif
#ifOS_MEM_EN>0
OS_MEM*MemPart1;//声明内存块是内存控制块OS_MEM类型的指针
OS_MEM*MemPart2;
INT8UMemPart1Tbl[MEM_BLKS_1][MEM_BLK_SIZE_1];//内存分区
INT8UMemPart2Tbl[MEM_BLKS_2][MEM_BLK_SIZE_2];
#endif
//任务的函数声明
staticvoidAppStartTask(void*pdata);
staticvoidAppTaskCreate(void);
staticvoidAppEventCreate(void);
staticvoidAppTask1(void*pdata);
staticvoidAppTask2(void*pdata);
staticvoidAppTask3(void*pdata);
staticvoidAppTask4(void*pdata);
staticvoidAppTask5(void*pdata);
staticvoidAppTask6(void*pdata);
staticvoidAppTask7(void*pdata);
staticvoidAppTask8(void*pdata);
staticvoidAppTask9(void*pdata);
staticvoidAppTaskA(void*pdata);
staticvoidAppTaskB(void*pdata);
staticvoidAppTaskC(void*pdata);
staticvoidAppTaskD(void*pdata);
staticvoidAppTaskE(void*pdata);
staticvoidAppTaskF(void*pdata);
staticvoidAppTickInit(void);
staticvoidlcd_task(void*pdata);
staticvoidled_task(void*pdata);
OS_EVENT*event_sem;//声明信号量是事件控制块ECB类型的指针存放创建信号量函数返回的创建的
INT8Uerr;//定义一个错误信息
//12864要显示的内容
staticunsignedchars1[]={"汉字显示LCD"};
staticunsignedchars2[]={"MC9S12开发系统"};
staticunsignedchars3[]={"goodgoodstudy"};
staticunsignedchars4[]={"2012-10-17-H23木"};
//INT8Utimes_lcd=0;//记录任务lcd的运行次数
//INT8Utimes_led=0;//任务led的运行次数
voidmain(void)
{//因为没有外设,所以不存在硬件初始化函数
INT8Uerr;
INT16UStartdata=0x1234;//???
//开始执行的位置另一种定义方式:TASKDATA.myPPAGE=0x1234,为结构体变量的初始化
DDRB=0xff;//B口led设为输出
PORTB=0xff;//led初始状态为灭
DDRA|=0x03;//液晶的两条线
init_lcd();
pllbus_init16m();//时钟初始化为16M
//LcdInit();//LCD初始化
OSInit();
event_sem=OSSemCreate(1);
//在主函数中创建信号量返回值为创建的信号量指针,参数是信号量的计数器的值
//用该参数对信号量计数器OSEventCnt进行初始化
//1即代表只创建一个信号量,代表信号量用于对共享资源的访问(例如,把它当做二值信号量使用),详见P166
//创建起始任务,作用:初始化时钟滴答,为操作系统提供时钟。初始化统计任务,创建应用任务,建立事件
OSTaskCreateExt(AppStartTask,//创建开始任务处于休眠态的任务经过这个函数处理后转为就绪态
(void*)&Startdata,//???
(OS_STK*)&AppStartTaskStk[TASK_STK_SIZE-1],
TASK_START_PRIO,//优先级为5
TASK_START_PRIO,
(OS_STK*)&AppStartTaskStk[0],
TASK_STK_SIZE,
(void*)0,
OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);
//该函数参数的具体介绍见P121
OSTaskNameSet(TASK_START_PRIO,"StartTask",&err);//设置任务的名称作用??
OSTaskNameSet(OS_TASK_IDLE_PRIO,"uC/OS-IIIdle",&err);//空闲任务
OSTaskNameSet(OS_TASK_STAT_PRIO,"uC/OS-IIStat",&err);//统计任务
//#defineOS_TASK_STAT_EN1u//Enable(1)orDisable(0)thestatisticstask
//因为在本系统中os_cfg_r.h文件中把OS_TASK_STAT_EN设为了1(如上),所以系统的统计任务会建立
//统计任务的建立是在OSInit()中被创建的,代码如下:
评论