新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > ucos-ii學(xué)習筆記——s12 lcd led 兩任務(wù)信號量通信

ucos-ii學(xué)習筆記——s12 lcd led 兩任務(wù)信號量通信

作者: 時間:2016-11-28 來源:網(wǎng)絡(luò) 收藏
Createdon:2012-10-17

Author:zhangbin

本文引用地址:http://2s4d.com/article/201611/322856.htm

學(xué)習筆記

forucos-iiMC9S12XS128lcd12864ser_2_pin

redesignedbyzhangbin

2012-10-17

versions:V-0.1

AllRightsReserved

//本程序?qū)崿F(xiàn)lcd的顯示和led的閃爍,這兩個任務(wù)通過信號量進行通信,要實現(xiàn)的效果如下:

//lcd任務(wù)申請一個信號量后顯示完一個周期后停止顯示并且釋放信號量,led任務(wù)申請到信號量后開始閃爍,閃爍了10

//次后停止,釋放信號量,lcd任務(wù)再申請信號量,繼續(xù)開始顯示,如此循環(huán)

//本程序?qū)崿F(xiàn)lcd的顯示和led的閃爍,這兩個任務(wù)通過信號量進行通信,要實現(xiàn)的效果如下:

//lcd任務(wù)申請一個信號量后顯示完一個周期后停止顯示并且釋放信號量,led任務(wù)申請到信號量后開始閃爍,閃爍了10

//次后停止,釋放信號量,lcd任務(wù)再申請信號量,繼續(xù)開始顯示,如此循環(huán)

#include"includes.h"

#include"pll.h"

#include"string.h"

#include"ser_12864.h"

#defineTASK_STK_SIZE128//定義任務(wù)堆棧長度

#defineTASK_START_PRIO5//此版本的uC/OS-II最多支持256個用戶定義任務(wù)。優(yōu)先級號越低,任務(wù)的優(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];//定義任務(wù)堆棧

OS_STKled_task_stk[TASK_STK_SIZE];

OS_STKAppStartTaskStk[TASK_STK_SIZE];//創(chuàng)建任務(wù)堆棧OS_STK創(chuàng)建任務(wù)參數(shù)指針TASKDATA,調(diào)用函數(shù)創(chuàng)建任務(wù)

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)建信號量函數(shù)返回的創(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];

//定義消息指針數(shù)組

//創(chuàng)建消息隊列,首先需要定義一個指針數(shù)組(用于存放消息郵箱),然后把各個消息數(shù)據(jù)緩沖區(qū)的首地址存入這個數(shù)組中

//最后再調(diào)用函數(shù)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;//聲明內(nèi)存塊是內(nèi)存控制塊OS_MEM類型的指針

OS_MEM*MemPart2;

INT8UMemPart1Tbl[MEM_BLKS_1][MEM_BLK_SIZE_1];//內(nèi)存分區(qū)

INT8UMemPart2Tbl[MEM_BLKS_2][MEM_BLK_SIZE_2];

#endif

//任務(wù)的函數(shù)聲明

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)建信號量函數(shù)返回的創(chuàng)建的

INT8Uerr;//定義一個錯誤信息

//12864要顯示的內(nèi)容

staticunsignedchars1[]={"漢字顯示LCD"};

staticunsignedchars2[]={"MC9S12開發(fā)系統(tǒng)"};

staticunsignedchars3[]={"goodgoodstudy"};

staticunsignedchars4[]={"2012-10-17-H23木"};

//INT8Utimes_lcd=0;//記錄任務(wù)lcd的運行次數(shù)

//INT8Utimes_led=0;//任務(wù)led的運行次數(shù)

voidmain(void)

{//因為沒有外設(shè),所以不存在硬件初始化函數(shù)

INT8Uerr;

INT16UStartdata=0x1234;//???

//開始執(zhí)行的位置另一種定義方式:TASKDATA.myPPAGE=0x1234,為結(jié)構(gòu)體變量的初始化

DDRB=0xff;//B口led設(shè)為輸出

PORTB=0xff;//led初始狀態(tài)為滅

DDRA|=0x03;//液晶的兩條線

init_lcd();

pllbus_init16m();//時鐘初始化為16M

//LcdInit();//LCD初始化

OSInit();

event_sem=OSSemCreate(1);

//在主函數(shù)中創(chuàng)建信號量返回值為創(chuàng)建的信號量指針,參數(shù)是信號量的計數(shù)器的值

//用該參數(shù)對信號量計數(shù)器OSEventCnt進行初始化

//1即代表只創(chuàng)建一個信號量,代表信號量用于對共享資源的訪問(例如,把它當做二值信號量使用),詳見P166

//創(chuàng)建起始任務(wù),作用:初始化時鐘滴答,為操作系統(tǒng)提供時鐘。初始化統(tǒng)計任務(wù),創(chuàng)建應(yīng)用任務(wù),建立事件

OSTaskCreateExt(AppStartTask,//創(chuàng)建開始任務(wù)處于休眠態(tài)的任務(wù)經(jīng)過這個函數(shù)處理后轉(zhuǎn)為就緒態(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);

//該函數(shù)參數(shù)的具體介紹見P121

OSTaskNameSet(TASK_START_PRIO,"StartTask",&err);//設(shè)置任務(wù)的名稱作用??

OSTaskNameSet(OS_TASK_IDLE_PRIO,"uC/OS-IIIdle",&err);//空閑任務(wù)

OSTaskNameSet(OS_TASK_STAT_PRIO,"uC/OS-IIStat",&err);//統(tǒng)計任務(wù)

//#defineOS_TASK_STAT_EN1u//Enable(1)orDisable(0)thestatisticstask

//因為在本系統(tǒng)中os_cfg_r.h文件中把OS_TASK_STAT_EN設(shè)為了1(如上),所以系統(tǒng)的統(tǒng)計任務(wù)會建立

//統(tǒng)計任務(wù)的建立是在OSInit()中被創(chuàng)建的,代碼如下:


上一頁 1 2 3 下一頁

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉