前言
隨著汽車ECU迅速的往域控制器方向發展,ECU要出來任務越來越多,單核CPU的負載越來越大,多核ECU勢在必行。AUTOSAR架構下OS支持多核處理,本系列文章將詳細介紹AUTOSAR架構下的多核機制。本文介紹基于Tricore芯片的AUTOSAR架構下的多核啟動。
縮略詞
簡寫 | 全稱 |
UCB | User Configuration Block |
SSW | Startup Software |
BMHD | Boot Mode Headers |
SYSCON | System Configuration Register |
參考文檔
1. TriCoreTM TC1.6.2 core architecture manual
2. AURIXTC3XX_um_part1_v2.0.pdf
注:本公眾號文章中使用了一些第三方工具和文檔,若有侵權,請聯系作者刪除!
正文
1. Tricore多核啟動
背景知識1:UCB_BMHD0_ORIN.STAT的啟動地址是配置Tricore啟動后SSW從用戶程序的哪個地址開始運行,LD鏈接文件里面的入口地址EntryPoint是配置鏈接器把上電就執行的用戶入口代碼地址鏈接到Entry Point,二者應該是同一個地址,也就是說:UCB_BMHD0_ORIN.STAT的啟動地址 要等于LD鏈接文件中的Entry Point啟動地址。
參考文檔:
TC3xx芯片的UCB詳解
Note: 想arm-cotexM4芯片(e.g. S32K144),沒有SSW這個固化程序,一上電默認就從0地址啟動,所以我們的LD文件需要把我們的Reset_Handler放到0地址處。
參考文檔:
S32K平臺學習(1)-S32K144啟動流程分析
問題1:Tricore是多核ECU,為什么上電后只有Core0在Runing狀態? Core1/2/…是在halt狀態?
如下三個圖所示,Tricore上電后,CPU0默認進入RUN狀態,CPU1和CPU2默認進入halted狀態。
如下圖所示,Tricore芯片的CPU0(Core0)在上電(Reset)后默認是進入RUN狀態的,其他CPUx默認是進入HALT狀態的,這是芯片特性。
我們可以通過配置SYSCON寄存器的BHALT位=0b使得CPUx進入RUN狀態。
答:這是CPU芯片特性定義的。
背景知識2:我們可以在Core0啟動后,通過配置SYSCON寄存器的BHALT位域來啟動其他Slave核,在其實Slave核的同時應該配置Slave Core的PC指針到我們想要Slave Core啟動的地址處。
2.OS多核啟動時序
AUTOSAR架構下, 多核系統分主核(Mater Core,通常也是BSWCore,Tricore芯片下的CPU0)和從核(Slave Core)。系統啟動后MasterCore自動啟動,Slave Core由Master Core啟動OS后再通知啟動。
圖一為Core0的啟動時序,ECU上電后(或者Reset)只有Master Core會Run起來,Master Core的啟動代碼Startup()會跳轉到main()函數,main函數調用EcuM_Init()開始Master Core 0的StartSequence:
StartCore: 調用Os_Hal_CoreStart啟動所有Slave Core.
Os_Hal_CoreStart: 配置芯片寄存器真正啟動Slave Core(后文詳細分析).
StartOS: 啟動OS.
Os_BarrierSynchronize: 開始進行核同步,也就是等待Slave Core運行到這個地方,沒有完成核同步錢,Master Core會阻塞在這個地方(后文詳細分析OSBarriers機制)。
Rte_Start: 完成核同步后,OS調度進入Core0的Init Task,InitTask中調用Rte_Start。
Note:Core0 的Init Task一般不會mapping任何的SWC的Runnable,這樣Init Task就需要手動實現(不會由RTE自動生成),在Init Task中就能手寫我們想要運行的代碼,比如:e.g. 調用Rte_Start().
完成以上的任務后,Core0完成了StartSequence,開始Cyclic Task的調度。
Figure 1: OS Core0 start sequence.
Master Core調用Os_Hal_CoreStart()后,Slave Core就會立刻啟動,啟動Sequence和Core0基本一樣,只不過沒有啟動Slave的步驟。值得注意的是,Slave Core先調用Rte_Start(),而后再調用Os_BarrierSynchronize().
Figure 2: OS Core1 start sequence.
3. 多核啟動關鍵步驟分析
3.1 StartCore分析
StartCore()最后會調用Os_Hal_CoreStart()啟動Slave Core, 代碼如下所示,最主要的就是
1.配置PC指針指向Slave Core的啟動地址,這個啟動地址可以在Davinci工具中配置(_start_core1)。
2. 配置SYCON寄存器控制Slave Core從Halt狀態切換到Run狀態(SYSCON.BHALT位域寫入0)。
OS_FUNC_ATTRIBUTE_DEFINITION(OS_LOCAL_INLINE void, OS_CODE, OS_ALWAYS_INLINE, Os_Hal_CoreStart, ( P2CONST(Os_Hal_CoreConfigType, AUTOMATIC, OS_CONST) Core )) { /* #10 Write the foreign PC with the startup code symbol for core 1. */ *((volatile uint32*)Core->ProgramCounterRegister) = (uint32)(Core->StartLabelAddress); /* #20 Reset the core. */ *((volatile uint32*)Core->DBGSRRegister) = OS_HAL_DBGSR_START_CORE; /* #30 Release the core. */ *((volatile uint32*)Core->SYSCON_CORECON_Register) &= ~OS_HAL_SYSCON_BHALT_MASK; }
3.2 Os_BarrierSynchronize分析
Os_BarrierSynchronize()就是OsBarriers的具體實現,如果一個Barrier被多個Task引用了,那么只有引用這個Barrier的所有Task都調用了Os_BarrierSynchronize(Same BarrierID)后Task才會跳出阻塞狀態,這樣就能實現核同步。
參考文檔:MICROSAR Classic OS Technical Reference.
問題2:為什么要讓Slave Core的Rte_Start先調用了?
答:Vector的推薦代碼這么寫的。
參考文檔:How to deal with MICROSAR Multi-Core Projects.
4. 總結
a. Tricore芯片Reset后只有Master Core0會進入到Run狀態,Slave Cores處于Halt狀態。
b. AUTSARMaster Core的OS調用StartCore()啟動Slave Core.
c. StartCore()最終調用Os_Hal_CoreStart()配置Tricore芯片的PC指針和SYSCON寄存器啟動Slave Core.
d. OS通過OsBarriers機制實現核同步。
審核編輯:湯梓紅
-
芯片
+關注
關注
456文章
51176瀏覽量
427263 -
AUTOSAR
+關注
關注
10文章
363瀏覽量
21779 -
ecu
+關注
關注
14文章
892瀏覽量
54746 -
TriCore
+關注
關注
0文章
15瀏覽量
11768 -
域控制器
+關注
關注
0文章
249瀏覽量
2700
原文標題:AUTOSAR架構下多核啟動
文章出處:【微信號:汽車電子嵌入式,微信公眾號:汽車電子嵌入式】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論