Tricore內(nèi)核上下文切換機(jī)制CSA--Apple的學(xué)習(xí)筆記

動(dòng)機(jī)

FreeRTOS在port.c中都是和內(nèi)核相關(guān)的,我就是想了解清楚TC2上下文切換的機(jī)制。所以看pxPortInitialiseStack函數(shù),里面主要是初始化CSA,在FreeRTOS任務(wù)創(chuàng)建函數(shù)中會(huì)調(diào)用,另外還看了xPortStartScheduler函數(shù),這里面主要是處理上下文切換。
本來在看core寄存器說明文檔,里面有說上下文切換保存和恢復(fù)的機(jī)制。

問題1

里面說到NEW_FCX,而且是用戶不可操作的,另外還說道LINK WORD和PCXI關(guān)聯(lián),值是一樣的,那么用戶怎么操作呢?這部分不太理解。

問題2

為什么切換任務(wù)的時(shí)候要用rslcx,而且一開始初始化任務(wù)的時(shí)候要用lower+Up2個(gè)CSA,文檔中說的都是or,而且主要都是說產(chǎn)生中斷或trip會(huì)自動(dòng)保存lower,為什么還要手動(dòng)操作呢?

突破

帶著這2個(gè)問題,我不了解代碼為什么要這樣設(shè)計(jì),感覺混亂的原因是先有雞還是先有蛋的感覺。于是乎網(wǎng)上搜索看看有沒有線索,接著真的找到我想要的了,幫助我解決了理解問題,現(xiàn)在代碼能夠完全看懂。并且調(diào)試驗(yàn)證他理解的是正確的。
FreeRTOS任務(wù)創(chuàng)建、啟動(dòng)調(diào)度器、任務(wù)切換過程分析——基于Tricore1.6
看了他的文章后,我發(fā)現(xiàn)PCXI就是LINK WORD,之前沒有搜索到,因?yàn)樵趫D片中。

調(diào)試驗(yàn)證通過

FreeRTOS任務(wù)啟動(dòng)驗(yàn)證.png

小結(jié):

重要的理解就是PCXI就是鏈表(連接線),所以PCXI可以理解為一個(gè)指針箭頭。FCX的值綁定到連接線,即FCX指向了pulUpperCSA的下一個(gè)。

怎么區(qū)分低級(jí)還是高級(jí)上下文的呢?也就是說必須低級(jí)的下一個(gè)連接到高級(jí),不能高級(jí)的下一個(gè)連接到低級(jí)?對稱性,save2個(gè),所以要restore2個(gè)。

基于這樣的理解,我準(zhǔn)備之后自己嘗試,初始化只建立一個(gè)lowerCSA,那么啟動(dòng)任務(wù)的時(shí)候只要恢復(fù)一個(gè)lowerCSA即可。明天繼續(xù)驗(yàn)證我的猜想。

寄存器參考

UpperAndLower.png

2020/4/7更新

昨夜遺留了一個(gè)想法,就是只使用一個(gè)lowerCSA可否,今天看了內(nèi)核手冊,發(fā)現(xiàn)應(yīng)該是不可以的。于是修改了代碼只用一個(gè)lowerCSA或upperCSA,調(diào)試結(jié)果也顯示不可行。

答案從如下3方面來描述

  1. 從CSA區(qū)域功能角度。只有一個(gè)CSA,不使用lower和upper的組合的話,缺少參數(shù)A[4]。
  2. 最重要的一點(diǎn)就是Upper是自動(dòng)保存和恢復(fù)的。即保存和恢復(fù)LINK word鏈表指向的CSA內(nèi)的16個(gè)word的數(shù)據(jù)(這些數(shù)據(jù)會(huì)綁定到A和D寄存器中),而我無法直接為A11(RA)賦值,必須要通過PCXI指向的CSA區(qū)域中的A11賦值才可行。


    自動(dòng)保存upper.png
  3. 也不能通過mfcr向PCX來讀取當(dāng)前地址,通過地址+4來為當(dāng)前的A11賦值。因?yàn)橐蛔x取,PCXI就自動(dòng)從鏈表中移除,指向下一個(gè)鏈表。


    上下文恢復(fù)機(jī)制.png

有了以上3點(diǎn),就說明我必須要自己制作lower的內(nèi)容,然后通過rslcx指令手工恢復(fù),由于退出函數(shù)會(huì)自動(dòng)執(zhí)行恢復(fù)UpperCSA,所以還在LowerCSA后面還要自己再連接一個(gè)UpperCSA。這樣自動(dòng)執(zhí)行退出函數(shù)的時(shí)候,能找到我準(zhǔn)備的自定義跳轉(zhuǎn)函數(shù),這樣就進(jìn)入了下一個(gè)我期待的函數(shù)了。Tricore的上下文切換的寄存器原來是要這么操作的。哈哈~

這么驗(yàn)證實(shí)驗(yàn)一下,使我對Tricore上下文切換理解的更加深入了。pxPortInitialiseStack和xPortStartScheduler函數(shù)的理解也更加深刻了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 理解平均負(fù)載( Load Average),并用三個(gè)案例展示了不同場景下平均負(fù)載升高的分析方法。這其中,多個(gè)進(jìn)程競...
    養(yǎng)碼哥閱讀 1,417評(píng)論 0 1
  • what 大多數(shù)RTOS實(shí)現(xiàn)都提供了類似此一對函數(shù)功能的對應(yīng)接口,需要開發(fā)者主動(dòng)地分別在中斷服務(wù)函數(shù)(ISR)的開...
    蘇里南公牛閱讀 1,787評(píng)論 0 0
  • 仔細(xì)回想過去的自己該是有多么的天真和愚蠢。為了他放棄了自己的專業(yè),離家萬里,跟著他天南地北的跑!乖巧到大門不出二門...
    精神上的乞丐閱讀 277評(píng)論 0 1
  • 《人間失格》是日本反秩序派代表作家太宰治的絕筆之作,書中塑造了一個(gè)悲劇性人物——葉藏,主人公性格抑郁敏感,天生害怕...
    成好運(yùn)閱讀 407評(píng)論 1 0
  • 有人來就有人走,有人走就有人來,這就是部隊(duì)的紀(jì)律,無論干部戰(zhàn)士,都有面臨這一天的到來。算不上建議,也是這些年和退伍...
    大尾巴老貓閱讀 271評(píng)論 0 6

友情鏈接更多精彩內(nèi)容