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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > ucosii在stm32上的移植詳解5

          ucosii在stm32上的移植詳解5

          作者: 時間:2016-11-09 來源:網(wǎng)絡(luò) 收藏
          詳解1-4把移植過程都已經(jīng)介紹了。接下來的工作是驗(yàn)證移植是否ok以及如何基于移植好的ucosii開發(fā)應(yīng)用程序。前一個問題可以說是后一個問題的特殊情況,一般我們會創(chuàng)建兩個簡單的任務(wù),看看任務(wù)切換是否成功來驗(yàn)證移植是否ok,因?yàn)槿蝿?wù)切換可以說是ucosii最核心的功能。

          任務(wù)代碼(main.c):
          static void task1(void *p_arg)
          {
          for (;;)
          {
          led_on(LED_0);
          OSTimeDly(500);
          led_off(LED_0);
          OSTimeDly(500);
          }
          }

          本文引用地址:http://www.ex-cimer.com/article/201611/318069.htm

          static void task2(void *p_arg)
          {
          for (;;)
          {
          led_on(LED_1);
          OSTimeDly(500);
          led_off(LED_1);
          OSTimeDly(500);
          }
          }

          在startup_task()創(chuàng)建任務(wù):
          err = OSTaskCreate(task1, (void *)0,
          &task1_stk[TASK1_STK_SIZE-1], TASK1_PRIO);

          err = OSTaskCreate(task2, (void *)0,
          &task2_stk[TASK2_STK_SIZE-1], TASK2_PRIO);

          把任務(wù)的堆棧大小和優(yōu)先級寫入app_cfg.h,定義任務(wù)堆棧,編譯調(diào)試。
          在任務(wù)中打斷點(diǎn),用模擬器調(diào)試可以發(fā)現(xiàn)已經(jīng)可以做任務(wù)切換了。如果有板子,燒到板子中運(yùn)行,可以看到兩個燈會以1Hz的頻率閃爍。
          可以認(rèn)為移植初步成功,內(nèi)核其他功能有待在應(yīng)用中繼續(xù)驗(yàn)證。

          如何基于移植好的ucosii開發(fā)應(yīng)用程序呢?
          開發(fā)應(yīng)用程序大部分都是為了處理或控制一個真實(shí)的物理系統(tǒng),而真實(shí)的物理系統(tǒng)往往都是模擬系統(tǒng),為了方便計算機(jī)處理,首先需要對系統(tǒng)做離散化處理。針對ucosii,離散化過程是通過系統(tǒng)“心跳”(SysTick)來實(shí)現(xiàn)的。一般應(yīng)用程序都有多個任務(wù)(不多任務(wù)誰用ucosii?。?,任務(wù)可以分為周期任務(wù)和非周期任務(wù)。周期任務(wù)是周期性循環(huán)地處理事情的任務(wù),而非周期任務(wù)一般是某個條件觸發(fā)才執(zhí)行的任務(wù)。這里有一個問題,SysTick的時間是多少合適。SysTick的時間一般取周期性任務(wù)中周期最短的時間值。譬如說,系統(tǒng)里有3個周期性任務(wù):系統(tǒng)主任務(wù)(如處理pid等,任務(wù)周期4ms),鍵盤掃描任務(wù)(任務(wù)周期16ms),通信任務(wù)(任務(wù)周期128ms),SysTick時間就取4ms。當(dāng)然在SysTick時間較小時,要注意系統(tǒng)負(fù)荷問題,這時最好測一下cpu使用率及各個任務(wù)的時間等。

          周期性任務(wù)的開發(fā)套路是怎么樣的呢?看看定時器任務(wù)的做法就知道了,代碼在os_tmr.c。首先在OSTmr_Init()中初始化OSTmrSemSignal,然后OSTmr_Task()任務(wù)會一直等待OSTmrSemSignal,等到OSTmrSemSignal后去處理各個定時器。那么誰在釋放OSTmrSemSignal呢?OSTmrSignal(),這個函數(shù)要求放在一定頻率的時鐘中斷里,默認(rèn)是在SysTick中斷中(如果使能OS_TIME_TICK_HOOK_EN)。好了,現(xiàn)在我們可以總結(jié)總結(jié)周期性任務(wù)的一般套路了。

          首先在任務(wù)初始化函數(shù)中初始化一個信號量(一般會用信號量),偽代碼如下:
          void task_init(void)
          {
          task_sem = OSSemCreate(0);
          }

          在任務(wù)中等待信號量
          void task (void *p_arg)
          {
          for (;;)
          {
          OSSemPend(task_sem, 0, &err);

          /* TODO: task handle here */
          }
          }

          周期性的釋放信號量
          OSSemPost(task_sem);

          對于上面所說系統(tǒng)主任務(wù),OSSemPost(task_sem)可以放在SysTick_Handler()中。所以一般來說OS_CPU_SysTickHandler()改動的可能性是非常大的。

          非周期任務(wù)的開發(fā)套路又是怎樣的呢?其實(shí)和周期性任務(wù)是差不多的,只是信號量不是周期性地釋放,而是按需釋放。
          其他內(nèi)核功能就不多介紹了,大家按需使用,不是很難。

          本文代碼:http://download.csdn.net/source/3472653
          該移植代碼在我自己開發(fā)的一個小玩意上已得到一段時間的驗(yàn)證,未發(fā)現(xiàn)問題。但由于水平所限,并不敢保證該移植是沒有任何問題的,殷切希望大家批評指正。



          關(guān)鍵詞: ucosiistm32移植詳

          評論


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

          關(guān)閉
          看屁屁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); })();