同構(homogeneous)多核:單片機中,多個Core的結構相同,各個Core用的指令集相同。 異構(heterogeneous)多核:單片機中,多個Core的結構不同,不同的Core架構,使用不同的指令集。
本文基于TC397+Tasking實現SMP(Symmetric Multi-Processing,對稱多處理),這里的多核屬于同構多核。相對于SMP,AMP(Asymmetric Multi-Processing,非對稱多處理)主要用于異構多核處理。
本文,主要記錄RTThread多核實現過程中的"雷區"。
1、RTThread多核實現細節
(一)各Core實現硬件初始化
(二)任務初始化
(三)線程間任務切換
如果不是systick觸發的線程切換,即:由于線程狀態掛起觸發的線程切換時,需要判斷線程是否上鎖,如果已經解鎖,則需要解鎖之后在進行線程切換,避免死鎖。多核rt_hw_context_switch()的接口實現如下所示:
(四)中斷切換標志置位時機
每次程序進入系統心跳中斷服務例程時,需要先置位中斷切換標志Flag,完成系統心跳的累加后復位。注意:不同于單核處理,多核處理中,此處還需要對中斷切換進行處理,即:判斷程序是否超時,如果超時,則對應的pcpu->irq_switch_flag置位,需要進行中斷線程切換處理。代碼實現如下所示:
(五)線程上鎖/解鎖操作
上鎖處理,對應代碼實現如下所示:
解釋:__cmpswapw((address), ((unsigned long)value), (condition) ),上鎖處理時,如果address處的值==condition,則將value值賦寫到address位置。在Tricore架構中,__cmpswapw操作是原子操作,可以避免多核的并行訪問。
解鎖處理,對應的代碼實現如下所示:
(八)確認線程是否在目標Core運行
如果想確認線程是否在目標Core運行,在目標線程設置一個斷點(Breakpoint)即可,如下所示:
2、RTThread任務調度
(三)core1_thread_1運行周期
2、源碼鏈接
多核與單核的切換,在rtconfig.h文件中,使能或者關閉宏RT_USING_SMP即可打開/禁用SMP。
本文的RTThread中,啟用了2個Core(主核Core0,一個從核Core1),如果需要啟用更多的從核,可以在本文的基礎上打開其余從核,其余從核的處理與Core1類似。
受限于時間和我的水平,本文在零零碎碎的時間里整理完,實現未必最優。而且,我并未嚴格的按照RTThread的架構處理,寫的稍微有些隨心所欲。大家可以基于我的工程進行調試和二次開發,以便于達到理解OS內核、任務切換等相關知識。
源碼鏈接地址如下:
https://github.com/Kaixinguo2021/Tasking_TC397_MultiCore_RTThread.git
往期精彩回顧
Autosar往期精彩文章匯總:151~200
Autosar往期精彩文章匯總:201~251
NVM基礎:解讀"切頁"的頭部信息
診斷基礎:Event內存管理
Autosar通信模塊COM:Update-Bits詳解
Lin總線基礎:為什么Master節點需要外接上拉電阻
———————End———————
-
RT-Thread
+關注
關注
31文章
1285瀏覽量
40088
原文標題:基于Tricore架構的RTThread多核實現
文章出處:【微信號:RTThread,微信公眾號:RTThread物聯網操作系統】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論