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

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

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

AUTOSAR架構(gòu)下的多核通信介紹

832065824 ? 來源:汽車電子嵌入式 ? 2023-11-13 09:24 ? 次閱讀

前言

隨著汽車ECU迅速的往域控制器方向發(fā)展,ECU要處理的任務(wù)越來越多,單核CPU的負(fù)載越來越大,多核ECU勢在必行。AUTOSAR架構(gòu)下OS支持多核處理,本系列文章將詳細(xì)介紹AUTOSAR架構(gòu)下的多核機(jī)制。本文介紹AUTOSAR架構(gòu)下的多核通信。

問題 1: 什么是共享內(nèi)存(Shared Memory),共享內(nèi)存需要在鏈接文件中特別指定嗎?

問題 2:如果要指定共享內(nèi)存,該怎么指定?

問題3: 用于多核通信的共享內(nèi)存一定需要使用SpinLock進(jìn)行一致性保護(hù)嗎?

問題4: 如何確保單核中的數(shù)據(jù)一致性?

92ef8988-81c2-11ee-939d-92fbcf53809c.jpg

參考文檔:

AUTOSAR架構(gòu)下多核啟動(dòng)

AUTOSAR架構(gòu)下多核Shutdown

TC3xx芯片MPU介紹

MPU功能詳解-以RH850U2A為例

縮略詞

簡寫 全稱
IOC Inter-OS-Application Communicator

注:本文章引用了一些第三方工具和文檔,若有侵權(quán),請聯(lián)系作者刪除!

正文

1.多核通信介紹

使用多核的ECU避免不了需要考慮跨核通信,如下圖所示,跨核通信時(shí)使用RTE進(jìn)行跨核通信時(shí),AUTOSAR定義了標(biāo)準(zhǔn)的IOC通信,用戶只需要配置SWC的端口接口進(jìn)行Mapping,IOC的具體實(shí)現(xiàn)由RTE/OS自動(dòng)實(shí)現(xiàn),不用用戶再做其他的操作。如果不使用RTE進(jìn)行多核通信,沒有標(biāo)準(zhǔn)的接口可以使用,需要用戶自定義跨核通信,著重需要考慮跨核通信的共享內(nèi)存及數(shù)據(jù)一致性保護(hù)。

9311c016-81c2-11ee-939d-92fbcf53809c.png

Figure 1: 多核通信

2.多核間標(biāo)準(zhǔn)通信

多核間通信一定是跨OS-Application的通信(OS-Application不能跨核,所以兩個(gè)不同核上的SWC一定隸屬于不同的OS-Application),而“IOC”負(fù)責(zé)操作OS-Application之間的通信,特別是跨越核或內(nèi)存保護(hù)邊界的通信。

2.1 什么是IOC

IOC全稱為Inter-OS-Application Communication,專門用于跨OS-Application的通信方式,特別的,跨越核或內(nèi)存保護(hù)邊界的通信一般都使用IOC通信。

2.2 IOC的適用范圍

IOC的具體實(shí)現(xiàn)由RTE和OS實(shí)現(xiàn),所以,IOC只適用于通過RTE交互的SWC間的跨OS-Application的通信,或通過RTE交互的SWC和BSW跨OS-Application通信,或者通過RTE交互的CDD和SWC或者CDD和CDD間的跨OS-Application通信。總之,不經(jīng)過RTE的通信不適用IOC通信。

2.3 IOC的通信種類

IOC不支持Client-Server的通信,只支持Sender-Receiver的通信方式,SWC間的Client-Server通信在RTE/OS的具體實(shí)現(xiàn)中轉(zhuǎn)變?yōu)?Sender-Receiver的通信方式。也就是說對于SWC的開發(fā)者來說,不用做任何的更改,C-S的接口依然可以繼續(xù)使用。

從IOC的Senders和Receivers個(gè)數(shù)來分:IOC支持1:1, N:1, N:M的通信方式。

從是否帶Notification的角度來分:IOC分為帶Notification和不帶Notification的通信方式。

IOC通信支持隊(duì)列緩存(queue buffer),1:1和N:1通信方式支持隊(duì)列,N:M通信方式不支持隊(duì)列,1:1的通信方式一般不使用隊(duì)列,N:1通信方式一般使用隊(duì)列。

2.3 IOC通信配置

兩個(gè)SWC如果使用IOC通信的話,接口配置和不使用IOC通信完全一樣。

配置Data Type

配置Interface

配置P-port和R-Port

進(jìn)行P-port和R-port連接(Mapping)

不過,兩個(gè)SWC如果要使用IOC跨核(跨OS-Application)通信,這兩個(gè)SWC的Runnable所在的Task一定時(shí)歸屬于兩個(gè)核上的不同OS-Application,這樣進(jìn)行Port連接后,RTE和OS會(huì)自動(dòng)為兩個(gè)SWC生產(chǎn)IOC通信接口和具體實(shí)現(xiàn)。

2.4 IOC通信的共享內(nèi)存和數(shù)據(jù)保護(hù)

IOC通信的具體實(shí)現(xiàn)由共享內(nèi)存的方式實(shí)現(xiàn),共享內(nèi)存的跨核間數(shù)據(jù)一致性保護(hù)由Spin lock保證,共享內(nèi)存的核內(nèi)Task間的數(shù)據(jù)一致性保護(hù)由開/關(guān)全局中斷的方式保證。共享內(nèi)存和數(shù)據(jù)一致性保護(hù)都由OS來自動(dòng)生成和保證。

93422008-81c2-11ee-939d-92fbcf53809c.png

9363c122-81c2-11ee-939d-92fbcf53809c.png

Note: 如果IOC通信間的數(shù)據(jù)長度小于等于4 Bytes,那么RTE/OS不會(huì)為其生成Spin lock和開關(guān)中斷的配置代碼,因?yàn)?2bit的MCU的一次機(jī)器周期操作能完成4字節(jié)數(shù)據(jù)的操作,保證了數(shù)據(jù)的原子操作。

938ef586-81c2-11ee-939d-92fbcf53809c.png

2.5 IOC通信需要注意的其他點(diǎn)

單核內(nèi)如果存在多個(gè)OS-Application,且OS-Application間由內(nèi)存保護(hù)的邊界(boundaries

),這種單核場景也適用IOC通信。

在只有一個(gè)Core的系統(tǒng)中,如果只有一個(gè)OS-Application,或者如果沒有OS-Application使用內(nèi)存保護(hù)機(jī)制,那么IOC可以被完全省略。

帶Notification的IOC適用二類中斷ISR來通知Receivers數(shù)據(jù)已經(jīng)到達(dá)shared buffer,能保證Receiver及時(shí)的取得數(shù)據(jù)。

2.6 IOC通信的示例

2.6.1 SWC間通過S-R方式1:1通信且沒有Notification

如圖2所示,Core 0上的SWC通過RTE接口給Core 1上的SWC發(fā)送數(shù)據(jù)。接收端的可運(yùn)行實(shí)體被定期調(diào)用(調(diào)度表或者Alarm機(jī)制實(shí)現(xiàn)),并通過RTE接收數(shù)據(jù)。

由于通信跨越了核心邊界,RTE調(diào)用IOC將數(shù)據(jù)從Core0傳輸?shù)紺ore1。

數(shù)據(jù)發(fā)送方調(diào)用

Rte_Send__ (..., )

Rte_Write_SWC_PortName(VAR(rt_Array_uint8_8, AUTOMATIC) data) /* 2 */
{
  VAR(Std_ReturnType, AUTOMATIC) rtn;
  rtn = ((VAR(Std_ReturnType, AUTOMATIC))RTE_E_OK);
  (void)IocWrite_Rte_Rx_000139(data);
  return rtn;
}

RTE將其mapped 到

IocSend_ ()

FUNC(Std_ReturnType, OS_CODE) IocWrite_Rte_Rx_000139(const rt_Array_uint8_8 *value)
{ 
  Os_imaskType previous_imask;
  previous_imask = OS_STSR(OS_PLMR_REGID, OS_PLMR_SELID); OS_LDSR(OS_PLMR_REGID, OS_PLMR_SELID, 0U);
  while (0U != Os_TestAndSet(&Os_IocLockData.Os_IocLock_Rte_Rx_000139)) { /* spin */ }
  Os_ioc_memcpy(&Os_Ioc_Rte_Rx_000139, value, sizeof(*value)); /*lint !e545 */
  OS_SYNCM(); Os_IocLockData.Os_IocLock_Rte_Rx_000139 = 0U;
  OS_LDSR(OS_PLMR_REGID, OS_PLMR_SELID, previous_imask);
  return IOC_E_OK;
}

93ae0656-81c2-11ee-939d-92fbcf53809c.png

Figure 2: IOC without notification

在本例中,IocSend服務(wù)將數(shù)據(jù)寫入一個(gè)緩沖區(qū),該緩沖區(qū)位于一個(gè)共享內(nèi)存區(qū)中,接收方可以通過IOC讀取該數(shù)據(jù)。在接收端,接收可運(yùn)行程序被定期調(diào)用。

Rte_Receive__ (..., )

Rte_Read_SWC_PortName(CONSTP2VAR(rt_Array_uint8_8, AUTOMATIC, RTE_APPL_DATA) data) 
{
  VAR(Std_ReturnType, AUTOMATIC) rtn;
  (void)IocRead_Rte_Rx_000139(((P2VAR(rt_Array_uint8_8, AUTOMATIC, RTE_APPL_DATA))data));
  rtn = Rte_Rx_000139_status;
  return rtn;
}

RTE將其mapped 到

IocReceive_ ()

調(diào)用以從IOC內(nèi)部隊(duì)列中讀取數(shù)據(jù)。1:1通信不需要RTE中的附加隊(duì)列。

FUNC(Std_ReturnType, OS_CODE) IocRead_Rte_Rx_000138(rt_Array_uint8_8 *value) {
  Os_imaskType previous_imask;
  previous_imask = OS_STSR(OS_PLMR_REGID, OS_PLMR_SELID); OS_LDSR(OS_PLMR_REGID, OS_PLMR_SELID, 0U);
  while (0U != Os_TestAndSet(&Os_IocLockData.Os_IocLock_Rte_Rx_000139)) { /* spin */ }
  Os_ioc_memcpy(value, &Os_Ioc_Rte_Rx_000138, sizeof(*value)); /*lint !e545 */
  OS_SYNCM(); Os_IocLockData.Os_IocLock_Rte_Rx_000139 = 0U;
  OS_LDSR(OS_PLMR_REGID, OS_PLMR_SELID, previous_imask);
  return IOC_E_OK;
}

這種無通知的端口對端口通信適用于:

Sender/Receiver通信

隊(duì)列或者非隊(duì)列通信

1:1通信方式

2.6.2 SWC間通過C-S方式通信有Notification

當(dāng)數(shù)據(jù)寫入IOC內(nèi)部數(shù)據(jù)緩存后,Rte函數(shù)調(diào)用OS的服務(wù)來激活接收任務(wù)。這種通信方式適用于:

帶Notification的SWC間的Sender/receiver通信;

Client/server通信。

隊(duì)列或非隊(duì)列通信;

非polling模式的1:1通信;

N:1通信。

93d97a70-81c2-11ee-939d-92fbcf53809c.png

Figure2: IOC with notification by RTE

用長度為100的隊(duì)列方式實(shí)現(xiàn)。

Std_ReturnType IocReceive_Rte_Rx_000022(uint8* value)
{
  *value = Os_Ioc_Rte_ Rx_000022[read_index];
  read_index = (read_index == 100)? 0 : (read_index + 1U);
  return E_OK;
}


Std_ReturnType IocSend_Rte_Rx_000022(uint8 value)
{
  If ((read_index == 0 && write_index == 100)|| (read_index-write_index==1)) {
  return IOC_E_FULL;
  } else {
  Os_Ioc_Rte_ Rx_000022[write_index] = val;
  write_index = (write_index == 100)? 0 : (write_index + 1U);
  Os_SetEvent(EventID);
  }
}

3.多核間非標(biāo)準(zhǔn)通信

從第2章節(jié)得知:

IOC通信的的共享內(nèi)存也就是OS定義的全局變量

對共享內(nèi)存的數(shù)據(jù)一致性保護(hù)也就是通過Spin Lock和開關(guān)中斷來實(shí)現(xiàn),

共享內(nèi)存小于等于4 bytes,可以不使用Spin Lock和中斷保護(hù)

如果沒有開啟內(nèi)存保護(hù)(MPU),共享內(nèi)存可以分配在.default段(不用特別的去修改鏈接文件定義特殊的段),也就是任意可訪問RAM地址

只不過這些都由RTE和OS自動(dòng)實(shí)現(xiàn),對于用戶只要做好Port連接即可。

那么對于不經(jīng)過RTE的多核通信,我們是否可以自己實(shí)現(xiàn)多核通信了?-- 肯定是可以的,下面我就列出一些多核通信的場景及應(yīng)該考慮的地方。

序號 兩個(gè)跨核SWC所在OS-Application情況 通信數(shù)據(jù)長度 共享內(nèi)存 數(shù)據(jù)一致性保護(hù)
1 Core0-SWC和Core1-SWC所在OS-Application都無內(nèi)存保護(hù)機(jī)制 小于等于4 Bytes(32-bit MCU) 不用在鏈接文件特殊定義共享內(nèi)存段,直接使用.default Data段 不用spin lock保護(hù);
不用開關(guān)全局中斷保護(hù)
2 Core0-SWC和Core1-SWC所在OS-Application都無內(nèi)存保護(hù)機(jī)制 大于4 Bytes(32-bit MCU) 不用在鏈接文件特殊定義共享內(nèi)存段,直接使用.default Data段 需要spin lock保護(hù);
如果該Shared buffer同一個(gè)核中不同Task間讀寫情況,就需要開關(guān)全局中斷保護(hù)。
3 Core0-SWC和Core1-SWC所在OS-Application有內(nèi)存保護(hù)機(jī)制 小于等于4 Bytes(32-bit MCU) 需要在鏈接文件定義兩個(gè)OS-Application都能訪問的共享內(nèi)存段 不用spin lock保護(hù);
不用開關(guān)全局中斷保護(hù)
4 Core0-SWC和Core1-SWC所在OS-Application有內(nèi)存保護(hù)機(jī)制 大于4 Bytes(32-bit MCU) 需要在鏈接文件定義兩個(gè)OS-Application都能訪問的共享內(nèi)存段 需要spin lock保護(hù);
如果該Shared buffer同一個(gè)核中不同Task間讀寫情況,就需要開關(guān)全局中斷保護(hù)。

關(guān)于MPU請參考:

TC3xx芯片MPU介紹

4.總結(jié)

問題 1: 什么是共享內(nèi)存(Shared Memory),共享內(nèi)存需要在鏈接文件中特別指定嗎?

:兩個(gè)或多個(gè)OS-Application都能訪問的內(nèi)存區(qū)域即為共享內(nèi)存區(qū)域。如果沒有使能MPU內(nèi)存保護(hù)機(jī)制,任意定義的全局變量即為共享內(nèi)存變量。如果使能了MPU內(nèi)存保護(hù)機(jī)制,就需要在鏈接文件中定義共享內(nèi)存段,同時(shí)需要配置MPU保護(hù)段并分配給OS-Application。

問題 2:如果要指定共享內(nèi)存,該怎么指定?

:在鏈接文件中指定一塊內(nèi)存區(qū)域,然后配置MPU設(shè)置其讀寫訪問屬性,需要多核通信的OS-Application應(yīng)該包括該MPU配置即擁有對該共享內(nèi)存的讀寫訪問權(quán)限。

問題3: 用于多核通信的共享內(nèi)存一定需要使用Spin Lock進(jìn)行一致性保護(hù)嗎?

:不一定。當(dāng)多核通信的數(shù)據(jù)小于等于4 Bytes(32-bit MCU)時(shí)CPU一個(gè)機(jī)器周期就能完成數(shù)據(jù)的讀寫,已經(jīng)是原子操作,不用使用Spin lock進(jìn)行數(shù)據(jù)一致性保護(hù)。

問題4: 如何確保單核中的數(shù)據(jù)一致性?

:使用開關(guān)/掛起全局核內(nèi)全局中斷。

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

    關(guān)注

    2

    文章

    566

    瀏覽量

    34352
  • 通信
    +關(guān)注

    關(guān)注

    18

    文章

    6032

    瀏覽量

    135995
  • AUTOSAR
    +關(guān)注

    關(guān)注

    10

    文章

    362

    瀏覽量

    21588
  • ecu
    ecu
    +關(guān)注

    關(guān)注

    14

    文章

    886

    瀏覽量

    54504

原文標(biāo)題:AUTOSAR架構(gòu)下多核通信

文章出處:【微信號:汽車電子嵌入式,微信公眾號:汽車電子嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    AUTOSAR分層架構(gòu)

    AUTOSAR分層架構(gòu)
    發(fā)表于 09-26 11:12

    AUTOSAR架構(gòu)深度解析 精選資料推薦

    AUTOSAR架構(gòu)深度解析本文轉(zhuǎn)載于:AUTOSAR架構(gòu)深度解析目錄AUTOSAR架構(gòu)深度解析
    發(fā)表于 07-28 07:40

    AUTOSAR架構(gòu)深度解析 精選資料分享

    AUTOSAR架構(gòu)深度解析本文轉(zhuǎn)載于:AUTOSAR架構(gòu)深度解析AUTOSAR的分層式設(shè)計(jì),用于支持完整的軟件和硬件模塊的獨(dú)立性(Indep
    發(fā)表于 07-28 07:02

    嵌入式異構(gòu)多核的片上通信架構(gòu)設(shè)計(jì)

    為了克服目前嵌入式異構(gòu)多核處理器的片上通信架構(gòu)無法提供高效的異構(gòu)多核協(xié)作架構(gòu)的問題,本文分析了嵌入式異構(gòu)
    發(fā)表于 12-04 11:30 ?26次下載

    AUTOSAR架構(gòu)的WdgDriver WdgIf WdgM模塊

    本文主要介紹AUTOSAR 架構(gòu)的WdgDriver WdgIf WdgM 模塊,分析模塊之間的依賴關(guān)系以及運(yùn)行原理以幫助快速理解。本文以MPC5746R為主控芯片,以FS6500為
    的頭像 發(fā)表于 09-09 11:17 ?6456次閱讀

    AUTOSAR分層架構(gòu)介紹及SmartSAR studio使用總結(jié)

    AUTOSAR分層架構(gòu)
    發(fā)表于 03-28 16:44 ?11次下載

    AUTOSAR是什么?AUTOSAR軟件架構(gòu)簡介

    AUTOSAR的全稱是AUTomotive Open System Architecture,直譯為汽車開放系統(tǒng)架構(gòu)
    的頭像 發(fā)表于 07-08 17:26 ?1.3w次閱讀
    <b class='flag-5'>AUTOSAR</b>是什么?<b class='flag-5'>AUTOSAR</b>軟件<b class='flag-5'>架構(gòu)</b>簡介

    AutoSAR構(gòu)架以及在多核汽車MCU的運(yùn)行

    ),一般是核間通信用 SWC即Software Component縮寫,一般位于AUTOSAR架構(gòu)的Application層 AUTOSAR分四層:Application、RTE(Ru
    的頭像 發(fā)表于 07-24 10:57 ?2550次閱讀
    <b class='flag-5'>AutoSAR</b>構(gòu)架以及在<b class='flag-5'>多核</b>汽車MCU的運(yùn)行

    基于Tricore芯片的AUTOSAR架構(gòu)多核啟動(dòng)

    隨著汽車ECU迅速的往域控制器方向發(fā)展,ECU要出來任務(wù)越來越多,單核CPU的負(fù)載越來越大,多核ECU勢在必行。AUTOSAR架構(gòu)OS支持多核
    的頭像 發(fā)表于 10-23 10:15 ?3243次閱讀
    基于Tricore芯片的<b class='flag-5'>AUTOSAR</b><b class='flag-5'>架構(gòu)</b><b class='flag-5'>下</b>的<b class='flag-5'>多核</b>啟動(dòng)

    AUTOSAR架構(gòu),持續(xù)集成CI的最佳實(shí)踐

    集成(CI)流程。今天,我們就來探討一基于AUTOSAR架構(gòu)的CI流程實(shí)踐,并通過對流程的詳細(xì)講解,展示其在實(shí)際開發(fā)中的重要性和優(yōu)勢。什么是AUTOSAR
    的頭像 發(fā)表于 10-24 08:06 ?480次閱讀
    <b class='flag-5'>AUTOSAR</b><b class='flag-5'>架構(gòu)</b><b class='flag-5'>下</b>,持續(xù)集成CI的最佳實(shí)踐

    AUTOSAR通信協(xié)議解析 如何實(shí)現(xiàn)AUTOSAR通信

    AUTOSAR(Automotive Open System Architecture)即汽車開放系統(tǒng)架構(gòu),該架構(gòu)支持汽車電子控制單元(ECU)之間的通信,實(shí)現(xiàn)了高度模塊化和可重用性。
    的頭像 發(fā)表于 12-17 14:54 ?496次閱讀

    AUTOSAR通信組件介紹 AUTOSAR通信層功能分析

    AUTOSAR通信組件介紹 AUTOSAR(AUTomotive Open System ARchitecture)是一個(gè)全球性的汽車軟件架構(gòu)
    的頭像 發(fā)表于 12-17 14:55 ?228次閱讀

    AUTOSAR通信框架的優(yōu)勢 AUTOSAR通信實(shí)例與應(yīng)用場景

    AUTOSAR通信框架的優(yōu)勢 AUTOSAR(AUTomotive Open System ARchitecture)是一個(gè)全球性的汽車軟件架構(gòu)合作伙伴計(jì)劃,旨在創(chuàng)建并建立一個(gè)開放的標(biāo)
    的頭像 發(fā)表于 12-17 14:58 ?246次閱讀

    AUTOSAR通信堆棧的配置 AUTOSAR通信模塊測試方法

    )的開發(fā)和生產(chǎn)。通信堆棧是AUTOSAR架構(gòu)中的關(guān)鍵組成部分,負(fù)責(zé)處理ECU之間的通信。 AUTOSAR
    的頭像 發(fā)表于 12-17 15:01 ?259次閱讀

    AUTOSAR通信與網(wǎng)絡(luò)安全 AUTOSAR通信在車輛中的應(yīng)用

    架構(gòu)合作伙伴計(jì)劃,旨在創(chuàng)建并建立一個(gè)開放的標(biāo)準(zhǔn)化軟件架構(gòu),以簡化汽車電子控制單元(ECU)的開發(fā)和生產(chǎn)。 1. AUTOSAR通信概述 AUTOSA
    的頭像 發(fā)表于 12-17 15:06 ?250次閱讀