新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ucos-ii學習筆記——s12 lcd led 兩任務信號量通信

        ucos-ii學習筆記——s12 lcd led 兩任務信號量通信

        作者: 時間:2016-11-28 來源:網絡 收藏
        Createdon:2012-10-17

        Author:zhangbin

        本文引用地址:http://www.104case.com/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()中被創建的,代碼如下:


        上一頁 1 2 3 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 木兰县| 任丘市| 儋州市| 尉犁县| 安塞县| 西畴县| 靖安县| 澎湖县| 合肥市| 额敏县| 塔河县| 湘潭县| 云安县| 贵港市| 治多县| 高台县| 格尔木市| 康保县| 清徐县| 朝阳区| 鹤庆县| 花垣县| 上高县| 长治县| 泾川县| 湘潭市| 怀来县| 武山县| 泸水县| 东港市| 黄龙县| 抚顺市| 瓮安县| 商都县| 商水县| 梁河县| 新巴尔虎左旗| 栖霞市| 扎囊县| 射阳县| 监利县|