• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > uCOS-II在STM32上的移植步驟

    uCOS-II在STM32上的移植步驟

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

    二、 移植uC/OS-ii到STM32F10X上
    1. 首先在官網上下載基于STM32的移植工程案例,里面的移植文檔AN-1018中是作者寫的移植文檔,說的很詳細,想要移植的話,多看看這個文檔。
    2. 其中有張圖,非常重要,其實就是告訴了移植者要做的工作,如下圖所示:

    這個圖表達了什么信息呢,其實就是告訴移植者需要將那些文件移植到你的工程當中,首先是uC/OS-ii的源文件,就是OS_CORE.C、OS_FLAG.C.....ucos_ii.H這些文件,其實是uC/OS-ii的Port文件,包括4個,分別是OS_CPU_C.C,OS_CPU_A.ASM,OS_CPU.H,OS_DBG.C,還有是用戶應用程序里的包含文件,這個里面不能照搬,選擇使用兩個文件,分別為OS_CFG.H和INCLUDES.H,其他三個,可以自己編寫,為什么不套用另外那三個呢,主要是因為那三個文件是針對官方開發板創建的任務,里面包含的信息量太大,編譯的時候,肯定會有大量的錯誤(因為我們是一直到我們自己的板子),所以最好自己寫最簡單的,至于怎么寫,后面再詳細說,可以先建2個空文件,分別是APP.C和APP_CFG.H,這兩個文件的含義很簡單,APP是自己的應用程序C文件,APP_CFG.H是對我們自己的應用程序做的配置文件,看到這里可能會有個疑問,APP_VECT.C文件怎么處理呢,答案是舍棄,因為官方提供的案例是自己寫啟動文件,APP_VECT.C文件是向量表,我們使用的是STM32固件庫里的啟動代碼,所以就不用使用了。BSP部分有兩個文件BSP.C和BSP.H,這個也建議直接舍棄,這個是官方文檔中針對他們的的開發板寫的一些底層的設備驅動,我們自己的開發板跟他們的不同,所以根本就沒必要要,至此,將剛剛分析的這些必須的文件加入到上面創建的無操作系統裸板程序中,進行編譯??隙〞泻芏噱e誤,下面我們就一一的修改這些錯誤。添加到項目后的文件樹,如下圖所示:

    需要注意的是,這其中的app.c和app_cfg.h是自己創建的空的文件,而不是使用官網案例里提供的,如果非要使用官網里面的,那么只能不停的更正其中的錯誤啦。下面就是要修改錯誤的過程了。
    3. 修改os_cfg.h 這個是配置uCOS-ii系統功能的頭文件,根據自己的需要進行裁剪任務吧,我只做了一個修改,就是:
    #define OS_APP_HOOKS_EN 0
    ,禁用鉤子函數,這是為了防止出現那些所謂的文檔中分析的要寫的那幾個鉤子函數出現錯誤,禁用鉤子函數了,也就不用寫鉤子函數了,其他的根據自己需要裁減吧。
    4. OS_CPU_A.ASM文件的修改
    首先是修改

    這樣修改的目的,是因為MDK編程環境不認識PUBLIC,要用EXPORT.
    其次是修改:

    這個也是因為編程環境的問題。
    5. 修改OS_DBG.C
    修改:是編程環境的問題。
    6. 修改啟動代碼
    這個步驟是移植的核心:上面說的其他的修改,都是一些附屬的格式方面的修改,而啟動代碼的修改才是移植的核心,這里簡單的分析2個問題,一是,什么叫移植,二是移植的操作系統如何能夠被我們的工程所應用。所謂移植,打一個恰當的比喻——器官移植,就是將A的器官移植到B身上,使A的器官能夠為B所用。所以移植絕對不是簡單的“復制”,不僅要放到你的工程項目中,更重要的是要能夠和你的項目建立聯系。那么uCOS-ii怎么跟STM32建立聯系呢?
    uCOS-ii的核心作用就是任務調度,要使用STM32的一個特殊中斷——PendSV,就是可掛起系統任務中斷,通過該中斷進行系統的調度。還有就是uCOS-ii需要一個基準時間,那么STM32中有一個專用的定時器,嘀嗒定時器SysTick,這個定時器,就是專為操作系統而設計的,通過這個滴答定時器給uCOS-ii提供一個時間基準,每隔固定的時間出發一個PendSV中斷,進行任務的調度。所以呢,在官方案例的移植文檔AN-1018中也特別提到這一點,要將啟動代碼中所有“PendSV_Handler”和“SysTick_Handler”,替換成“OS_CPU_PendSVHandler”和“OS_CPU_SysTickHandler”,這樣就相當于將uCOS-ii的“神經”跟你的項目的“神經”搭在了一起。
    7. 此時編譯,發現還有一個錯誤:
    未定義 OS_TASK_TMR_PRIO
    在uCOS-ii源碼中查找OS_TASK_TMR_PRIO定義,原來這個定義在源碼文件app_cfg.h中,如下所示:

    比葫蘆畫瓢,復制到自己創建的那個空白app_cfg.h中。然后編譯,發現已經還有的錯誤就是在includes.h中,說沒有包含一些的頭文件,這個把includes.h中對應錯誤的那些包含頭文件代碼刪掉即可,這是因為我們沒有完全的使用官方案例中的所有文件。至此移植的修改工作告一段落,已經完成。
    8. 創建任務,驗證移植效果。
    這個可以參照源代碼中APP.C進行創建任務,在app_cfg.h中編寫各個任務的配置文件,這里需要注意的是,我們之前創建的裸板中已經有main.c文件,其中已經有main.c函數,所以我們在app.c中就不必再創建main函數了,直接在main函數中初始化uCOS-ii,然后創建一個任務,或者調用一個函數,在這個任務或者函數中再創建需要的幾個任務即可。案例如下圖所示:

    其中需要注意的是,在創建的第一個任務里,一定要先初始化嘀嗒定時器,這個是仿照官方案例中的代碼格式寫的,直接使用OS_CPU_SysTickInit(),可能在編譯的時候,會發現這個嘀嗒定時器初始化啟動函數有報錯,這個一般是沒有包含這個函數中調用的函數,或者直接沒有,那么在源代碼中搜索這個函數,比葫蘆畫瓢照抄寫就行啦。
    另外特別注意,官網代碼的創建的第一個開始任務里有一段代碼,如下圖所示:

    這個,調用了OSStatInit()函數,這個函數的作用是啟動統計CPU占用率的函數,這個不太清楚還有沒有其他功能,建議不要使用,因為我在使用的時候,發現,創建的任務都不能工作了,索性就不使用,反倒好了。

    上一頁 1 2 下一頁

    關鍵詞: uCOS-IISTM32移植步

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 昌平区| 锡林浩特市| 赣州市| 常德市| 郑州市| 环江| 青海省| 炎陵县| 富蕴县| 麻城市| 常德市| 桂东县| 德清县| 宜川县| 白玉县| 丰镇市| 钦州市| 安福县| 古蔺县| 思茅市| 玉树县| 连城县| 吐鲁番市| 广汉市| 阳泉市| 仪征市| 六枝特区| 科尔| 阳东县| 涞水县| 闸北区| 长海县| 饶河县| 东源县| 长治县| 监利县| 云阳县| 沂源县| 海兴县| 韩城市| 湟中县|