接著以WCH沁恒微電子的赤菟V103(CH32V103)和赤菟V307(CH32V307)兩款RISC-V內核單片機來詳細說下針對RISC-V平臺,移植實時操作系統的注意點。
今天聊下移植RTOS時RISC-V內核時單片機任務之間的切換。
了解了如何切換至第一個任務,如何實現不同任務之間的切換呢。在這之前想必對“任務優先級”,“時間片輪轉”等概念有一定的了解。rt-thread正常運行也需要個定時器為其提供時鐘,且任務初始化時設置了任務優先級。調度器在就緒的任務列表中尋找優先級較高的任務切換執行,當優先級相同時,調度器會按照設置的時間片大小來輪流調度線程,用時間片來約束任務的單次執行時長。不管因優先級還是時間片耗盡,從當前任務切換至新任務時均需要保存當前任務的上下文至當前任務的堆棧區,獲取新任務的堆棧,并從新任務堆棧區恢復上下文,切換并執行。
在ARM中,系統的滴答時鐘由內核定時器Systick提供,并且在pendSV中進行任務切換。類比RISC-V我們內核提供了一個64bit
Systick定時器,同時也有軟中斷SW_handler(其實整個切換也不一定要在某個中斷中切換,只要做好上下文保存即可),需要切換時,置位其相應的pend位,即可觸發進中斷,實現切換。rt-thread中用了三個全局變量,用于中斷切換上下文rt_interrupt_from_thread、rt_interrupt_to_thread、rt_thread_switch_interrupt_flag,前兩個分別用來存儲“from”線程sp指針和“to”線程的sp指針,當需要切換時,flag被函數rt_hw_context_switch_interrupt置位,并觸發進軟中斷如圖1所示。在中斷中實現“from”到“to”線程的切換,并將flag清零。
圖1 中斷切換上下文
SW中斷函數同樣是一段匯編實現的代碼,內容如下圖2所示,其中重點代碼已經給出注釋,注意查看。從注釋可以看出,其相較于啟動第一個任務多了開頭的就任務保存的過程。值得注意的是赤菟V307支持進中斷后將硬件壓棧臨時關閉,這樣在上下文切換的時候可以手動恢復我們想要的寄存器值,而當中斷返回后,硬件壓棧自動打開,不影響其他外設中斷使用硬件壓棧。而對于沒有此功能的赤菟V103來說,移植操作系統時不能打開硬件壓棧。
圖2 軟中斷切換上下文過程
對于其他的RTOS也是大同小異,例如鴻蒙LiteOS_M中有個g_losTask全局變量,其是個結構體,內部為兩個任務控制塊類型的指針,分別為*runTask指向當前運行的任務,newTask指向要切換的新任務,騰訊的TencentOS_Tiny中亦有兩個任務控制塊類型的指針k_curr_task指向當前任務,*k_next_task指向下一個要切換任務。這和rt-thread中的“from”和“to”是為異曲同工之處。通過管理操作這些變量,實現任務到任務的切換。
-
單片機
+關注
關注
6032文章
44514瀏覽量
632944 -
內核
+關注
關注
3文章
1362瀏覽量
40226 -
移植
+關注
關注
1文章
377瀏覽量
28108 -
實時操作系統
+關注
關注
1文章
196瀏覽量
30738 -
RISC-V
+關注
關注
44文章
2228瀏覽量
46025
發布評論請先 登錄
相關推薦
評論