• 812查看
  • 0回复

[Autosar] AUTOSAR架构下多核通信

[复制链接]


该用户从未签到

发表于 4-12-2023 19:02:57 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


前言

随着汽车ECU迅速的往域控制器方向发展,ECU要处理的任务越来越多,单核CPU的负载越来越大,多核ECU势在必行。AUTOSAR架构下OS支持多核处理,本系列文章将详细介绍AUTOSAR架构下的多核机制。本文介绍AUTOSAR架构下的多核通信。

问题 1: 什么是共享内存(Shared Memory),共享内存需要在链接文件中特别指定吗?

问题 2: 如果要指定共享内存,该怎么指定?

问题3: 用于多核通信的共享内存一定需要使用SpinLock进行一致性保护吗?
问题4: 如何确保单核中的数据一致性?

AUTOSAR架构下多核通信w2.jpg

缩略词


简写

全称

IOC

Inter-OS-Application Communicator


注:本文章引用了一些第三方工具和文档,若有侵权,请联系作者删除!

1.多核通信介绍

使用多核的ECU避免不了需要考虑跨核通信,如下图所示,跨核通信时使用RTE进行跨核通信时,AUTOSAR定义了标准的IOC通信,用户只需要配置SWC的端口接口进行Mapping,IOC的具体实现由RTE/OS自动实现,不用用户再做其他的操作。如果不使用RTE进行多核通信,没有标准的接口可以使用,需要用户自定义跨核通信,着重需要考虑跨核通信的共享内存及数据一致性保护。
AUTOSAR架构下多核通信w3.jpg

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.4 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.5 IOC通信的共享内存和数据保护

IOC通信的具体实现由共享内存的方式实现,共享内存的跨核间数据一致性保护由Spin lock保证,共享内存的核内Task间的数据一致性保护由开/关全局中断的方式保证。共享内存和数据一致性保护都由OS来自动生成和保证。

AUTOSAR架构下多核通信w4.jpg

AUTOSAR架构下多核通信w5.jpg

Note: 如果IOC通信间的数据长度小于等于4 Bytes,那么RTE/OS不会为其生成Spin lock和开关中断的配置代码,因为32bit的MCU的一次机器周期操作能完成4字节数据的操作,保证了数据的原子操作。

AUTOSAR架构下多核通信w6.jpg

2.6 IOC通信需要注意的其他点



    单核内如果存在多个OS-Application,且OS-Application间由内存保护的边界(boundaries

),这种单核场景也适用IOC通信。


    在只有一个Core的系统中,如果只有一个OS-Application,或者如果没有OS-Application使用内存保护机制,那么IOC可以被完全省略。

    带Notification的IOC适用二类中断ISR来通知Receivers数据已经到达shared buffer,能保证Receiver及时的取得数据。

2.7 IOC通信的示例

2.7.1 SWC间通过S-R方式1:1通信且没有Notification

如图2所示,Core 0上的SWC通过RTE接口给Core 1上的SWC发送数据。接收端的可运行实体被定期调用(调度表或者Alarm机制实现),并通过RTE接收数据。

由于通信跨越了核心边界,RTE调用IOC将数据从Core0传输到Core1。

数据发送方调用

Rte_Send_<port>_<item> (..., <data>)

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_<Id> (<data>)

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;}

AUTOSAR架构下多核通信w7.jpg

Figure 2: IOC without notification

在本例中,IocSend服务将数据写入一个缓冲区,该缓冲区位于一个共享内存区中,接收方可以通过IOC读取该数据。在接收端,接收可运行程序被定期调用。

Rte_Receive_<port>_<item> (..., <data>)

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_<Id> (<data>)

调用以从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.7.2 SWC间通过C-S方式通信有Notification

当数据写入IOC内部数据缓存后,Rte函数调用OS的服务来激活接收任务。这种通信方式适用于:



    带Notification的SWC间的Sender/receiver通信;

    Client/server通信。

    队列或非队列通信;

    非polling模式的1:1通信;

    N:1通信。



AUTOSAR架构下多核通信w8.jpg


Figure 2: 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的多核通信,颐鞘欠窨梢宰约菏迪侄嗪送ㄐ帕耍&#65533;-- 肯定是可以的,下面我就列出一些多核通信的场景及应该考虑的地方。


序号

两个跨核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: 如何确保单核中的数据一致性?

答:使用开关/挂起全局核内全局中断。



该用户从未签到

发表于 17-3-2025 11:53:00 | 显示全部楼层
针对上述问题,以下是专业的汽车工程师回复:

问题1:共享内存是多核处理器中用于多个核心之间数据交换的公共内存区域。在AUTOSAR架构下,共享内存通常需要在链接文件中特别指定。

问题2:指定共享内存需要在AUTOSAR配置的链接文件中进行。通常包含内存区域的名称、地址和大小等信息。具体实现可能因不同系统而异。

问题3:共享内存在多核通信中确实需要使用某种机制进行一致性保护,但不一定非得是SpinLock。AUTOSAR架构提供了多种同步机制,可根据实际需求选择。

问题4:为确保单核中的数据一致性,通常采用内存屏障或者指令重排序等方法,以确保内存操作的正确顺序和可见性。同时,还需要结合AUTOSAR提供的同步机制来实现。至于具体的实现细节和策略选择,需要结合具体的系统和应用场景进行评估和优化。希望上述解答对您有帮助!如有疑问或需求深入了解请继续交流!
回复 支持 反对

使用道具 举报



该用户从未签到

发表于 17-3-2025 11:53:00 | 显示全部楼层
针对上述问题,以下是专业的汽车工程师回复:

问题1:共享内存是多核系统中各处理器可共同访问的内存区域,用于实现数据共享和通信。在AUTOSAR架构下,通常需要在链接文件中特别指定共享内存区域。

问题2:指定共享内存的方式依赖于具体的开发环境和工具链。通常,在AUTOSAR架构中,需要在软件配置文件中定义共享内存区域的大小和地址范围。

问题3:共享内存在多核通信中的确需要使用机制保证数据一致性,SpinLock是一种常见的方式,但并非唯一。根据具体的应用场景和系统需求,还可以采用其他同步机制如信号量、互斥锁等。

问题4:确保单核中的数据一致性可通过编程时的同步机制实现,如使用原子操作、内存屏障等技术来确保指令的执行顺序和数据的可见性。此外,合理的软件架构设计也能提高数据一致性。

缩略:共享内存为多核通信关键,需特定指定并保障一致性。可通过同步机制如SpinLock或其他方法实现。确保单核数据一致性需依赖编程同步机制和合理软件架构。
回复 支持 反对

使用道具 举报



该用户从未签到

发表于 17-3-2025 11:53:00 | 显示全部楼层
AUTOSAR架构下的多核通信系列文章旨在详细解读AUTOSAR在多核环境中的工作机制。针对你的问题,以下回复:

问题一:共享内存是不同处理器核心间通信的一种手段,用于数据交换。在AUTOSAR架构中,共享内存通常需要在链接文件中特别指定。

问题二:若要指定共享内存,应在AUTOSAR配置中明确标识相关内存区域为共享。具体实现可能因工具和平台而异。

问题三:共享内存在多核通信中确实需要保护机制以确保数据一致性。SpinLock是一种常见方法,但不是唯一方式。根据具体需求和系统特性,可能还有其他同步机制。

问题四:确保单核中的数据一致性通常需要依赖操作系统的内存管理策略和同步机制。在AUTOSAR架构下,可以通过软件层面的锁机制以及硬件层面的内存访问控制来实现。

后续文章将深入探讨AUTOSAR多核通信的具体实现细节。
回复 支持 反对

使用道具 举报



该用户从未签到

发表于 17-3-2025 11:53:00 | 显示全部楼层
针对上述问题,以下是专业的汽车工程师回复:

问题1:共享内存是AUTOSAR架构下多核通信的一种重要方式,它允许多个核心共享同一块内存区域。在链接文件中通常需要特别指定共享内存的大小和位置。

问题2:要指定共享内存,可在AUTOSAR构建配置中进行设置,或在软件架构中定义共享内存区域。具体方法取决于开发环境和工具链的配置。

问题3:共享内存在多核通信中的确需要使用机制保证数据一致性,SpinLock是一种常见的方式,但并非唯一。根据具体的应用场景和开发需求,还可以采用其他同步机制。

问题4:确保单核中的数据一致性可通过软件架构设计和编程实践来实现。例如,利用原子操作、读写锁等同步机制,以及优化数据访问顺序等方式来避免数据竞争和不一致状态。

缩略回复:共享内存为多核通信关键,需于链接文件中特指定。确保一致性可通过软件设计如原子操作、锁机制等实现。共享内存同步不局限于SpinLock。
回复 支持 反对

使用道具 举报

快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 24-8-2025 13:39 , Processed in 0.395564 second(s), 40 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.