UCOS2_STM32F1移植詳細過程(三)


Ⅰ、概述

上一篇文章是講述ST芯片相關的配置和OS裁剪相關的配置,接着上一篇文章來講述關於UCOS的移植,該文主要針對uC/OS-II Ports下面os_cpu_a.asm、os_cpu_c.c和os_cpu.h文件底層端口代碼來講述。

請下載“UCOS2_STM32F1_3個簡單任務”作為參考工程。

 

筆者將“UCOS移植詳細過程”分為多篇文章來講述,敬請關注。

關於本文的詳情請往下看(微信請點擊“閱讀原文”查看內容鏈接內容)。

 

本着免費分享的原則,方便大家手機學習知識,定期在微信平台分享技術知識。如果你覺得分享的內容對你有用,又想了解更多相關的文章,請用微信搜索“EmbeddDeveloper” 或者掃描下面二維碼、關注,將有更多精彩內容等着你。

 

Ⅱ、下載

筆者將F0、F1、F3、F4移植到最新UCOS2.92上。移植好的、獨立的4個工程供大家下載學習、研究。建立的任務都是一樣的,只是針對芯片不同,Ports目錄下相關的源代碼有差異、標准外設庫也存在差異。每一個系列針對不同型號芯片只需要適當改一下“型號”就行了。

提供下載的軟件工程都是在板子上運行,保證沒問題才上傳至360雲盤。

UCOS基於STM32F0系列實例:

https://yunpan.cn/cRCZrQ3dzeVQq  訪問密碼

 

UCOS基於STM32F1系列實例:

https://yunpan.cn/cRCZxGFsqHa6Q  訪問密碼

 

UCOS基於STM32F3系列實例:

https://yunpan.cn/cRCZqPRCWs8UW  訪問密碼

 

UCOS基於STM32F4系列實例:

https://yunpan.cn/cRCZPqbFqXSPR  訪問密碼

 

UCOS源代碼工程

官網下載(需要賬號):

https://www.micrium.com/downloadcenter/download-results/?searchterm=hm-stmicroelectronics&supported=true

 

360雲盤下載(定期更新至最新):

https://yunpan.cn/cRzcf8eSacEhE  訪問密碼 1235

 

ST標准外設庫

官網下載(需要賬號):

http://www.st.com/content/st_com/en/products/embedded-software/mcus-embedded-software/stm32-embedded-software.html?querycriteria=productId=SC961

 

360雲盤下載(定期更新至最新):

https://yunpan.cn/cSaCpGejMSfr8  訪問密碼 60ae

 

參考資料:

https://yunpan.cn/cRCdSt73GwT6j  訪問密碼 499e

 

Ⅲ、工程目錄結構說明

文件結構和工程目錄結構對應關系如上圖所示。

 

第一類(標准外設庫):

Startup Code:啟動代碼

STM32F10x_StdPeriph_Driver:標准外設庫庫驅動

CMSIS:標准接口

 

第二類(µC/OS-II實時內核):

uC/OS-II Source:內核源代碼(與處理器無關)

uC/OS-II Ports:OS端口底層代碼(與處理器、編譯平台有關)

 

第三類(用戶應用):

Bsp:應用底層代碼(初始化、驅動等)

App:應用實現代碼(配置OS、應用等)

 

該文主要針對uC/OS-II Ports進行移植描述。我們不使用UCOS自帶的調試功能,這里就不再描述(使用)os_dbg.c文件。

 

Ⅳ、配置os_cpu_a.asm文件

os_cpu_a.asm文件位於工程uC/OS-II Ports結構下面,主要是系統底層相關的一部分匯編代碼。

該文件主要對外部引用(全局變量、函數)做了一個申明,及部分系統相關源代碼(匯編)做了一個定義。

下面我將定義的幾個源代碼做一個描述,移植過程需要修改的我會重點提示出來。

 

1.全局申明

該文件開頭對全局變量和函數進行了一次聲明,只是使用的匯編,就如C語言里面的extern。

上面部分是外部(其他源文件)定義的變量和函數,下面部分是申明本文件定義的函數,下面我會對這定義的源代碼進行講述。

將OS_CPU_PendSVHandler改為PendSV_Handler,為了兼容ST標准外設庫啟動代碼(startup_stm32f10x_hd.s)。

 

2.NVIC配置

這部分是對NVIC(中斷控制)寄存器相關進行定義,就如預處理中宏定義一樣,對寄存器地址,狀態進行定義。

 

3.代碼生成指令

這幾條指令主要是針對匯編指令的一個處理。

 

4.狀態保存與恢復

這兩個匯編函數是程序運行在臨界區,對數據的保存和恢復的函數。主要作用就是保護數據不被破壞。

 

5.運行最高優先級任務

這個函數在任務切換的時候調用,知道任務切換原來的朋友來說這里不難理解。UCOS是按優先級來執行任務,優先級越高(優先級數值越小),越容易被執行。當執行的任務處於掛起(或刪除)時,系統就需要進行任務切換,切換的規則就是切換到最高優先級去執行。

 

6.上下文切換

系統切換任務可以從兩個地方,也就是從任務級和中斷級。這兩個函數的意思都一樣,當需要執行任務切換時,根據條件執行某一個。

 

7.PendSV_Handler中斷

PendSV_Handler中斷函數定義於這里,主要是在執行該中斷對M3內核寄存器進行一些操作(保存與修改)。

將OS_CPU_PendSVHandler改為PendSV_Handler,為了兼容ST標准外設庫啟動代碼(startup_stm32f10x_hd.s)。

 

8.總結os_cpu_a.asm

對於UCOS的移植,os_cpu_a.asm文件主要就是修改OS_CPU_PendSVHandler的名稱,包含申明時的名稱和定義源代碼時的名稱,其他源代碼保持不變。

 

Ⅴ、配置os_cpu_c.c文件

os_cpu_c.c文件位於工程uC/OS-II Ports結構下面,主要是系統底層相關的一部分C語言接口代碼。

該文件有許多HOOK函數,也就是所謂的鈎子函數,主要用於系統初始化、與任務相關等,如:系統初始化時OSInitHookBegin()、OSInitHookEnd(); 創建任務時OSTaskCreateHook等。其實我們自己移植,有很多HOOK函數是不需要使用,或者不用去實現函數體里面的代碼。下面我將講述幾個重要的函數,有些不重要的HOOK函數不再講述。

下面我將定義的幾個源代碼做一個描述,移植過程需要修改的我會重點提示出來。

 

1.系統滴答

 這些都是關於SysTick系統滴答的宏定義和函數體,由於我們使用M3標准(ST庫里面有)的SysTick系統滴答函數接口,我們屏蔽掉os_cpu_c.c里面SysTick相關的定義。

 

2.OSInitHookBegin

這個函數被OSInit()開頭調用,也就是我們main函數開始調用OSInit()就會調用它。

注意:

#if OS_CPU_HOOKS_EN > 0u

也就是需要在os_cfg.h文件里面配置OS_CPU_HOOKS_EN>0.

 

3.OSTaskStkInit初始化任務堆棧

這個函數比較重要,在創建任務的時候調用它。主要是對芯片內核寄存器進行一個配置,並現場保護數據。這個函數根據芯片內核不同,也存在很大不同。

 

 

Ⅶ、配置os_cpu.h文件

os_cpu.h文件位於工程uC/OS-II Ports結構下面,主要是系統底層相關的某些定義(堆棧、數據類型)、申明(函數)等。

該文件下面源代碼比較簡單,有些不使用,即移植過程需要修改的我會重點提示出來。

 

1.OS數據類型

這部分是為系統定義相關的數據類型,這里不用修改。

 

2.臨界區管理

我們使用默認使用臨界區第3模式,這個定義主要是與os_cpu_a.asm文件中定義OS_CPU_SR_Save()函數有關。

 

3.函數申明

函數申明比較簡單,這里有幾個函數我們在os_cpu_a.asm和os_cpu_c.c文件中都屏蔽掉了的,這里也將他們屏蔽掉。

 

Ⅷ、說明

相關的文章可以到我博客上查看,我也會定期更新,新內容第一時間在微信分享。

當你掌握UCOS在一種平台上的移植,其他平台移植原理類似,請不要局限某一平台。

以上總結僅供參考,若有不對之處,敬請諒解。

 

Ⅸ、最后

關注微信,回復“更多內容”,將獲得更多內容(如:UCOS實例等,不斷更新中......)。

如果你喜歡我分享的內容,你又想了解更多相關內容,請關注文章開頭的微信公眾號,新內容持續更新中,后期將會有更多精彩內容出現。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM