以前上手單片機都是main函數開始,一條路走到黑。最近工作上接觸到了英飛凌Aurix TC397這款6核ECU,實際操作起來還是挺不一樣的。後中文資料網上基本找不到【辣雞英飛凌】。。。我來起個頭好了。
PS:(以下著重描述與單核ECU的區別,基礎性的知識在此恕不展開)
PPS:(為便於理解,本文將採用倒敘法)
目錄:
1. How 如何對6個核心分別編程
2. Why 為什麼6個核心能找到與自己對應的那個main函數
3. 6個核心的主從問題
先上圖:
6核聽起來可能比較讓人頭大,讓我們先把鍋燒熱,啊呸,先來點感性的認識。上圖可以較好的展示出在開發時工程的架構,對於每個核心n,都有一個core(n)_main函數和c文件與之對應,所以操作起來,和普通的單核ECU沒啥區別【此句不嚴謹】
看一下核心是怎麼啟動的,問題就解決了一半
圖:
上圖較好的描述了ECU的啟動過程,每次上電之後,ECU都會首先運行廠家預留在ROM中的程序,之後根據圖中的Reset vector跳轉到啟動函數(startup function),啟動函數在完成一系列初始化功能後會引導程序指針到c語言的入口,也就是我們熟悉的main函數。
咱們接著看啟動函數(startup function)長啥樣:
在初始化好核心的其他資源後,在最後一行跳轉到了自己的main函數。
-----------分割線,(不想加寬油的同學可以不加。我這說的都是啥??)趕時間的同學可以直接跳到第3節-----------------
湊近看一眼 Ifx_Ssw_jumpToFunction 這個函數:
你會發現它其實是一個封裝好了的彙編指令,其實這也很好理解,之前c語言環境還沒有配置好,當然這裡用的大都是彙編了,這也是為什麼啟動函數往往叫 c startup函數的原因。
看到這裡你可能仍然會有疑惑,為什麼
就是core3的啟動函數,編譯器怎知道的?
good question,看圖:
從上圖可見,同樣是在 Tc3這個c文件裏。我們可以看到
其實是由_START3()跳轉過去的,而_START3()的地址,在linker file(鏈接文件)裡面已經是固定好了的。詳見下圖:
再挖深一點,如果你去編譯完成的.map文件裡面,可以看到函數地址確實如linker file裡面所定義的那樣:
雖然6個核心可以自由開閉,但顯然在某一個時間點上至少需要有一個核心在運行。在官方提供的startup函數裡面【絕大部分情況你都不會需要去改官方的startup函數,最多調一下flag】,只有core0是默認開啟的,從這個角度上來講,core0是主核心。
詳見下圖:
值得提到的一點是,在Tasking的aurix-multi-core-tricore-programming-essentials文檔中,提到各個startup函數會通過一個系統變數
來等待對方,實現各個核心同步/同時啟動的效果,但是在2019年03月及以後英飛凌官方發布的iLLD底層驅動裡面,我發現這個變數已經不再被使用了【也沒有看到替代品】,目前(05/24/2019)還沒有看到Tasking/英飛凌有發布相應的解釋。
在最後,針對ROM再囉嗦一句,
看到這裡的你,鍋燒熱了嗎:P
Reference:
1. AURIXTC3XX_um_part1_V1.1.0.pdf
2. TC39XB_um_appx_V1.1.0.pdf
3. aurix-multi-core-tricore-programming-essentials.pdf
4. ctc_user_guide.pdf
推薦閱讀: