0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于Tricore架構(gòu)的RTThread多核實(shí)現(xiàn)

RTThread物聯(lián)網(wǎng)操作系統(tǒng) ? 來源:未知 ? 2023-09-12 18:40 ? 次閱讀
在《基于Hightec+TC375TP的RT-Thread移植詳解》一文中,基于Tricore實(shí)現(xiàn)了單核RTThread的移植。最近,花了些時(shí)間完成遺留的任務(wù):基于Tricore的多核移植。目前,多數(shù)項(xiàng)目中的單片機(jī)都具備多核,多核單片機(jī)似乎已經(jīng)是項(xiàng)目的標(biāo)配。如果搞汽車電子,不理解OS(Operating System),似乎感覺少了什么,就好像吃面不吃蒜的感覺。對(duì)于多核,又分為同構(gòu)(homogeneous)多核和異構(gòu)(heterogeneous)多核。
  • 同構(gòu)(homogeneous)多核:?jiǎn)纹瑱C(jī)中,多個(gè)Core的結(jié)構(gòu)相同,各個(gè)Core用的指令集相同。
  • 異構(gòu)(heterogeneous)多核單片機(jī)中,多個(gè)Core的結(jié)構(gòu)不同,不同的Core架構(gòu),使用不同的指令集。

本文基于TC397+Tasking實(shí)現(xiàn)SMP(Symmetric Multi-Processing,對(duì)稱多處理),這里的多核屬于同構(gòu)多核。相對(duì)于SMP,AMP(Asymmetric Multi-Processing,非對(duì)稱多處理)主要用于異構(gòu)多核處理。

本文,主要記錄RTThread多核實(shí)現(xiàn)過程中的"雷區(qū)"。

1、RTThread多核實(shí)現(xiàn)細(xì)節(jié)

(一)各Core實(shí)現(xiàn)硬件初始化

由于各個(gè)Core所使用的硬件資源不同,因此,各個(gè)Core在初始化時(shí),需要實(shí)現(xiàn)對(duì)應(yīng)的外設(shè)。eg:提供心跳的系統(tǒng)定時(shí)器(System Timer),本文Core1的外設(shè)初始化在Core1_init()中完成。從核除了初始化自身的硬件以外,還需要調(diào)用rt_system_scheduler_start()接口啟動(dòng)調(diào)度表,代碼示意如下所示:

提示:上述代碼中,從核(Core1)初始化了一個(gè)線程。當(dāng)然,在主核(Core0)完成所有核的線程初始化也可以。

(二)任務(wù)初始化

在Tricore架構(gòu)中,雖然不同Core使用的CSA(Context Save Areas)不同,但是,線程Thread(等同Task)的初始化可以在主核中完成,之后通過rt_thread_control()接口,為線程靜態(tài)分配控制的Core,eg:分配Core1調(diào)度led_thread_thread線程,代碼示意如下:

(三)線程間任務(wù)切換

如果不是systick觸發(fā)的線程切換,即:由于線程狀態(tài)掛起觸發(fā)的線程切換時(shí),需要判斷線程是否上鎖,如果已經(jīng)解鎖,則需要解鎖之后在進(jìn)行線程切換,避免死鎖。多核rt_hw_context_switch()的接口實(shí)現(xiàn)如下所示:

(四)中斷切換標(biāo)志置位時(shí)機(jī)

每次程序進(jìn)入系統(tǒng)心跳中斷服務(wù)例程時(shí),需要先置位中斷切換標(biāo)志Flag,完成系統(tǒng)心跳的累加后復(fù)位。注意:不同于單核處理,多核處理中,此處還需要對(duì)中斷切換進(jìn)行處理,即:判斷程序是否超時(shí),如果超時(shí),則對(duì)應(yīng)的pcpu->irq_switch_flag置位,需要進(jìn)行中斷線程切換處理。代碼實(shí)現(xiàn)如下所示:

(五)線程上鎖/解鎖操作

上鎖處理,對(duì)應(yīng)代碼實(shí)現(xiàn)如下所示:

解釋:__cmpswapw((address), ((unsigned long)value), (condition) ),上鎖處理時(shí),如果address處的值==condition,則將value值賦寫到address位置。在Tricore架構(gòu)中,__cmpswapw操作是原子操作,可以避免多核的并行訪問。

解鎖處理,對(duì)應(yīng)的代碼實(shí)現(xiàn)如下所示:

注意:上鎖/解鎖必須成對(duì)出現(xiàn)。如上代碼中,上鎖/解鎖處理中都有一個(gè)while操作,這也是為什么過多的spinlock會(huì)影響CPU效率的原因。
(六)主核(Core0)與從核(Core1)同步時(shí)機(jī)
主核(Core0)與從核(Core1同步時(shí)機(jī)可以選擇在各自硬件初始化完成后進(jìn)行,否則,從核可能會(huì)訪問到空地址,進(jìn)而進(jìn)入Trap。完成同步后,主/從核進(jìn)行線程操作,代碼示意如下:

(七)空閑線程時(shí)間片設(shè)置
本文修改了空閑線程的默認(rèn)時(shí)間片,由默認(rèn)的32tick修改為10個(gè)tick,目的:保證調(diào)度的準(zhǔn)確性。為什么這樣改?暫時(shí)未細(xì)查,留給未來。

(八)確認(rèn)線程是否在目標(biāo)Core運(yùn)行

如果想確認(rèn)線程是否在目標(biāo)Core運(yùn)行,在目標(biāo)線程設(shè)置一個(gè)斷點(diǎn)(Breakpoint)即可,如下所示:

2、RTThread任務(wù)調(diào)度

本文Core0創(chuàng)建了一個(gè)主線程main_thread(周期:50ms),一個(gè)空閑線程idle[0];Core1創(chuàng)建了兩個(gè)線程led_thread_thread(周期:20ms)、core1_thread_1(周期:30ms),以及一個(gè)空閑線程idle[1]。
(一)main_thread運(yùn)行周期

(二)led_thread_thread運(yùn)行周期

(三)core1_thread_1運(yùn)行周期

提示:本文所有線程,靜態(tài)創(chuàng)建。

2、源碼鏈接

多核與單核的切換,在rtconfig.h文件中,使能或者關(guān)閉宏RT_USING_SMP即可打開/禁用SMP。

本文的RTThread中,啟用了2個(gè)Core(主核Core0,一個(gè)從核Core1),如果需要啟用更多的從核,可以在本文的基礎(chǔ)上打開其余從核,其余從核的處理與Core1類似。

受限于時(shí)間和我的水平,本文在零零碎碎的時(shí)間里整理完,實(shí)現(xiàn)未必最優(yōu)。而且,我并未嚴(yán)格的按照RTThread的架構(gòu)處理,寫的稍微有些隨心所欲。大家可以基于我的工程進(jìn)行調(diào)試和二次開發(fā),以便于達(dá)到理解OS內(nèi)核、任務(wù)切換等相關(guān)知識(shí)。

源碼鏈接地址如下:

https://github.com/Kaixinguo2021/Tasking_TC397_MultiCore_RTThread.git

往期精彩回顧




Autosar往期精彩文章匯總:1~70
Autosar往期精彩文章匯總:71~100
Autosar往期精彩文章匯總:101~150

Autosar往期精彩文章匯總:151~200

Autosar往期精彩文章匯總:201~251

CAN通信:Busoff問題知多少

NVM基礎(chǔ):解讀"切頁(yè)"的頭部信息

診斷基礎(chǔ):Event內(nèi)存管理

Autosar通信模塊COM:Update-Bits詳解

Lin總線基礎(chǔ):為什么Master節(jié)點(diǎn)需要外接上拉電阻


點(diǎn)擊下方關(guān)注,一起聊聊Autosar/嵌入式,如果需要,聯(lián)系作者進(jìn)群,給你更專業(yè)的解答


———————End——————



點(diǎn)擊閱讀原文報(bào)名


原文標(biāo)題:基于Tricore架構(gòu)的RTThread多核實(shí)現(xiàn)

文章出處:【微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • RT-Thread
    +關(guān)注

    關(guān)注

    31

    文章

    1289

    瀏覽量

    40135

原文標(biāo)題:基于Tricore架構(gòu)的RTThread多核實(shí)現(xiàn)

文章出處:【微信號(hào):RTThread,微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    請(qǐng)問AURIX TC3xx tricore架構(gòu)下浮點(diǎn)運(yùn)算和將浮點(diǎn)數(shù)小數(shù)點(diǎn)去掉變成整數(shù)來計(jì)算哪種方式更加節(jié)省算力?

    AURIX TC3xx tricore架構(gòu)下浮點(diǎn)運(yùn)算和將浮點(diǎn)數(shù)小數(shù)點(diǎn)去掉變成整數(shù)來計(jì)算哪種方式更加節(jié)省算力? 比如一個(gè)浮點(diǎn)數(shù)12.89V,如果將其寫成12890mV,再參與計(jì)算,哪種方式更加節(jié)省算力
    發(fā)表于 08-26 06:54

    請(qǐng)問rtthread的外設(shè)驅(qū)動(dòng)為什么不實(shí)現(xiàn)posix接口?

    外設(shè)驅(qū)動(dòng)想支持posix接口,如select\\poll、read、write、ioctl,希望能支持異步通知、輪詢、batch設(shè)置功能。但是rtthread在通過
    發(fā)表于 07-15 06:34

    Tricore MCU是否只能在特定時(shí)序下識(shí)別連接了OCDS?

    我使用的是 Tricore TC37x 和 TC36x。 據(jù)我所知,當(dāng)連接 OCDS 調(diào)試器時(shí),Tricore 會(huì)暫停其看門狗定時(shí)器。 我想知道的是,Tricore MCU 是否只能在特定時(shí)序下識(shí)別
    發(fā)表于 07-05 07:48

    求助,關(guān)于ESP32多核使用問題求解答

    關(guān)于esp32的多核使用,除了使用xTaskCreatePinnedToCore函數(shù)來控制線程跑的核心外能否有其他的實(shí)現(xiàn)比如: 現(xiàn)在有兩個(gè)bin文件,每個(gè)核心同時(shí)跑不同的bin文件,這種是否能夠實(shí)現(xiàn)。
    發(fā)表于 06-17 06:28

    Tricore Tc397 SPI能否發(fā)送超過32位的幀呢?

    我正在研究 Tricore Tc397 SPI。 看起來,datawith 是 2-32 位。 是否有辦法在一個(gè)幀中通過 SPI 發(fā)送超過 32 位(例如 64 位)的數(shù)據(jù)? 這里的一幀是指 CS 保持低電平,SCLK 持續(xù)。
    發(fā)表于 05-28 07:16

    使用AURIX studio開發(fā)帶有FreeRTOS的MCU TC387-QP TriCore,如何實(shí)現(xiàn)GPIO ISR功能?

    我正在使用 AURIX studio 開發(fā)帶有 FreeRTOS 的 MCU TC387-QP TriCore。 誰能指導(dǎo)我們?nèi)绾?b class='flag-5'>實(shí)現(xiàn) GPIO ISR 功能?
    發(fā)表于 05-28 06:19

    Tricore TC37x和TC36x是否只有在Tricore MCU啟動(dòng)時(shí)連接了調(diào)試器,看門狗定時(shí)器才會(huì)停止?

    我使用的是 Tricore TC37x 和 TC36x。 據(jù)我所知,當(dāng)連接 OCDS 調(diào)試器時(shí),Tricore 會(huì)暫停其看門狗定時(shí)器。 我想知道的是,Tricore MCU 是否只能在特定時(shí)序下識(shí)別
    發(fā)表于 05-21 07:29

    微內(nèi)核實(shí)時(shí)操作系統(tǒng)的介紹

    微內(nèi)核實(shí)時(shí)操作系統(tǒng)(Microkernel Real-Time Operating System, μRTOS)是一種專為實(shí)時(shí)設(shè)計(jì)的操作系統(tǒng)。它采用微內(nèi)核架構(gòu),以提高系統(tǒng)的可靠性、安全性和可擴(kuò)展性。以下是關(guān)于微內(nèi)核實(shí)時(shí)操作系統(tǒng)的
    的頭像 發(fā)表于 05-11 17:13 ?505次閱讀

    risc-v多核芯片在AI方面的應(yīng)用

    RISC-V多核芯片在AI方面的應(yīng)用主要體現(xiàn)在其低功耗、低成本、靈活可擴(kuò)展以及能夠更好地適應(yīng)AI算法的不同需求等特點(diǎn)上。 首先,RISC-V適合用于高效設(shè)計(jì)實(shí)現(xiàn),其內(nèi)核面積更小,功耗更低,使得它能
    發(fā)表于 04-28 09:20

    多核架構(gòu)高性能電機(jī)控制芯片

    基于傳統(tǒng)單核架構(gòu)的電機(jī)控制芯片已無法應(yīng)對(duì)新出現(xiàn)的嚴(yán)峻挑戰(zhàn),多核架構(gòu)的控制芯片應(yīng)運(yùn)而生。雙核架構(gòu)芯片已在許多領(lǐng)域成功應(yīng)用,并顯示出其獨(dú)特的優(yōu)勢(shì),可以利用無傳感器技術(shù)
    的頭像 發(fā)表于 04-19 14:46 ?8371次閱讀
    <b class='flag-5'>多核</b><b class='flag-5'>架構(gòu)</b>高性能電機(jī)控制芯片

    下載的free_tricore_entry_tool_chain里的Compiler安裝包時(shí)出現(xiàn)閃退,安裝不了是為什么?

    為什么我打開我下載的free_tricore_entry_tool_chain里的Compiler安裝包時(shí)出現(xiàn)閃退,安裝不了?。壳笾?/div>
    發(fā)表于 02-20 07:13

    DAS能顯示TriCore,UDE或Memtool無法連接的原因?

    打開DAS Device Scanner,列表里顯示了TriCore-Family(點(diǎn)擊其右邊的Start Client,顯示DAS Error:DEVICE_LOCKED),用UDE或Memtool連接卻提示Can\'t connect target。大家有知道為什么嗎
    發(fā)表于 02-19 07:19

    hightec新建工程的向?qū)ы?yè)面沒有TriCore板可選,是否安裝失敗了?

    hightec新建工程的向?qū)ы?yè)面沒有TriCore板可選,是否安裝失敗了(已添加license)
    發(fā)表于 02-06 07:05

    求助,在TASKING軟件里如何建立多核工程并能實(shí)現(xiàn)3個(gè)核運(yùn)行?

    論壇里看到有基于BaseFramework框架的多核工程,但是怎么在TASKING里直接創(chuàng)建工程?我在TASKING里新建多核工程,并通過SoftwarePlatform插件代碼生成來生成完整的各種
    發(fā)表于 02-05 09:09

    “tc1.3”編譯報(bào)錯(cuò)不允許使用向量表編號(hào)TriCore?怎么解決?

    “tc1.3” TriCore? 不允許使用矢量表編號(hào)
    發(fā)表于 01-22 08:33