前言
隨著汽車ECU迅速的往域控制器方向發展,ECU要處理的任務越來越多,單核CPU的負載越來越大,多核ECU勢在必行。AUTOSAR架構下OS支持多核處理,本系列文章將詳細介紹AUTOSAR架構下的多核機制。本文介紹AUTOSAR架構下的多核通信。
問題 1: 什么是共享內存(Shared Memory),共享內存需要在鏈接文件中特別指定嗎?
問題 2:如果要指定共享內存,該怎么指定?
問題3: 用于多核通信的共享內存一定需要使用SpinLock進行一致性保護嗎?
問題4: 如何確保單核中的數據一致性?
參考文檔:
AUTOSAR架構下多核啟動
AUTOSAR架構下多核Shutdown
TC3xx芯片MPU介紹
MPU功能詳解-以RH850U2A為例
縮略詞
簡寫 | 全稱 |
IOC | Inter-OS-Application Communicator |
注:本文章引用了一些第三方工具和文檔,若有侵權,請聯系作者刪除!
正文
1.多核通信介紹
使用多核的ECU避免不了需要考慮跨核通信,如下圖所示,跨核通信時使用RTE進行跨核通信時,AUTOSAR定義了標準的IOC通信,用戶只需要配置SWC的端口接口進行Mapping,IOC的具體實現由RTE/OS自動實現,不用用戶再做其他的操作。如果不使用RTE進行多核通信,沒有標準的接口可以使用,需要用戶自定義跨核通信,著重需要考慮跨核通信的共享內存及數據一致性保護。
Figure 1: 多核通信
2.多核間標準通信
多核間通信一定是跨OS-Application的通信(OS-Application不能跨核,所以兩個不同核上的SWC一定隸屬于不同的OS-Application),而“IOC”負責操作OS-Application之間的通信,特別是跨越核或內存保護邊界的通信。
2.1 什么是IOC
IOC全稱為Inter-OS-Application Communication,專門用于跨OS-Application的通信方式,特別的,跨越核或內存保護邊界的通信一般都使用IOC通信。
2.2 IOC的適用范圍
IOC的具體實現由RTE和OS實現,所以,IOC只適用于通過RTE交互的SWC間的跨OS-Application的通信,或通過RTE交互的SWC和BSW跨OS-Application通信,或者通過RTE交互的CDD和SWC或者CDD和CDD間的跨OS-Application通信。總之,不經過RTE的通信不適用IOC通信。
2.3 IOC的通信種類
IOC不支持Client-Server的通信,只支持Sender-Receiver的通信方式,SWC間的Client-Server通信在RTE/OS的具體實現中轉變為 Sender-Receiver的通信方式。也就是說對于SWC的開發者來說,不用做任何的更改,C-S的接口依然可以繼續使用。
從IOC的Senders和Receivers個數來分:IOC支持1:1, N:1, N:M的通信方式。
從是否帶Notification的角度來分:IOC分為帶Notification和不帶Notification的通信方式。
IOC通信支持隊列緩存(queue buffer),1:1和N:1通信方式支持隊列,N:M通信方式不支持隊列,1:1的通信方式一般不使用隊列,N:1通信方式一般使用隊列。
2.3 IOC通信配置
兩個SWC如果使用IOC通信的話,接口配置和不使用IOC通信完全一樣。
配置Data Type
配置Interface
配置P-port和R-Port
進行P-port和R-port連接(Mapping)
不過,兩個SWC如果要使用IOC跨核(跨OS-Application)通信,這兩個SWC的Runnable所在的Task一定時歸屬于兩個核上的不同OS-Application,這樣進行Port連接后,RTE和OS會自動為兩個SWC生產IOC通信接口和具體實現。
2.4 IOC通信的共享內存和數據保護
IOC通信的具體實現由共享內存的方式實現,共享內存的跨核間數據一致性保護由Spin lock保證,共享內存的核內Task間的數據一致性保護由開/關全局中斷的方式保證。共享內存和數據一致性保護都由OS來自動生成和保證。
Note: 如果IOC通信間的數據長度小于等于4 Bytes,那么RTE/OS不會為其生成Spin lock和開關中斷的配置代碼,因為32bit的MCU的一次機器周期操作能完成4字節數據的操作,保證了數據的原子操作。
2.5 IOC通信需要注意的其他點
單核內如果存在多個OS-Application,且OS-Application間由內存保護的邊界(boundaries
),這種單核場景也適用IOC通信。
在只有一個Core的系統中,如果只有一個OS-Application,或者如果沒有OS-Application使用內存保護機制,那么IOC可以被完全省略。
帶Notification的IOC適用二類中斷ISR來通知Receivers數據已經到達shared buffer,能保證Receiver及時的取得數據。
2.6 IOC通信的示例
2.6.1 SWC間通過S-R方式1:1通信且沒有Notification
如圖2所示,Core 0上的SWC通過RTE接口給Core 1上的SWC發送數據。接收端的可運行實體被定期調用(調度表或者Alarm機制實現),并通過RTE接收數據。
由于通信跨越了核心邊界,RTE調用IOC將數據從Core0傳輸到Core1。
數據發送方調用
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服務將數據寫入一個緩沖區,該緩沖區位于一個共享內存區中,接收方可以通過IOC讀取該數據。在接收端,接收可運行程序被定期調用。
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_
調用以從IOC內部隊列中讀取數據。1:1通信不需要RTE中的附加隊列。
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通信
隊列或者非隊列通信
1:1通信方式
2.6.2 SWC間通過C-S方式通信有Notification
當數據寫入IOC內部數據緩存后,Rte函數調用OS的服務來激活接收任務。這種通信方式適用于:
帶Notification的SWC間的Sender/receiver通信;
Client/server通信。
隊列或非隊列通信;
非polling模式的1:1通信;
N:1通信。
Figure2: IOC with notification by RTE
用長度為100的隊列方式實現。
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.多核間非標準通信
從第2章節得知:
IOC通信的的共享內存也就是OS定義的全局變量
對共享內存的數據一致性保護也就是通過Spin Lock和開關中斷來實現,
共享內存小于等于4 bytes,可以不使用Spin Lock和中斷保護
如果沒有開啟內存保護(MPU),共享內存可以分配在.default段(不用特別的去修改鏈接文件定義特殊的段),也就是任意可訪問RAM地址
只不過這些都由RTE和OS自動實現,對于用戶只要做好Port連接即可。
那么對于不經過RTE的多核通信,我們是否可以自己實現多核通信了?-- 肯定是可以的,下面我就列出一些多核通信的場景及應該考慮的地方。
序號 | 兩個跨核SWC所在OS-Application情況 | 通信數據長度 | 共享內存 | 數據一致性保護 |
1 | Core0-SWC和Core1-SWC所在OS-Application都無內存保護機制 | 小于等于4 Bytes(32-bit MCU) | 不用在鏈接文件特殊定義共享內存段,直接使用.default Data段 |
不用spin lock保護; 不用開關全局中斷保護 |
2 | Core0-SWC和Core1-SWC所在OS-Application都無內存保護機制 | 大于4 Bytes(32-bit MCU) | 不用在鏈接文件特殊定義共享內存段,直接使用.default Data段 |
需要spin lock保護; 如果該Shared buffer同一個核中不同Task間讀寫情況,就需要開關全局中斷保護。 |
3 | Core0-SWC和Core1-SWC所在OS-Application有內存保護機制 | 小于等于4 Bytes(32-bit MCU) | 需要在鏈接文件定義兩個OS-Application都能訪問的共享內存段 |
不用spin lock保護; 不用開關全局中斷保護 |
4 | Core0-SWC和Core1-SWC所在OS-Application有內存保護機制 | 大于4 Bytes(32-bit MCU) | 需要在鏈接文件定義兩個OS-Application都能訪問的共享內存段 |
需要spin lock保護; 如果該Shared buffer同一個核中不同Task間讀寫情況,就需要開關全局中斷保護。 |
關于MPU請參考:
TC3xx芯片MPU介紹
4.總結
問題 1: 什么是共享內存(Shared Memory),共享內存需要在鏈接文件中特別指定嗎?
答:兩個或多個OS-Application都能訪問的內存區域即為共享內存區域。如果沒有使能MPU內存保護機制,任意定義的全局變量即為共享內存變量。如果使能了MPU內存保護機制,就需要在鏈接文件中定義共享內存段,同時需要配置MPU保護段并分配給OS-Application。
問題 2:如果要指定共享內存,該怎么指定?
答:在鏈接文件中指定一塊內存區域,然后配置MPU設置其讀寫訪問屬性,需要多核通信的OS-Application應該包括該MPU配置即擁有對該共享內存的讀寫訪問權限。
問題3: 用于多核通信的共享內存一定需要使用Spin Lock進行一致性保護嗎?
答:不一定。當多核通信的數據小于等于4 Bytes(32-bit MCU)時CPU一個機器周期就能完成數據的讀寫,已經是原子操作,不用使用Spin lock進行數據一致性保護。
問題4: 如何確保單核中的數據一致性?
答:使用開關/掛起全局核內全局中斷。
-
負載
+關注
關注
2文章
608瀏覽量
35069 -
通信
+關注
關注
18文章
6184瀏覽量
137469 -
AUTOSAR
+關注
關注
10文章
374瀏覽量
22449 -
ecu
+關注
關注
14文章
921瀏覽量
55548
原文標題:AUTOSAR架構下多核通信
文章出處:【微信號:汽車電子嵌入式,微信公眾號:汽車電子嵌入式】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
AUTOSAR架構深度解析 精選資料分享
AUTOSAR架構下的WdgDriver WdgIf WdgM模塊
AutoSAR構架以及在多核汽車MCU的運行

基于Tricore芯片的AUTOSAR架構下的多核啟動

AUTOSAR架構下,持續集成CI的最佳實踐

評論