-
軟件平臺:MounRiver Studio( MRS);
-
硬件平臺: CH32V307開發板;
-
源碼獲取:https://gitee.com/openharmony/kernel_liteos_m
步驟一:在MRS中新建一個CH32V307的工程,將源碼直接拖到工程中,就添加進來了,然后去添加頭文件路徑即可
![22c30b86-3a1a-11ec-82a9-dac502259ad0.png](https://file.elecfans.com/web2/M00/1A/B2/poYBAGF_Wo6AMzTZAABb5xHedpU023.png)
![2330a04c-3a1a-11ec-82a9-dac502259ad0.png](https://file.elecfans.com/web2/M00/1A/B2/poYBAGF_Wo6AZRZkAAB6qrjSgtA852.png)
下面說些移植操作系統的注意事項: ARM上移植實時操作系統大家可能比較熟悉,對于RISC-V內核的MCU,可能相對比較陌生。下面結合WCH的CH32V103和CH32V307兩款芯片來詳細說下針對RISC-V平臺,移植實時操作系統的注意點。 在移植前,有必要對RISC-V的一些基本知識點有一定的了解,這里對RISC-V的概況,發展,指令集,特權模式等不作詳述,僅結合WCH的RISC-V內核的MCU,簡單介紹我們移植實時操作系統有可能遇到的關鍵點做一下描述。 這里之所以選取V103和V307兩款芯片,主要其極具代表性: 首先,直觀上其外設的使用方法和我們之前熟悉的F103,F107等是兼容的,這樣降低了我們使用和移植時的難度,基于WCH提供的外設庫,我們以前上層的代碼甚至于不用修改可直接使用。 其次,V103是WCH RISC-V內核家族中的V3內核,V307為V4內核,V3內核支持RV32IMAC指令集,即除支持RISC-V基本的32位整數指令集外,還支持硬件乘除法,原子指令,壓縮指令。V4在V3的基礎上增加了單精度硬件浮點,并且其性能也比V3高。 除上述之外,雖然兩者的中斷控制器(PFIC)相較于現行的PLIC均不同,均不是統一入口,而是采用中斷向量表尋址的方式,但是V3的中斷向量表處存放是一條指令,而V4的向量表既可以存放指令,也可以存放中斷處理函數的地址。兩者均支持中斷嵌套和硬件壓棧,區別在于V3最大嵌套兩級,V4最大可達八級,同時V3的硬件壓棧深度兩級,V4的硬件壓棧深度為三級。這里需要注意的是,移植實時操作系統時需要關閉硬件壓棧,在切換任務時所有寄存器,我們希望是由我們自己控制其壓棧和出棧的內容。 RISC-V寄存器如下圖所示,其中x0-x31為整形寄存器,f0-f31為浮點寄存器(V3沒有浮點寄存器)。所有帶caller的寄存器,當發生中斷時需要保存,值得注意的是,WCH的硬件壓棧保存的寄存器僅僅保存整數的16個caller saved 寄存器。正常一個中斷函數的寄存器保存我們不用關心,編譯器會幫我們做的很好。但是當我們從一個匯編入口進中斷函數的時候這些過程就不得不由我們自己來實現。寄存器中幾個相對特殊的x0恒為0,x1是返回地址寄存器ra,函數調用時用來存放返回地址,x2為堆棧指針sp,x3為gp全局指針,用來尋址全局變量。對于一個正常運行的程序,除了x0,gp兩個初始值固定的外,其余的均會是不確定的,所有在進行上下文保護時,均需要保存。用到硬件浮點的時候,更是要保存32個浮點寄存器。
![23a3deae-3a1a-11ec-82a9-dac502259ad0.png](https://file.elecfans.com/web2/M00/1A/B2/poYBAGF_Wo6AFKQZAADXQv0-pyo399.png)
(1)進中斷需要保存哪些內容。
從之前的描述中,應該知道,對于risc-v內核來說其進中斷壓棧的是caller saved的寄存器。從下圖一可以看出,進Systick中斷函數,先進行寄存器保存,退出中斷時進行寄存器恢復,如果開啟硬件浮點,同時還會對浮點寄存器進行保存和恢復。這個過程是編譯器幫我們實現,有一點需要注意的是我們移植的代碼里面進中斷后獲取了中斷的堆棧“csrrw sp,mscratch,sp”,返回時恢復了線程的堆棧指針“csrrw sp,mscratch,sp”中斷堆棧指針初始值是在任務開始時存入mscratch寄存器的,如果采用C形式中斷函數,中斷堆棧的獲取會在壓棧操作之后,中斷壓入的堆棧是當前運行任務的任務堆棧區域,如果想要中斷函數壓棧時壓入的自己的堆棧區域,可以使用匯編入口,進中斷后先修改sp,然后壓棧,再調用中斷處理函數,如圖二所示。
![241e58dc-3a1a-11ec-82a9-dac502259ad0.png](https://file.elecfans.com/web2/M00/1A/B2/poYBAGF_Wo6ARxi4AADy2OG2anQ992.png)
![249d26b2-3a1a-11ec-82a9-dac502259ad0.png](https://file.elecfans.com/web2/M00/1A/B2/poYBAGF_Wo6ANzqYAADUQF4Rr_0972.png)
前文說過對于一個正常運行的程序,切換任務前,除了x0恒0,x3 gp指針外,其余的寄存器均需要保存,每個RTOS中都會定義一個上下文保存相關的結構體,這里我們以華為鴻蒙LiteOS_M為例,看一下這個結構體:
![24f7b550-3a1a-11ec-82a9-dac502259ad0.png](https://file.elecfans.com/web2/M00/1A/B2/poYBAGF_Wo6AYukpAADyjO8fFl0440.png)
![258e3ee4-3a1a-11ec-82a9-dac502259ad0.png](https://file.elecfans.com/web2/M00/1A/B2/poYBAGF_Wo6AFMlyAABtFapo1EQ636.png)
![261155a4-3a1a-11ec-82a9-dac502259ad0.png](https://file.elecfans.com/web2/M00/1A/B2/poYBAGF_Wo6ANNv2AACG4A_PBXg594.png)
![269261f8-3a1a-11ec-82a9-dac502259ad0.png](https://file.elecfans.com/web2/M00/1A/B2/poYBAGF_Wo6AD7bWAACBffjfclQ453.png)
這樣的方式在其他RTOS中也可以看到,例如RT-Thread中用于上下文保存的結構體rt_hw_stack_frame,和taskCB類似的結構體rt_thread等。
![27276988-3a1a-11ec-82a9-dac502259ad0.png](https://file.elecfans.com/web2/M00/1A/B2/poYBAGF_Wo6ADuqKAADsDo1Za_k503.png)
![27a4d9d6-3a1a-11ec-82a9-dac502259ad0.png](https://file.elecfans.com/web2/M00/1A/B2/poYBAGF_Wo6AAC_1AACX2sEHjxw740.png)
(3)如何開啟任務調度。
前面看了每個任務上下文保存位置,注意到堆棧初始化的時候把任務的入口地址給了context->epc。同時LiteOS_M源碼中定義了一個LosTask類型的全局變量g_losTask,其內部只有兩個任務控制塊指針,一個指向當前運行的任務,一個指向新任務,即要切換至的任務。
![283c6152-3a1a-11ec-82a9-dac502259ad0.png](https://file.elecfans.com/web2/M00/1A/B2/poYBAGF_Wo6AMSW2AAAi0uDhYzk897.png)
![2897cfce-3a1a-11ec-82a9-dac502259ad0.png](https://file.elecfans.com/web2/M00/1A/B2/poYBAGF_Wo6AaQAwAABUxRHn-OQ510.png)
![292bbfae-3a1a-11ec-82a9-dac502259ad0.png](https://file.elecfans.com/web2/M00/1A/B2/poYBAGF_Wo6AGD4MAADab4kII1I351.png)
![29a57e34-3a1a-11ec-82a9-dac502259ad0.png](https://file.elecfans.com/web2/M00/1A/B2/poYBAGF_Wo6ACX7_AABLNQPxXoo587.png)
![2a4bfcf0-3a1a-11ec-82a9-dac502259ad0.png](https://file.elecfans.com/web2/M00/1A/B2/poYBAGF_Wo6AJU07AAA_6_FZ4XU619.png)
(4)如何進行任務切換。
了解了如何切換至第一個任務,那么如何實現不同任務之間的切換呢,在這之前我們應該都有了解,RTOS是根據任務的優先級和時間片進行輪轉的,每個任務執行一段時間,然后切換至下一個任務執行。每次切換前我們需要把當前任務的運行狀態進行保存,然后切換至新任務,對其運行狀態進行恢復,如此循環反復,實現任務調度。時間片實現使用的是內核的SysTick定時器,LiteOS_M是在los_timer.c中實現的,這個只需要根據實際硬件的進行初始化就行。其他操作系統也是類似,像RT-Thread源碼中我們根據硬件完成board.c。對于任務切換,我們利用內核的軟中斷,只要使能該中斷,并且當需要切換任務時,把中斷控制器的對應的pendset位置1,即可觸發該中斷進行任務切換。下圖是liteOS_M切換過程:
![2aa9edec-3a1a-11ec-82a9-dac502259ad0.png](https://file.elecfans.com/web2/M00/1A/B2/poYBAGF_Wo6AYfGZAAD_lvQmL1M443.png)
![2b15f17c-3a1a-11ec-82a9-dac502259ad0.png](https://file.elecfans.com/web2/M00/1A/B2/poYBAGF_Wo6AJlsBAAEElHStXKs630.png)
其他操作系統也是大同小異,具體的區別僅僅是在切換新任務時,新任務如何獲取的問題,上圖可以看到LiteOS_M是通過g_losTask來管理,RT-Thread中定義了from_thread,to_thread,顧名思義從一個線程切換至另外一個線程。
弄清楚以上的問題,對于某一個RTOS的基本移植來說應該就比較明了。
最后移植好的鴻蒙os,RT-Thread等實時操作系統的代碼均已在MRS上線,可以直接創建,開發相關應用
![2b9ca4ba-3a1a-11ec-82a9-dac502259ad0.png](https://file.elecfans.com/web2/M00/1A/B2/poYBAGF_Wo6ABNeEAAChWWMoWkA347.png)
-
RISC-V
+關注
關注
45文章
2322瀏覽量
46590 -
鴻蒙OS
+關注
關注
0文章
190瀏覽量
4537
原文標題:RISC-V MCU開發實戰 (三):移植鴻蒙OS項目
文章出處:【微信號:gh_9b9470648b3c,微信公眾號:電子發燒友論壇】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
RISC-V MCU開發 (一):集成開發環境
![<b class='flag-5'>RISC-V</b> <b class='flag-5'>MCU</b><b class='flag-5'>開發</b> (一):集成<b class='flag-5'>開發</b>環境](https://file.elecfans.com//web2/M00/15/A5/poYBAGFMHkOAere8AAYfUmflICg821.png)
開發板上玩GTA,RISC-V多項移植項目成功運作中
【項目實戰】基于RISC-V單片機的鴻蒙開發板項目
【項目實戰】基于RISC-V單片機的鴻蒙系統開發板項目日記連載(持續更新中)
RISC-V中***會子活動之一:基于RISC-V的鴻蒙開發板設計
【項目實戰】基于RISC-V單片機的鴻蒙系統開發板項目日記連載【RISC-V鴻蒙開發板單片機簡介】
RISC-V MCU開發實戰 (三):移植鴻蒙OS項目
RISC-V MCU開發實戰(一) :DHT11
RISC-V MCU開發實戰 (三):移植鴻蒙OS項目
?開發板上玩GTA RISC-V多項移植項目成功運作中
![?<b class='flag-5'>開發</b>板上玩GTA <b class='flag-5'>RISC-V</b>多項<b class='flag-5'>移植</b><b class='flag-5'>項目</b>成功運作中](https://file.elecfans.com/web2/M00/14/D9/poYBAGFCwTiAJ7rjAABGuZniQQk158.png)
[RISC-V]國產MCU IDE ——MounRiver Studio(MRS)雙核開發項目實戰
![[<b class='flag-5'>RISC-V</b>]國產<b class='flag-5'>MCU</b> IDE ——MounRiver Studio(MRS)雙核<b class='flag-5'>開發</b><b class='flag-5'>項目</b><b class='flag-5'>實戰</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RISC-V MCU開發(一):集成開發環境
![<b class='flag-5'>RISC-V</b> <b class='flag-5'>MCU</b><b class='flag-5'>開發</b>(一):集成<b class='flag-5'>開發</b>環境](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論