新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ucosii在stm32上的移植詳解5

        ucosii在stm32上的移植詳解5

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

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

        本文引用地址:http://www.104case.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()創建任務:
        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);

        把任務的堆棧大小和優先級寫入app_cfg.h,定義任務堆棧,編譯調試。
        在任務中打斷點,用模擬器調試可以發現已經可以做任務切換了。如果有板子,燒到板子中運行,可以看到兩個燈會以1Hz的頻率閃爍。
        可以認為移植初步成功,內核其他功能有待在應用中繼續驗證。

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

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

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

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

        /* TODO: task handle here */
        }
        }

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

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

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

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



        關鍵詞: ucosiistm32移植詳

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 白沙| 彭山县| 汝城县| 新闻| 石首市| 布尔津县| 山东| 双峰县| 永宁县| 澳门| 永宁县| 安陆市| 镇雄县| 逊克县| 武冈市| 瑞昌市| 江西省| 临澧县| 合山市| 许昌县| 济宁市| 临汾市| 鞍山市| 鄂尔多斯市| 张北县| 大渡口区| 韶山市| 和林格尔县| 荔浦县| 保德县| 武胜县| 岱山县| 龙州县| 视频| 平和县| 浪卡子县| 四平市| 安溪县| 东山县| 丰顺县| 石门县|