uCOS II移植到STM32上的詳細步驟

2021-07-22 04:50:59 字數 2932 閱讀 3543

前言:

說點廢話,網上有很多關於ucos-ii移植的文章,好多都是千篇一律,理論性很強,分析了一大堆虛頭巴腦的東西,實操性嚴重欠缺,這方面我也走了很多彎路,下面就將自己的移植過程一步步的記錄下來,也給大家做做參考。

首先,簡單總結一下移植的大概過程:

(3)  本案例需要將uc/os-ii移植到stm32f103rct6上,而我使用的程式設計環境是mdk,很遺憾,官網上提供的案例是基於iar的,所以要基於iar的案例進行更改。

(4)  使用mdk建立乙個無作業系統的最簡單程式,確保這個程式能夠使用,這樣做的目的是為了一步步的排查錯誤,假如無作業系統時,都有錯誤,移植過程中也肯定會有編譯錯誤,那麼在排查錯誤的時候也就增加了難度,不會寫無作業系統的簡單程式怎麼辦。。。那就不要往下看了。

(5)  移植的最大的改動主要有兩部分,乙個是一些標頭檔案的增減,另外乙個就是向量表中pendsv_handler和systick_handler的修改。這裡我要吐槽一下,網上說了一大堆關於什麼os_cpu.h的更改還有各種函式的的分析,這都是扯淡。。。這些根本就不用移植者去修改,官網提供的案例都已經提供了,除非你選擇移植的cpu是比較偏的,那麼這些東西需要移植者自己去編寫。

好了,下面就開始詳細的記錄怎麼去移植。

一、  建立乙個無作業系統的簡單裸板系統

1.   建立原始檔工程資料夾,如下圖所示:

其中資料夾「core」為核心的介面,包含如下檔案:

資料夾driver為硬體驅動檔案,本程式中包含led.c和led.h檔案;

資料夾fwlib為韌體驅動資料夾,這個把stm32的韌體全都新增進去即可;

資料夾project存放工程相關檔案;

資料夾system為系統初始化資料夾,包含如下檔案:

資料夾ucosii放uc/os系統相關檔案;

資料夾user為使用者檔案,包含如下檔案:

2.使用mdk建立無作業系統工程專案,這一點就不一一說了,將建立後的工程專案檔案樹截圖如下:

然後就是專案的配置,這個還是很重要的,下面分別說需要配置的地方:

(1)output選項如下:

這裡面勾選了create hex file選項,同時將專案輸出放到了之前建立的output資料夾。

(2)list選項,將list產生的檔案放入到之前建立的list資料夾中。

(3)c/c++配置選項如下:

其中define選項中,填入:use_stdperiph_driver,stm32f10x_hd,這是告訴編譯器,使用標準外設,還有選擇的cpu型別,其中cpu型別需要根據你選擇移植的cpu進行適當的更改。include paths是要包含的標頭檔案路徑,這個為了保險,將專案中的所有有.h的檔案的資料夾都包含進去就可以了。

4.debug選項如下:

,我使用的是jlink進行燒寫除錯,所以選擇了如圖所示,還要進行settings,如下:

5.utilities選項設定如下所示:

至此,配置完畢,編譯一下,沒有錯誤,建立乙個簡單的點亮led程式,驗證一下即可。

二、  移植uc/os-ii到stm32f10x上

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,其他的,可以自己編寫,為什麼不套用另外那幾個呢,主要是因為那幾個檔案是針對官方開發板建立的任務,裡面包含的資訊量太大,編譯的時候,肯定會有大量的錯誤,因為我們是移植到我們自己的板子,所以不需要。至此,將剛剛分析的這些必須的檔案加入到上面建立的無作業系統裸板程式中,進行編譯。肯定會有很多錯誤,下面我們就一一的修改這些錯誤。新增到專案後的檔案樹,如下圖所示:

4. os_cpu_a.asm檔案的修改

首先是修改

為這樣修改的目的,是因為mdk程式設計環境不認識public,要用export.

其次是修改:

resg code:code:noroot(2)為:

這個也是因為程式設計環境的問題。

5. 修改os_dbg.c

修改:#define os_compiler_opt    __root

為:#define os_compiler_opt

,原因也是程式設計環境的問題。

6. 修改啟動**

這個步驟是移植的核心:上面說的其他的修改,都是一些附屬的格式方面的修改,而啟動**的修改才是移植的核心,這裡簡單的分析2個問題,一是,什麼叫移植,二是移植的作業系統如何能夠被我們的工程所應用。所謂移植,打乙個恰當的比喻——器官移植,就是將a的器官移植到b身上,使a的器官能夠為b所用。所以移植絕對不是簡單的「複製」,不僅要放到你的工程專案中,更重要的是要能夠和你的專案建立聯絡。那麼ucos-ii怎麼跟stm32建立聯絡呢?

ucos-ii的核心作用就是任務排程,要使用stm32的乙個特殊中斷——pendsv,就是可掛起系統任務中斷,通過該中斷進行系統的排程。還有就是ucos-ii需要乙個基準時間,那麼stm32中有乙個專用的定時器,嘀嗒定時器systick,這個定時器,就是專為作業系統而設計的,通過這個滴答定時器給ucos-ii提供乙個時間基準,每隔固定的時間出發乙個pendsv中斷,進行任務的排程。所以呢,在官方案例的移植文件an-1018中也特別提到這一點,要將startup_stm32f10x_hd.s啟動**中所有「pendsv_handler」和「systick_handler」,替換成「os_cpu_pendsvhandler」和「os_cpu_systickhandler」,這樣就相當於將ucos-ii的「神經」跟你的專案的「神經」搭在了一起。

7. 編寫os_cpu_systickhandler函式

8. 建立任務,驗證移植效果。

其中需要注意的是,在建立的第乙個任務裡,一定要先初始化嘀嗒定時器,至此移植完成,驗證成功。

stm32移植ucosII成功

osstarthang b osstarthang should never get here 現在做開發真的離不開internet啊 不然我也不可能2.5小時內搞定ucosii的移植。我的硬體版本是 stm32f103c8t6,ucos版本是ucosiiv2.86 另外給大家推薦一本學習ucosi...

ucosii在stm32上的移植詳解5

來自 詳解1 4把移植過程都已經介紹了。接下來的工作是驗證移植是否ok以及如何基於移植好的ucosii開 發應用程式。前乙個問題可以說是後乙個問題的特殊情況,一般我們會建立兩個簡單的任務,看看任務切 換是否成功來驗證移植是否ok,因為任務切換可以說是ucosii最核心的功能。任務 main.c st...

FreeRTOS 移植到STM32記錄

新建乙個不包含中文路徑的資料夾名字為freertos,如下圖所示 freertos資料夾內容如下圖所示 其中heap 4.c檔案的路徑是 freertos freertosv9.0.0 freertos source portable memmang,port.c件的路徑是 freertos fre...