<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

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

          OSStart();

          }

          staticvoidAppStartTask(void*pdata)

          {

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

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

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

          AppTaskCreate();//創(chuàng)建應用任務

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

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

          {

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

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

          }

          }

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

          {

          //INT8Uerr;//錯誤信息

          OSTaskCreate(lcd_task,(void*)0,&lcd_task_stk[TASK_STK_SIZE-1],6);//創(chuàng)建任務lcd_task,優(yōu)先級為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;



          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();