新聞中心

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

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

        作者: 時間:2016-11-28 來源:網絡 收藏

        OSStart();

        }

        staticvoidAppStartTask(void*pdata)

        {

        pdata=pdata;//pdata沒有用到,這樣的目的是防止編譯器提出warning

        AppTickInit();//初始化時鐘滴答,為操作系統提供時鐘

        OSStatInit();//初始化統計任務

        AppTaskCreate();//創建應用任務

        //AppEventCreate();//建立事件

        while(TRUE)//任務一般都是一個無限循環的結構

        {

        OSTimeDlyHMSM(0,0,1,0);//等待1s,交出cpu,由于while無限循環中只有這一條語句,所以

        //該起始任務第一次運行以后,就一直處于掛起等待狀態

        }

        }

        staticvoidAppTaskCreate(void)//使1-f的任務處于就緒態,一旦OSstart(),優先級最高的任務獲得CPU的使用權

        {

        //INT8Uerr;//錯誤信息

        OSTaskCreate(lcd_task,(void*)0,&lcd_task_stk[TASK_STK_SIZE-1],6);//創建任務lcd_task,優先級為6

        OSTaskCreate(led_task,(void*)0,&led_task_stk[TASK_STK_SIZE-1],7);

        }

        staticvoidAppEventCreate(void)

        {

        INT8Uerr;

        #ifOS_SEM_EN>0

        EventSem1=OSSemCreate(1);

        OSEventNameSet(EventSem1,"Sem.#1",&err);

        EventSem2=OSSemCreate(1);

        OSEventNameSet(EventSem2,"Sem.#2",&err);

        #endif

        #ifOS_MBOX_EN>0

        EventMbox1=OSMboxCreate((void*)1);

        OSEventNameSet(EventMbox1,"Mailbox#1",&err);

        EventMbox2=OSMboxCreate((void*)1);

        OSEventNameSet(EventMbox2,"Mailbox#2",&err);

        #endif

        #ifOS_Q_EN>0

        EventQ1=OSQCreate(&EventQTbl1[0],EVENT_Q_1_SIZE);

        OSEventNameSet(EventQ1,"Queue#1",&err);

        EventQ2=OSQCreate(&EventQTbl2[0],EVENT_Q_2_SIZE);

        OSEventNameSet(EventQ2,"Queue#2",&err);

        #endif

        #ifOS_MUTEX_EN>0

        EventMutex1=OSMutexCreate(MUTEX_PIP_1,&err);

        OSEventNameSet(EventMutex1,"Mutex#1",&err);

        EventMutex2=OSMutexCreate(MUTEX_PIP_2,&err);

        OSEventNameSet(EventMutex2,"Mutex#2",&err);

        #endif

        #ifOS_FLAG_EN>0

        FlagGrp1=OSFlagCreate(0x00FF,&err);

        OSFlagNameSet(FlagGrp1,"Flag#1",&err);

        FlagGrp2=OSFlagCreate(0xFF00,&err);

        OSFlagNameSet(FlagGrp2,"Flag#2",&err);

        #endif

        #ifOS_MEM_EN>0

        MemPart1=OSMemCreate(&MemPart1Tbl[0],MEM_BLKS_1,MEM_BLK_SIZE_1,&err);

        OSMemNameSet(MemPart1,"Partition#1",&err);

        MemPart2=OSMemCreate(&MemPart2Tbl[0],MEM_BLKS_2,MEM_BLK_SIZE_2,&err);

        OSMemNameSet(MemPart2,"Partition#2",&err);

        #endif

        }

        staticvoidlcd_task(void*pdata)//任務lcd_task的函數代碼

        {

        pdata=pdata;//pdata沒有用到,這樣的目的是防止編譯器提出warning

        for(;;)

        {

        OSSemPend(event_sem,0,&err);

        //請求信號量參數Fun_Semp是信號量指針0那一項是等待時限timeout,0表示無限等待err表示錯誤信息

        delay_ms(5);

        wr_string(0,0,s1);//第一行第一個位置顯示s1

        delay_ms(1000);

        wr_string(0,1,s2);//第一行第一個位置顯示s2

        delay_ms(1000);

        wr_string(0,2,s3);//第一行第一個位置顯示s3

        delay_ms(1000);

        wr_string(0,3,s4);//第一行第一個位置顯示s4

        delay_ms(1000);

        wr_lcd(comm,0x01);//清除顯示全屏清除

        //init_lcd();

        OSSemPost(event_sem);//釋放信號量

        OSTimeDlyHMSM(0,0,1,0);//等待1s,交出cpu,任務調度一次防止獨占cpu,讓其他任務有機會運行

        }

        }

        staticvoidled_task(void*pdata)

        {

        INT8Ui=0;

        pdata=pdata;//pdata沒有用到,這樣的目的是防止編譯器提出warning

        for(;;)

        {

        OSSemPend(event_sem,0,&err);//請求信號量

        for(i=0;i<10;i++)//閃爍10次

        {

        PORTB=0x00;//led閃爍

        delay_ms(500);

        PORTB=0xff;

        delay_ms(500);

        }

        OSSemPost(event_sem);//釋放信號量

        OSTimeDlyHMSM(0,0,0,500);//等待0.5s交出cpu

        }

        }

        //問什么當兩個任務等待時間相同時(都為1s時),任務lcd每運行兩次,任務led才運行一次,當等待時間不同時,

        //才交替運行(任務led的等待時間小于lcd時才正常交替運行)

        //該問題要參考ucos-iifors12mytest工程的任務調度等待時間的問題,一塊解決

        staticvoidAppTask1(void*pdata)

        {

        pdata=pdata;

        for(;;)

        {

        Flash_Led(7,1);

        OSTimeDlyHMSM(0,0,1,0);

        }

        }

        staticvoidAppTask2(void*pdata)

        {

        pdata=pdata;

        LcdClear();

        for(;;)

        {

        LcdWriteStr(0,0,"illworkhard");

        OSTimeDlyHMSM(0,0,1,0);

        LcdClear();

        LcdWriteStr(0,0,"ificangetthechance");

        LcdWriteStr(1,0,"ipromisetoyou");

        OSTimeDlyHMSM(0,0,1,0);

        LcdClear();

        }

        }

        staticvoidAppTask3(void*pdata)

        {

        pdata=pdata;

        PWM_Init();//pwm初始化,將23通道級聯

        LcdClear();

        DDRT=0x00;//將PORTT設置為輸入

        for(;;)

        {

        LcdWriteStr(0,0,"welcometeacher!");

        PWM_Init();

        PWMDuo_Dutycycle(100);

        OSTimeDlyHMSM(0,0,1,0);

        Close_PWM();

        LcdClear();

        OSTimeDlyHMSM(0,0,0,500);

        }

        }

        staticvoidAppTask4(void*pdata)

        {

        INT8Uerr;

        }

        staticvoidAppTask5(void*pdata)

        {

        INT8Uerr;

        DDRB_DDRB3=1;

        pdata=pdata;

        while(TRUE){

        AppTask5Ctr++;

        #ifOS_Q_EN>0

        OSQPost(EventQ1,(void*)"Msg#3toQ1");

        OSTimeDly(20);

        OSQPost(EventQ2,(void*)"Msg#4toQ2");

        #endif

        OSTimeDly(40);

        PORTB_PB3=~PORTB_PB3;

        }

        }

        staticvoidAppTask6(void*pdata)

        {

        INT8Uerr;

        char*pmsg;

        chars[30];

        pdata=pdata;

        while(TRUE){

        AppTask6Ctr++;

        #ifOS_Q_EN>0

        pmsg=(char*)OSQPend(EventQ1,0,&err);

        strcpy(s,pmsg);

        #endif

        OSTimeDly(1);

        }

        }

        staticvoidAppTask7(void*pdata)

        {

        INT8Uerr;

        char*pmsg;

        chars[30];

        pdata=pdata;

        while(TRUE){

        AppTask7Ctr++;

        #ifOS_Q_EN>0

        pmsg=(char*)OSQPend(EventQ2,0,&err);

        strcpy(s,pmsg);

        #endif

        OSTimeDly(1);

        }

        }

        staticvoidAppTask8(void*pdata)

        {

        INT8Uerr;

        pdata=pdata;

        while(TRUE){

        AppTask8Ctr++;

        #ifOS_FLAG_EN>0

        OSFlagPost(FlagGrp1,0x000F,OS_FLAG_SET,&err);

        OSTimeDly(100);

        OSFlagPost(FlagGrp1,0x00F0,OS_FLAG_SET,&err);

        OSTimeDly(100);

        OSFlagPost(FlagGrp1,0x0F00,OS_FLAG_SET,&err);

        OSTimeDly(100);

        OSFlagPost(FlagGrp1,0xF000,OS_FLAG_SET,&err);

        OSTimeDly(100);

        #endif

        OSTimeDly(1);

        }

        }

        staticvoidAppTask9(void*pdata)

        {

        INT8Uerr;

        pdata=pdata;

        while(TRUE){

        AppTask9Ctr++;

        #ifOS_FLAG_EN>0

        OSFlagPend(FlagGrp1,0x00FF,OS_FLAG_WAIT_SET_ALL+OS_FLAG_CONSUME,100,&err);

        #endif

        OSTimeDly(100);

        }

        }

        staticvoidAppTaskA(void*pdata)

        {

        INT8Uerr;



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 资阳市| 化州市| 望奎县| 介休市| 大方县| 永和县| 遵义县| 舒城县| 永仁县| 马公市| 南通市| 拜泉县| 扶风县| 昌都县| 台中县| 土默特左旗| 遂平县| 淮阳县| 民县| 舒城县| 都安| 屏山县| 阳山县| 乐安县| 锦州市| 磴口县| 蛟河市| 广宗县| 洪洞县| 宾阳县| 临洮县| 浮山县| 东山县| 长乐市| 绵竹市| 道真| 洛阳市| 津市市| 大理市| 黎平县| 天峻县|