-
軟件平臺(tái):MounRiver Studio( MRS);
-
硬件平臺(tái): CH32V307開發(fā)板;
-
源碼獲?。?span style="white-space:pre-wrap;font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;font-size:14px;text-align:left;background-color:rgba(0,0,0,.03);">https://gitee.com/openharmony/kernel_liteos_m
步驟一:在MRS中新建一個(gè)CH32V307的工程,將源碼直接拖到工程中,就添加進(jìn)來了,然后去添加頭文件路徑即可


下面說些移植操作系統(tǒng)的注意事項(xiàng): ARM上移植實(shí)時(shí)操作系統(tǒng)大家可能比較熟悉,對于RISC-V內(nèi)核的MCU,可能相對比較陌生。下面結(jié)合WCH的CH32V103和CH32V307兩款芯片來詳細(xì)說下針對RISC-V平臺(tái),移植實(shí)時(shí)操作系統(tǒng)的注意點(diǎn)。 在移植前,有必要對RISC-V的一些基本知識點(diǎn)有一定的了解,這里對RISC-V的概況,發(fā)展,指令集,特權(quán)模式等不作詳述,僅結(jié)合WCH的RISC-V內(nèi)核的MCU,簡單介紹我們移植實(shí)時(shí)操作系統(tǒng)有可能遇到的關(guān)鍵點(diǎn)做一下描述。 這里之所以選取V103和V307兩款芯片,主要其極具代表性: 首先,直觀上其外設(shè)的使用方法和我們之前熟悉的F103,F(xiàn)107等是兼容的,這樣降低了我們使用和移植時(shí)的難度,基于WCH提供的外設(shè)庫,我們以前上層的代碼甚至于不用修改可直接使用。 其次,V103是WCH RISC-V內(nèi)核家族中的V3內(nèi)核,V307為V4內(nèi)核,V3內(nèi)核支持RV32IMAC指令集,即除支持RISC-V基本的32位整數(shù)指令集外,還支持硬件乘除法,原子指令,壓縮指令。V4在V3的基礎(chǔ)上增加了單精度硬件浮點(diǎn),并且其性能也比V3高。 除上述之外,雖然兩者的中斷控制器(PFIC)相較于現(xiàn)行的PLIC均不同,均不是統(tǒng)一入口,而是采用中斷向量表尋址的方式,但是V3的中斷向量表處存放是一條指令,而V4的向量表既可以存放指令,也可以存放中斷處理函數(shù)的地址。兩者均支持中斷嵌套和硬件壓棧,區(qū)別在于V3最大嵌套兩級,V4最大可達(dá)八級,同時(shí)V3的硬件壓棧深度兩級,V4的硬件壓棧深度為三級。這里需要注意的是,移植實(shí)時(shí)操作系統(tǒng)時(shí)需要關(guān)閉硬件壓棧,在切換任務(wù)時(shí)所有寄存器,我們希望是由我們自己控制其壓棧和出棧的內(nèi)容。 RISC-V寄存器如下圖所示,其中x0-x31為整形寄存器,f0-f31為浮點(diǎn)寄存器(V3沒有浮點(diǎn)寄存器)。所有帶caller的寄存器,當(dāng)發(fā)生中斷時(shí)需要保存,值得注意的是,WCH的硬件壓棧保存的寄存器僅僅保存整數(shù)的16個(gè)caller saved 寄存器。正常一個(gè)中斷函數(shù)的寄存器保存我們不用關(guān)心,編譯器會(huì)幫我們做的很好。但是當(dāng)我們從一個(gè)匯編入口進(jìn)中斷函數(shù)的時(shí)候這些過程就不得不由我們自己來實(shí)現(xiàn)。寄存器中幾個(gè)相對特殊的x0恒為0,x1是返回地址寄存器ra,函數(shù)調(diào)用時(shí)用來存放返回地址,x2為堆棧指針sp,x3為gp全局指針,用來尋址全局變量。對于一個(gè)正常運(yùn)行的程序,除了x0,gp兩個(gè)初始值固定的外,其余的均會(huì)是不確定的,所有在進(jìn)行上下文保護(hù)時(shí),均需要保存。用到硬件浮點(diǎn)的時(shí)候,更是要保存32個(gè)浮點(diǎn)寄存器。

(1)進(jìn)中斷需要保存哪些內(nèi)容。
從之前的描述中,應(yīng)該知道,對于risc-v內(nèi)核來說其進(jìn)中斷壓棧的是caller saved的寄存器。從下圖一可以看出,進(jìn)Systick中斷函數(shù),先進(jìn)行寄存器保存,退出中斷時(shí)進(jìn)行寄存器恢復(fù),如果開啟硬件浮點(diǎn),同時(shí)還會(huì)對浮點(diǎn)寄存器進(jìn)行保存和恢復(fù)。這個(gè)過程是編譯器幫我們實(shí)現(xiàn),有一點(diǎn)需要注意的是我們移植的代碼里面進(jìn)中斷后獲取了中斷的堆棧“csrrw sp,mscratch,sp”,返回時(shí)恢復(fù)了線程的堆棧指針“csrrw sp,mscratch,sp”中斷堆棧指針初始值是在任務(wù)開始時(shí)存入mscratch寄存器的,如果采用C形式中斷函數(shù),中斷堆棧的獲取會(huì)在壓棧操作之后,中斷壓入的堆棧是當(dāng)前運(yùn)行任務(wù)的任務(wù)堆棧區(qū)域,如果想要中斷函數(shù)壓棧時(shí)壓入的自己的堆棧區(qū)域,可以使用匯編入口,進(jìn)中斷后先修改sp,然后壓棧,再調(diào)用中斷處理函數(shù),如圖二所示。


前文說過對于一個(gè)正常運(yùn)行的程序,切換任務(wù)前,除了x0恒0,x3 gp指針外,其余的寄存器均需要保存,每個(gè)RTOS中都會(huì)定義一個(gè)上下文保存相關(guān)的結(jié)構(gòu)體,這里我們以華為鴻蒙LiteOS_M為例,看一下這個(gè)結(jié)構(gòu)體:




這樣的方式在其他RTOS中也可以看到,例如RT-Thread中用于上下文保存的結(jié)構(gòu)體rt_hw_stack_frame,和taskCB類似的結(jié)構(gòu)體rt_thread等。


(3)如何開啟任務(wù)調(diào)度。
前面看了每個(gè)任務(wù)上下文保存位置,注意到堆棧初始化的時(shí)候把任務(wù)的入口地址給了context->epc。同時(shí)LiteOS_M源碼中定義了一個(gè)LosTask類型的全局變量g_losTask,其內(nèi)部只有兩個(gè)任務(wù)控制塊指針,一個(gè)指向當(dāng)前運(yùn)行的任務(wù),一個(gè)指向新任務(wù),即要切換至的任務(wù)。





(4)如何進(jìn)行任務(wù)切換。
了解了如何切換至第一個(gè)任務(wù),那么如何實(shí)現(xiàn)不同任務(wù)之間的切換呢,在這之前我們應(yīng)該都有了解,RTOS是根據(jù)任務(wù)的優(yōu)先級和時(shí)間片進(jìn)行輪轉(zhuǎn)的,每個(gè)任務(wù)執(zhí)行一段時(shí)間,然后切換至下一個(gè)任務(wù)執(zhí)行。每次切換前我們需要把當(dāng)前任務(wù)的運(yùn)行狀態(tài)進(jìn)行保存,然后切換至新任務(wù),對其運(yùn)行狀態(tài)進(jìn)行恢復(fù),如此循環(huán)反復(fù),實(shí)現(xiàn)任務(wù)調(diào)度。時(shí)間片實(shí)現(xiàn)使用的是內(nèi)核的SysTick定時(shí)器,LiteOS_M是在los_timer.c中實(shí)現(xiàn)的,這個(gè)只需要根據(jù)實(shí)際硬件的進(jìn)行初始化就行。其他操作系統(tǒng)也是類似,像RT-Thread源碼中我們根據(jù)硬件完成board.c。對于任務(wù)切換,我們利用內(nèi)核的軟中斷,只要使能該中斷,并且當(dāng)需要切換任務(wù)時(shí),把中斷控制器的對應(yīng)的pendset位置1,即可觸發(fā)該中斷進(jìn)行任務(wù)切換。下圖是liteOS_M切換過程:


其他操作系統(tǒng)也是大同小異,具體的區(qū)別僅僅是在切換新任務(wù)時(shí),新任務(wù)如何獲取的問題,上圖可以看到LiteOS_M是通過g_losTask來管理,RT-Thread中定義了from_thread,to_thread,顧名思義從一個(gè)線程切換至另外一個(gè)線程。
弄清楚以上的問題,對于某一個(gè)RTOS的基本移植來說應(yīng)該就比較明了。
最后移植好的鴻蒙os,RT-Thread等實(shí)時(shí)操作系統(tǒng)的代碼均已在MRS上線,可以直接創(chuàng)建,開發(fā)相關(guān)應(yīng)用

原文標(biāo)題:RISC-V MCU開發(fā)實(shí)戰(zhàn) (三):移植鴻蒙OS項(xiàng)目
文章出處:【微信公眾號:電子發(fā)燒友論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
RISC-V
+關(guān)注
關(guān)注
46文章
2538瀏覽量
48631 -
鴻蒙OS
+關(guān)注
關(guān)注
0文章
191瀏覽量
4957
原文標(biāo)題:RISC-V MCU開發(fā)實(shí)戰(zhàn) (三):移植鴻蒙OS項(xiàng)目
文章出處:【微信號:gh_9b9470648b3c,微信公眾號:電子發(fā)燒友論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
RISC-V MCU開發(fā) (一):集成開發(fā)環(huán)境

開發(fā)板上玩GTA,RISC-V多項(xiàng)移植項(xiàng)目成功運(yùn)作中
【項(xiàng)目實(shí)戰(zhàn)】基于RISC-V單片機(jī)的鴻蒙開發(fā)板項(xiàng)目
【項(xiàng)目實(shí)戰(zhàn)】基于RISC-V單片機(jī)的鴻蒙系統(tǒng)開發(fā)板項(xiàng)目日記連載(持續(xù)更新中)
RISC-V中***會(huì)子活動(dòng)之一:基于RISC-V的鴻蒙開發(fā)板設(shè)計(jì)
【項(xiàng)目實(shí)戰(zhàn)】基于RISC-V單片機(jī)的鴻蒙系統(tǒng)開發(fā)板項(xiàng)目日記連載【RISC-V鴻蒙開發(fā)板單片機(jī)簡介】
RISC-V MCU開發(fā) (一):集成開發(fā)環(huán)境
RISC-V MCU開發(fā)實(shí)戰(zhàn) (三):移植鴻蒙OS項(xiàng)目
RISC-V MCU開發(fā)相關(guān)資料分享
RISC-V MCU開發(fā)實(shí)戰(zhàn)(一) :DHT11
RISC-V MCU開發(fā)實(shí)戰(zhàn) (三):移植鴻蒙OS項(xiàng)目
目前國內(nèi)RISC-V架構(gòu)的MCU從程序從arm移植到RISC-V難度大嗎?
?開發(fā)板上玩GTA RISC-V多項(xiàng)移植項(xiàng)目成功運(yùn)作中

[RISC-V]國產(chǎn)MCU IDE ——MounRiver Studio(MRS)雙核開發(fā)項(xiàng)目實(shí)戰(zhàn)
![[<b class='flag-5'>RISC-V</b>]國產(chǎn)<b class='flag-5'>MCU</b> IDE ——MounRiver Studio(MRS)雙核<b class='flag-5'>開發(fā)</b><b class='flag-5'>項(xiàng)目</b><b class='flag-5'>實(shí)戰(zhàn)</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RISC-V MCU開發(fā)(一):集成開發(fā)環(huán)境

評論