接著以WCH沁恒微電子的赤菟V103(CH32V103)和赤菟V307(CH32V307)兩款RISC-V內核單片機來詳細說下針對RISC-V平臺,移植實時操作系統的注意點。
今天聊下移植RTOS時RISC-V內核時單片機切換至第一個任務。
以RT-Thread為例,rt-thread和其他RTOS有點區別的是其gcc下的入口函數定義為entry,而main函數則可以被初始化為線程之一,圖1為rt-thread的詳細的啟動流程。rt-thread定義一個rt_thread類型的全局指針rt_current_thread,用于實時獲取當前運行的線程。從圖9可知,硬件啟動后進rtthread_startup,其開始進行了必要的初始化,如系統滴答定時器、堆、串口、調度器、定時器、main線程、空閑idle線程等等,最后執行了rt_system_scheduler_start后轉交調度器執行。其內容如下圖2所示。
圖1 rt_thread啟動流程
圖2 調度器啟動
由圖2可知,其會查找優先級較高的就緒組優先級,并根據該優先級查找就緒鏈表,獲取優先級較高的任務并得到控制塊to_thread,然后調用rt_hw_context_switch_to切換至該任務。其是一段匯編實現的代碼,傳入的參數為該任務的sp指針。由前文可知,我們可以根據to_thread->sp得到該任務的堆棧位置,該堆棧的頂部空間存儲了執行該任務時cpu寄存器的值,由此也可推測該部分匯編代碼主要完成的就是從sp處恢復cpu寄存器值,并轉而執行該任務。其代碼如下圖3所示,詳見注釋。
圖3 切換至第一個任務
由上注釋分析可知,rt_hw_context_switch_to通過傳入的sp,恢復cpu寄存器,其中mepc寄存器任務初始化時設置為任務的入口地址,ra寄存器設置為返回地址,其指向公用函數_rt_thread_exit。 當mret返回后,pc更新為mepc值,即轉向執行任務函數,若其不是一個持續執行的[while(1)]函數,那么其返回至_rt_thread_exit,刪除該任務,并切換至其他任務。 由此也可理解圖2中,最后一句注釋“never
come back”的含義了,一旦開始執行任務,pc值被改變,再不會回到調用的地方。
其他RTOS中也有和此匯編函數類似的匯編實現,例如liteOS_M中的HalStartToRun,TencentOS_Tiny中的port_sched_start等。
-
單片機
+關注
關注
6063文章
44925瀏覽量
647006 -
移植
+關注
關注
1文章
394瀏覽量
28580 -
RTOS
+關注
關注
24文章
841瀏覽量
120769 -
實時操作系統
+關注
關注
1文章
202瀏覽量
31214 -
RISC-V
+關注
關注
46文章
2486瀏覽量
48278
發布評論請先 登錄
如何實現一個RISC-V內核架構的芯片移植工作
基于RT-Thread操作系統衍生rt-smart實時操作系統簡介
基于實時操作系統的單片機應用系統設計
實時操作系統Free RTOS的詳細介紹
基于精簡指令集的RISC-V內核的單片機
Green Hills Software 為 Imagination RISC-V CPU 增加量產就緒的 RTOS 和工具支持

評論