uCOS-II在STM32上的移植步驟
二、
1. 首先在官網(wǎng)上下載基于STM32的移植工程案例,里面的移植文檔AN-1018中是作者寫(xiě)的移植文檔,說(shuō)的很詳細,想要移植的話(huà),多看看這個(gè)文檔。
2. 其中有張圖,非常重要,其實(shí)就是告訴了移植者要做的工作,如下圖所示:

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

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

這樣修改的目的,是因為MDK編程環(huán)境不認識PUBLIC,要用EXPORT.

這個(gè)也是因為編程環(huán)境的問(wèn)題。
5. 修改OS_DBG.C
修改:

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

8. 創(chuàng )建任務(wù),驗證移植效果。

另外特別注意,官網(wǎng)代碼的創(chuàng )建的第一個(gè)開(kāi)始任務(wù)里有一段代碼,如下圖所示:

這個(gè),調用了OSStatInit()函數,這個(gè)函數的作用是啟動(dòng)統計CPU占用率的函數,這個(gè)不太清楚還有沒(méi)有其他功能,建議不要使用,因為我在使用的時(shí)候,發(fā)現,創(chuàng )建的任務(wù)都不能工作了,索性就不使用,反倒好了。
評論