前言
隨著汽車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ù)一致性?
參考文檔:
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ù)。
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)生成和保證。
Note: 如果IOC通信間的數(shù)據(jù)長度小于等于4 Bytes,那么RTE/OS不會(huì)為其生成Spin lock和開關(guān)中斷的配置代碼,因?yàn)?2bit的MCU的一次機(jī)器周期操作能完成4字節(jié)數(shù)據(jù)的操作,保證了數(shù)據(jù)的原子操作。
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; }
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通信。
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)全局中斷。
-
負(fù)載
+關(guān)注
關(guān)注
2文章
566瀏覽量
34352 -
通信
+關(guān)注
關(guān)注
18文章
6032瀏覽量
135995 -
AUTOSAR
+關(guān)注
關(guān)注
10文章
362瀏覽量
21588 -
ecu
+關(guān)注
關(guān)注
14文章
886瀏覽量
54504
原文標(biāo)題:AUTOSAR架構(gòu)下多核通信
文章出處:【微信號:汽車電子嵌入式,微信公眾號:汽車電子嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論