在做rt-thread系統(tǒng)移植的這段時(shí)間里,積累一些快速移植的經(jīng)驗(yàn),不論是現(xiàn)有架構(gòu)的不同型號(hào)的芯片,還是一個(gè)全新架構(gòu)的移植,只需要按照一定的步驟進(jìn)行,一般大的方向不會(huì)出錯(cuò)。剩下的事情就是解決為什么沒有達(dá)到預(yù)期效果的問題。
移植的里程碑有如下的幾個(gè):1.芯片工作在正常的模式,可以正常的執(zhí)行c代碼邏輯2.至少有一個(gè)串口驅(qū)動(dòng)3.上下文切換邏輯4.定時(shí)器可以正常的使用5.串口輸入有正常的中斷產(chǎn)生并能夠讀到數(shù)據(jù)針對以上的順序詳細(xì)描述問題以及解決辦法。
芯片的工作模式


不同架構(gòu)的芯片一定會(huì)有對應(yīng)的模式適合操作系統(tǒng)的運(yùn)行,這是芯片設(shè)計(jì)時(shí)就考慮到的問題,所以移植也要遵循這種規(guī)則。另外也涉及到寄存器的訪問權(quán)限問題。比如armv7,其操作系統(tǒng)存在的模式為system模式,可以方便的切換到其他模式。還有比較典型的armv8架構(gòu)的el1特權(quán)級(jí)別。當(dāng)然把芯片模式切換到其他的模式,也可以,比如rt-thread整個(gè)系統(tǒng)運(yùn)行在el3特權(quán)模式,在el3特權(quán)級(jí)別最高,但是并不是越高越好,往往el3會(huì)有更加合適的用法。其切換到邏輯一般在芯片啟動(dòng)后,執(zhí)行的最初一段的匯編代碼邏輯里面,一般芯片在上電后,都會(huì)進(jìn)入最高特權(quán)權(quán)限的模式里,切換到操作系統(tǒng)特定的特權(quán)級(jí)別模式即可。
可以正常執(zhí)行c代碼


完成這一步也是匯編的代碼的實(shí)現(xiàn),這一步的通用關(guān)鍵操作是bss段清零,以及設(shè)置棧指針地址。 對于bss段清零的必要性是因?yàn)?a href="http://m.xsypw.cn/soft/data/21-24/" target="_blank">c語言的語法規(guī)則,以前的存儲(chǔ)程序的存儲(chǔ)器是很貴的,所以程序在生成的時(shí)候,把未初始化的全局變量和靜態(tài)變量,這些存儲(chǔ)空間不存入存儲(chǔ)器空間,然后在程序加載的時(shí)候,將這段空間指向的區(qū)域清零。而函數(shù)中的非靜態(tài)的變量則存儲(chǔ)在棧中,地址不確定。 如果不進(jìn)行bss的清零,可能導(dǎo)致的問題是全局變量和靜態(tài)變量的值不確定,導(dǎo)致程序編程時(shí)遇到異常的現(xiàn)象。 清空bss段的步驟也很簡單,就是將bss這一段內(nèi)存空間設(shè)置為0即可。而設(shè)置棧地址也就是sp的地址,僅僅是為了在操作系統(tǒng)線程還未啟動(dòng)調(diào)度時(shí),最開始的棧空間。根據(jù)c語言的函數(shù)調(diào)用規(guī)則,c語言進(jìn)行函數(shù)調(diào)用時(shí),都需要壓棧和出棧,這段棧空間是用戶自行分配的。 所以需要注意點(diǎn)是rt-thread啟動(dòng)調(diào)度前也是有一個(gè)棧空間的,調(diào)度啟動(dòng)后該棧空間不被使用,每個(gè)線程棧空間才生效。
至少有一個(gè)串口驅(qū)動(dòng)


要完成這個(gè)工作,需要注意的問題是事先已經(jīng)完成了串口驅(qū)動(dòng)的驗(yàn)證工作。也就是可以正常的接收和發(fā)送數(shù)據(jù)。完成rt-thread串口驅(qū)動(dòng)對接,只需實(shí)現(xiàn)串口初始化,串口接收,串口發(fā)送,中斷注冊即可。 由于前期沒有中斷,實(shí)現(xiàn)串口發(fā)送功能就可以接著進(jìn)行下面工作了。正常情況下,可以看到串口可以輸出rt-thread的logo了。
上下文切換邏輯


定時(shí)器可以正常使用


定時(shí)器可以正常使用的前提中斷可以正常的產(chǎn)生,然后周期性的產(chǎn)生定時(shí)器中斷。 定時(shí)器是系統(tǒng)tick的關(guān)鍵,沒有定時(shí)器,系統(tǒng)將無法在任務(wù)中通過delay釋放CPU資源,但是可以通過主動(dòng)切換任務(wù)的方式進(jìn)行調(diào)度。關(guān)于rt-thread的tick的時(shí)間片多少合適的問題,這里解釋為,一般合適的10ms,對于主頻很高的芯片可以是1ms。曾經(jīng)在30mhz的主頻的FPGA上驗(yàn)證系統(tǒng),發(fā)現(xiàn)并不能正常運(yùn)行起來。分析因?yàn)橄到y(tǒng)定時(shí)器中斷產(chǎn)生的太頻繁,主頻太低,程序來不及處理完成又發(fā)生了中斷。
串口可正常輸入


該步驟可作為移植的成功的驗(yàn)證工作,這一步的工作并非技術(shù)難點(diǎn),但是往往前面步驟沒有成功,可能會(huì)導(dǎo)致這里出現(xiàn)不了想要的現(xiàn)象。 比如曾經(jīng)協(xié)助一個(gè)客戶完成移植工作時(shí),發(fā)現(xiàn)串口中斷打開后,只能輸入一個(gè)字符串后無反應(yīng),后來才查到中斷處理標(biāo)志沒有清空。一般可以正常的輸入輸出,該系統(tǒng)移植就基本成功了。
移植的工作難點(diǎn)


移植經(jīng)驗(yàn)分享


rt-thread的移植是有一些關(guān)鍵點(diǎn)的,找到這些關(guān)鍵點(diǎn),可以非常順利的規(guī)劃清楚方向和目標(biāo),對于每個(gè)關(guān)鍵點(diǎn)進(jìn)行技術(shù)攻克,這樣是最快也是最高效的做事方式。 要想移植不同芯片架構(gòu),需要非常清楚這個(gè)芯片的架構(gòu),也需要非常熟悉rt-thread系統(tǒng)最關(guān)鍵點(diǎn)底層代碼。一般熟悉rt-thread的底層代碼并不是很難,從頭讀一遍aarch64的rt-thread最小系統(tǒng)實(shí)現(xiàn)兩三天就能差不多理解,而芯片手冊的閱讀要結(jié)合實(shí)際的工作經(jīng)驗(yàn),弄清楚芯片特權(quán)模式、看懂寄存器,看懂匯編基本就可以了。當(dāng)然有些處理器是需要實(shí)現(xiàn)mmu才能正常執(zhí)行的,比如aarch64,必須實(shí)現(xiàn)mmu的功能,即使是1:1映射。
RT-Thread開發(fā)者大會(huì)
我們將聯(lián)合重量級(jí)合作伙伴,圍繞AIoT的發(fā)展、產(chǎn)業(yè)技術(shù)趨勢,聚焦控制、連接、行業(yè)應(yīng)用開發(fā),通過主題演講、技術(shù)分享、應(yīng)用演示等環(huán)節(jié),助力開發(fā)者探索萬物智能的世界,期待與大家一起相聚線上直播間!
現(xiàn)在掃碼報(bào)名 我們將在報(bào)名者中抽取“幸運(yùn)參會(huì)者100名” 贈(zèng)送RT-Thread新款開發(fā)板(即將揭秘)
本次將在大會(huì)當(dāng)天在直播間宣布中獎(jiǎng)名單
更多獎(jiǎng)品即將來襲...
原文標(biāo)題:RT-Thread針對不同架構(gòu)芯片移植的方法
文章出處:【微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
RT-Thread
+關(guān)注
關(guān)注
32文章
1375瀏覽量
41596
原文標(biāo)題:RT-Thread針對不同架構(gòu)芯片移植的方法
文章出處:【微信號(hào):RTThread,微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評(píng)論請先 登錄
RT-Thread審核團(tuán)招募: 深度參與開源RTOS社區(qū)治理與演進(jìn)

如何將RT-Thread移植到NXP MCUXPressoIDE上

全志科技亮相2024 RT-Thread開發(fā)者大會(huì)
RT-Thread應(yīng)用開發(fā)寒假師資培訓(xùn)——西安站

RT-Thread操作系統(tǒng)應(yīng)用開發(fā)寒假師資培訓(xùn)

RT-Thread上CAN實(shí)踐

開源共生 商業(yè)共贏 | RT-Thread 2024開發(fā)者大會(huì)報(bào)名啟動(dòng)!

如何在RT-thread studio的裸機(jī)例程上移植freertos?
【大連】9月7日RT-Thread巡回線下培訓(xùn)-OpenMV機(jī)器視覺

【QEMU系列】不用開發(fā)板運(yùn)行RT-Thread指南-ARM架構(gòu)

2024 RT-Thread全球巡回 線下培訓(xùn)火熱來襲!

【好書推薦】RT-Thread設(shè)備驅(qū)動(dòng)開發(fā)指南

RT-Thread 新里程碑達(dá)成——GitHub Star 破萬!

基于 RT-Thread專業(yè)版的EtherCAT主站方案

評(píng)論