RISC V MCU移植RTOS系列教程(四)

2022-10-04 00:24:19 字數 2131 閱讀 9221

接著以

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

也是大同小異,例如鴻蒙

lite

os_m

中有個g_lostask

全域性變數,其是個結構體,內部為兩個任務控制塊型別的指標,分別為*runtask指向當前執行的任務,*newtask指向要切換的新任務

tencentos_tiny

中亦有兩個任務控制塊型別的指標*k_curr_task指向當前任務,*k_next_task指向下乙個要切換任務。這和

rt-thread

中的「from

」和「to

」是為異曲同工之處。通過管理操作這些變數,實現任務到任務的切換。

Zynq系列 Uboot移植

解壓後,在u boot xlnx xilinx v2018.3目錄下,匯入配置 我使用的編譯鏈是arm linux gnueabihf gcc make cross compile arm linux gnueabihf zynq zed defconfig 配置 make cross compil...

python系列教程 python系列教程

宣告 在人工智慧技術教學期間,不少學生向我提一些python相關的問題,所以為了讓同學們掌握更多擴充套件知識更好的理解人工智慧技術,我讓助理負責分享這套python系列教程,希望能幫到大家!由於這套python教程不是要由所寫,所以不如我的人工智慧技術教學風趣幽默,學起來比較枯燥 但它的知識點還是講...

Linux系列教程

linux系列教程 一 linux系統簡介 linux系列教程 二 linux系統安裝 手把手學安裝centos6.8 linux系列教程 三 linux學習技巧 linux系列教程 四 linux常用命令之檔案和目錄處理命令 linux系列教程 五 linux常用命令之鏈結命令和許可權管理命令 l...