前言
很多同學都問過這個問題,移植RTOS到一個開發(fā)板上,難么?需要學習哪些知識? 從我學習國內(nèi)常見的RTOS,以及一些構(gòu)建系統(tǒng)的經(jīng)驗上看。真正要做移植的工作,需要的知識范圍還是非常廣泛的。
1. 理解這個RTOS的系統(tǒng)源碼目錄組成,源碼層級結(jié)構(gòu)(需要知道廠家SDK放哪里,系統(tǒng)層的Driver驅(qū)動,板級配置目錄,工程模板目錄)
2. 理解構(gòu)建系統(tǒng)(需要知道對應(yīng)的RTOS所使用的構(gòu)建系統(tǒng)相關(guān)配置,清楚板級的宏定義開關(guān)在哪里設(shè)置,RTOS配置,以及c文件和h文件如何添加)
3. 理解RTOS的啟動流程(萬一移植后編譯成功,但是無法運行系統(tǒng)時,要清楚如何調(diào)試,找到問題點)
4. 理解所移植的MCU的系統(tǒng)時鐘配置,外設(shè)配置等等內(nèi)容
5. 理解RTOS的系統(tǒng)調(diào)度和內(nèi)存管理(萬一無法運行系統(tǒng),不清楚這些就不能調(diào)試)
6. 熟悉調(diào)試工具(不管是什么IDE,什么link,都需要熟悉至少一種自己常用的)
個人覺得,移植RTOS其實是一個非常嚴謹?shù)墓ぷ鳎枰闹R除了上面列舉的這些,當然越多越好。有興趣移植的話,建議先把調(diào)試工具,RTOS的系統(tǒng)調(diào)度、內(nèi)存管理和啟動流程先給熟悉了,否則一旦碰到問題就不知道自己錯在哪里。
為什么我要先過一遍OneOS的啟動流程
首先我對RTOS的基礎(chǔ)知識還是有一些的,其次也比較熟悉OneOS的目錄結(jié)構(gòu)和系統(tǒng)結(jié)構(gòu),對構(gòu)建系統(tǒng)也稍微有一些了解(非常不喜歡Scons,但是沒辦法,OneOS沒有別的構(gòu)建方式)。 由于長期沒有玩OneOS,對OneOS的啟動流程有點生疏了,為了快速梳理一遍啟動的相關(guān)流程和細節(jié),我找到了AliOS-Things的DeveloperKit開發(fā)板。這是一塊stm32l496的開發(fā)板,目前OneOS的支持也挺好的,串口、SPI屏幕,GPIO等外設(shè)都支持得很好了。代碼量相對來說也是比較少的,所以選用這一塊開發(fā)板作為熟悉啟動流程的板子。點亮圖片如下:

準備工作
一、安裝編譯工具鏈: 下載gcc-arm-none-eabi工具鏈(arm官網(wǎng)有,自己喜歡哪個版本就下哪個),并安裝。
二、安裝OpenOCD(需要配置好PATH環(huán)境變量)和VSCode(隨便裝裝就行,插件只需要Cortex-Debu),網(wǎng)上已經(jīng)有教程了,不再累贅。
三、下載源碼和編譯 到gitee上克隆OneOS源碼,然后打開OneOS源碼目錄(git clone下來的),切換到v2.3.0版本,并打開根目錄下projects目錄,按教程生成stm32l496-ali-developerkit模板的工程,并編譯好。
開始調(diào)試
我用的是VSCode,要調(diào)試嵌入式設(shè)備,僅僅需要安裝Cortex-Debug這個插件就可以開始調(diào)試了(編譯工具鏈和OpenOCD需要提前安裝和配置好)。按下圖的順序創(chuàng)建launch.json調(diào)試配置文件。
1. 創(chuàng)建launch.json文件:

2. 選擇Cortex Debug調(diào)試器

3. 在打開的launch.json文件編輯中,將文件內(nèi)容替換成以下內(nèi)容。
{
// 使用 IntelliSense 了解相關(guān)屬性。
// 懸停以查看現(xiàn)有屬性的描述。
// 欲了解更多信息,請訪問: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Cortex Debug",
"cwd": "${workspaceFolder}/build", // 調(diào)試時的工作目錄應(yīng)和編譯目錄一致,否則在調(diào)試中會定位不到源碼
"executable": "${workspaceFolder}/out/oneos.elf", // 修改成編譯生成的elf文件路徑
"request": "launch",
"type": "cortex-debug",
"runToEntryPoint": "Reset_Handler", // 入口點改成stm32的復(fù)位入口函數(shù)
"servertype": "openocd", // GDB Server修改成openocd
"configFiles": [
"interface/stlink.cfg", // 使用板載stlink
"target/stm32l4x.cfg" // 調(diào)試目標為stm32l4x
]
}
]
}
進入調(diào)試狀態(tài)
點擊綠色的小三角開始調(diào)試,30秒左右就正式進入調(diào)試狀態(tài)了如下圖。

在這里,我們先不著急執(zhí)行程序,往下拉到110行,會發(fā)現(xiàn)程序入口點被修改成了entry,如下圖:

注意:很多RTOS都會修改啟動文件,替換程序入口點。因為需要在用戶應(yīng)用調(diào)用之前,先初始化RTOS的相關(guān)內(nèi)容。對于用戶來說,這些初始化的東西在大部分的時候是不需要關(guān)注的(寫應(yīng)用時重點關(guān)注應(yīng)用邏輯,外設(shè)初始化、操作系統(tǒng)初始化這些是移植時就要完善好的)。假如是一款全新的芯片(源碼中找不到類似或者已有的芯片支持和啟動文件的)要移植進來,需要關(guān)注入口點,否則就算編譯通過了,也沒辦法正常啟動系統(tǒng)。
OneOS啟動流程學習
當我們跟著entry函數(shù),會發(fā)現(xiàn)它實際上調(diào)用的是_k_startup函數(shù),如下圖:

真正的啟動流程_k_startup函數(shù)
然后在_k_startup函數(shù)中,有不同功能的函數(shù),大致如下圖:

對于移植工作來說,最容易讓人迷惑的,也就是_k_core_auto_init這個函數(shù)的內(nèi)容,函數(shù)實現(xiàn)如下圖:

是不是完全看不懂它做了什么,其實這就是有名的Init Call機制。因為RTOS運行前,需要做相當多的準備工作,而根據(jù)用戶的組件設(shè)定的不同(例如使用了不同的組件),調(diào)用的內(nèi)容也會有所區(qū)別。所以對于這些變化的準備工作,如果都寫在一個函數(shù)里,會很亂,也很難看。所以不少RTOS都借鑒了Linux的Init Call機制。 通過一段區(qū)分了不同初始化級別的指針,按順序取出指針并執(zhí)行對應(yīng)的初始化函數(shù)。
Init Call 機制的簡單理解
其實我們并不需要過于在意Init Call機制是如何實現(xiàn)的,我們只需要知道,它是保存在Flash中的一段指針,通過這些指針可以有順序的對初始化函數(shù)進行調(diào)用即可。以下是在Map文件中搜索.init_call找到的對應(yīng)內(nèi)容。在文件中我們不難看出, 當前的工程里一共分了1、2、3、4、5、7個啟動等級(別問我為啥沒有6,以為map文件里沒有),并保存了對應(yīng)等級需要執(zhí)行的函數(shù)指針。

1. 現(xiàn)在我們繼續(xù)跟著啟動流程走,點擊單步執(zhí)行,進入 Init Call 機制 指定的第一個函數(shù)(cotex_m_set_vector)中,大部分情況下可以不用管它,應(yīng)該是處理中斷向量表指針之類的內(nèi)容。
2. 單步跳出這個函數(shù)后,接下來進入 Init Call 機制 指定的第二個函數(shù)(os_hw_board_init),這個函數(shù)調(diào)用了**板級的外設(shè)初始化函數(shù)**,這個在我們移植的時候需要注意把板級外設(shè)初始化的函數(shù)更名成下圖的名稱。同時在圖中也可以看到Init Call 機制實現(xiàn)的重要一環(huán),OS_PREV_INIT(函數(shù)名稱, 啟動等級)。正是通過一行,編譯器才會將這個函數(shù)指針存入Init Call 機制在flash中指定的固定指針段里。

1. 單步跳出這個函數(shù)后,接下來進入 Init Call 機制 指定的第三個函數(shù)(driver_stm32_usart_early_driver_init),這個函數(shù)給系統(tǒng)的前期輸出指派了對應(yīng)的串口設(shè)備(oneos_config.h文件中定義的OS_CONSOLE_DEVICE_NAME串口名稱一致的設(shè)備)。若發(fā)現(xiàn)沒有串口輸出信息,可以先檢查是否正確初始化了對應(yīng)串口,以及是否正確指派了串口設(shè)備。

接下來的啟動過程,就不再去分析了(太菜,后面的也不知道怎么解釋)。我們移植前期需要關(guān)注的啟動內(nèi)容,大概就是這些了。基本上完成一個移植工作,串口正常工作,系統(tǒng)調(diào)度正常運行,這兩個工作是優(yōu)先保障的。因為串口Debug也是一個常用的技巧,大部分時候串口輸出可以幫助調(diào)試。而完成了串口和線程調(diào)度,移植的初步階段就完成了。RTOS的Shell交互,也是非常有用的一個工具。以下是進入OneOS的啟動信息和shell截圖。可以通過在shell中查看線程信息,線程堆信息等待內(nèi)容。甚至可以在shell中開啟外設(shè),修改外設(shè)狀態(tài)等(需要編寫shell命令進行支持)。

本次分享就暫時告一段路,移植經(jīng)驗的分享會接著做構(gòu)建系統(tǒng)部分的。
審核編輯 黃昊宇
-
單片機
+關(guān)注
關(guān)注
6057文章
44806瀏覽量
644097 -
移植
+關(guān)注
關(guān)注
1文章
391瀏覽量
28494 -
RTOS
+關(guān)注
關(guān)注
24文章
836瀏覽量
120530 -
BSP
+關(guān)注
關(guān)注
1文章
89瀏覽量
26608
發(fā)布評論請先 登錄
相關(guān)推薦
oneOS框架基礎(chǔ)及應(yīng)用
基于VxWorks的BSP技術(shù)分析
VxWorks及BSP啟動流程與順序

中國移動物聯(lián)網(wǎng)操作系統(tǒng)OneOS發(fā)布
物聯(lián)網(wǎng)操作系統(tǒng)OneOS介紹
中國移動OneOS攜手青島國創(chuàng),加速推進家電智能化創(chuàng)新
中國移動OneOS亮相2021 國際 AIoT 生態(tài)發(fā)展大會,并榮膺NICT創(chuàng)新獎

超10萬+,中國移動OneOS攜手啟英泰倫在智能家居行業(yè)再發(fā)力!

中國移動oneos框架基礎(chǔ)及其組件解析

中國移動OneOS正式加入中國RISC-V產(chǎn)業(yè)聯(lián)盟

中國移動OneOS 3.0物聯(lián)網(wǎng)操作系統(tǒng)正式發(fā)布

中移物聯(lián)OneOS聯(lián)合紫光展銳實現(xiàn)智能穿戴芯片W217首發(fā)量產(chǎn)
摩博會亮點提前看:OneOS物聯(lián)網(wǎng)實時操作系統(tǒng),速度與安全并驅(qū)

2024摩博會在渝開幕!恒石智能聯(lián)合OneOS 攜 Model 系列芯片驅(qū)動的智能彩屏儀表閃耀登場

評論