Createdon:2012-10-17Author:zhangbin
本文引用地址:http://www.ex-cimer.com/article/201611/322856.htm
學習筆記
forucos-iiMC9S12XS128lcd12864ser_2_pin
redesignedbyzhangbin
2012-10-17
versions:V-0.1
AllRightsReserved
//本程序實現lcd的顯示和led的閃爍,這兩個任務通過信號量進行通信,要實現的效果如下:
//lcd任務申請一個信號量后顯示完一個周期后停止顯示并且釋放信號量,led任務申請到信號量后開始閃爍,閃爍了10
//次后停止,釋放信號量,lcd任務再申請信號量,繼續(xù)開始顯示,如此循環(huán)
//本程序實現lcd的顯示和led的閃爍,這兩個任務通過信號量進行通信,要實現的效果如下:
//lcd任務申請一個信號量后顯示完一個周期后停止顯示并且釋放信號量,led任務申請到信號量后開始閃爍,閃爍了10
//次后停止,釋放信號量,lcd任務再申請信號量,繼續(xù)開始顯示,如此循環(huán)
#include"includes.h"
#include"pll.h"
#include"string.h"
#include"ser_12864.h"
#defineTASK_STK_SIZE128//定義任務堆棧長度
#defineTASK_START_PRIO5//此版本的uC/OS-II最多支持256個用戶定義任務。優(yōu)先級號越低,任務的優(yōu)先級別就越高
#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];//創(chuàng)建任務堆棧OS_STK創(chuàng)建任務參數指針TASKDATA,調用函數創(chuàng)建任務
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類型的指針存放創(chuàng)建信號量函數返回的創(chuàng)建的
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];
//定義消息指針數組
//創(chuàng)建消息隊列,首先需要定義一個指針數組(用于存放消息郵箱),然后把各個消息數據緩沖區(qū)的首地址存入這個數組中
//最后再調用函數OSQCreate()來創(chuàng)建消息隊列
#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];//內存分區(qū)
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類型的指針存放創(chuàng)建信號量函數返回的創(chuàng)建的
INT8Uerr;//定義一個錯誤信息
//12864要顯示的內容
staticunsignedchars1[]={"漢字顯示LCD"};
staticunsignedchars2[]={"MC9S12開發(fā)系統(tǒng)"};
staticunsignedchars3[]={"goodgoodstudy"};
staticunsignedchars4[]={"2012-10-17-H23木"};
//INT8Utimes_lcd=0;//記錄任務lcd的運行次數
//INT8Utimes_led=0;//任務led的運行次數
voidmain(void)
{//因為沒有外設,所以不存在硬件初始化函數
INT8Uerr;
INT16UStartdata=0x1234;//???
//開始執(zhí)行的位置另一種定義方式:TASKDATA.myPPAGE=0x1234,為結構體變量的初始化
DDRB=0xff;//B口led設為輸出
PORTB=0xff;//led初始狀態(tài)為滅
DDRA|=0x03;//液晶的兩條線
init_lcd();
pllbus_init16m();//時鐘初始化為16M
//LcdInit();//LCD初始化
OSInit();
event_sem=OSSemCreate(1);
//在主函數中創(chuàng)建信號量返回值為創(chuàng)建的信號量指針,參數是信號量的計數器的值
//用該參數對信號量計數器OSEventCnt進行初始化
//1即代表只創(chuàng)建一個信號量,代表信號量用于對共享資源的訪問(例如,把它當做二值信號量使用),詳見P166
//創(chuàng)建起始任務,作用:初始化時鐘滴答,為操作系統(tǒng)提供時鐘。初始化統(tǒng)計任務,創(chuàng)建應用任務,建立事件
OSTaskCreateExt(AppStartTask,//創(chuàng)建開始任務處于休眠態(tài)的任務經過這個函數處理后轉為就緒態(tài)
(void*)&Startdata,//???
(OS_STK*)&AppStartTaskStk[TASK_STK_SIZE-1],
TASK_START_PRIO,//優(yōu)先級為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);//統(tǒng)計任務
//#defineOS_TASK_STAT_EN1u//Enable(1)orDisable(0)thestatisticstask
//因為在本系統(tǒng)中os_cfg_r.h文件中把OS_TASK_STAT_EN設為了1(如上),所以系統(tǒng)的統(tǒng)計任務會建立
//統(tǒng)計任務的建立是在OSInit()中被創(chuàng)建的,代碼如下:
評論