0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

AUTOSAR架构下的多核通信介绍

832065824 来源:汽车电子嵌入式 2023-11-13 09:24 次阅读

前言

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

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

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

问题3: 用于多核通信的共享内存一定需要使用SpinLock进行一致性保护吗?

问题4: 如何确保单核中的数据一致性?

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

参考文档:

AUTOSAR架构下多核启动

AUTOSAR架构下多核Shutdown

TC3xx芯片MPU介绍

MPU功能详解-以RH850U2A为例

缩略词

简写 全称
IOC Inter-OS-Application Communicator

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

正文

1.多核通信介绍

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

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

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来自动生成和保证。

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

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

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

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

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

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

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通信。

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

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

    文章

    449

    浏览量

    33885
  • 通信
    +关注

    关注

    18

    文章

    5706

    浏览量

    134391
  • AUTOSAR
    +关注

    关注

    9

    文章

    329

    浏览量

    21130
  • ecu
    ecu
    +关注

    关注

    14

    文章

    821

    浏览量

    53883

原文标题:AUTOSAR架构下多核通信

文章出处:【微信号:汽车电子嵌入式,微信公众号:汽车电子嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    AUTOSAR分层架构

    AUTOSAR分层架构
    发表于 09-26 11:12

    “网络物理系统(CPS) - 面向安全关键应用的未来异构多核E / E架构

    4.0中的不同安全关键应用和多域用例,例如:在ARAMiS(汽车,铁路和航空电子多核系统)和ARAMiS II等相应旗舰项目计划的背景 同时来自通用汽车R&D电子控制&软件架构组经理
    发表于 09-26 01:27

    功能安全---AUTOSAR架构深度解析 精选资料分享

    AUTOSAR架构深度解析本文转载于:AUTOSAR架构深度解析AUTOSAR的分层式设计,用于支持完整的软件和硬件模块的独立性(Indep
    发表于 07-23 08:34

    AUTOSAR架构深度解析 精选资料推荐

    AUTOSAR架构深度解析本文转载于:AUTOSAR架构深度解析目录AUTOSAR架构深度解析
    发表于 07-28 07:40

    AUTOSAR架构深度解析 精选资料分享

    AUTOSAR架构深度解析本文转载于:AUTOSAR架构深度解析AUTOSAR的分层式设计,用于支持完整的软件和硬件模块的独立性(Indep
    发表于 07-28 07:02

    关于AUTOSAR架构的知识点看完你就懂了

    关于AUTOSAR架构的知识点看完你就懂了
    发表于 10-18 07:41

    AUTOSAR软件架构是由哪些部分组成的

    章节回顾AUTOSAR软件架构(一)中描述了以下内容:Application Layer应用层Runtime Environment (RTE)运行时环境Basic Software (BSW
    发表于 12-09 07:30

    介绍AUTOSAR支持的四种功能安全机制

    内存分区用于解决不同软件组件之间的互相干扰,造成对内存存储的数据段或代码段的篡改,需要限制对内存和内存映射的硬件外设的访问。在AUTOSAR架构,分区是以OS-Application为对象划分
    发表于 06-10 17:33

    嵌入式异构多核的片上通信架构设计

    为了克服目前嵌入式异构多核处理器的片上通信架构无法提供高效的异构多核协作架构的问题,本文分析了嵌入式异构
    发表于 12-04 11:30 26次下载

    AUTOSAR分层架构介绍及SmartSAR studio使用总结

    AUTOSAR分层架构
    发表于 03-28 16:44 9次下载

    一种AUTOSAR软件架构中RTE的实现方法

    介绍了一种AUTOSAR软件架构中RTE的实现方法。
    发表于 07-13 16:02 6次下载

    AUTOSAR的软件架构

    本文主要内容分为两章节。第一章节简要介绍AUTOSAR的软件架构,设计理念以及方法论,对Classic Platform和Adaptive Platform做了简单的比较。第二章主要介绍
    的头像 发表于 05-24 11:01 2687次阅读
    <b class='flag-5'>AUTOSAR</b>的软件<b class='flag-5'>架构</b>

    AUTOSAR是什么?AUTOSAR软件架构简介

    AUTOSAR的全称是AUTomotive Open System Architecture,直译为汽车开放系统架构
    的头像 发表于 07-08 17:26 9756次阅读
    <b class='flag-5'>AUTOSAR</b>是什么?<b class='flag-5'>AUTOSAR</b>软件<b class='flag-5'>架构</b>简介

    AutoSAR构架以及在多核汽车MCU的运行

    ),一般是核间通信用 SWC即Software Component缩写,一般位于AUTOSAR架构的Application层 AUTOSAR分四层:Application、RTE(Ru
    的头像 发表于 07-24 10:57 1548次阅读
    <b class='flag-5'>AutoSAR</b>构架以及在<b class='flag-5'>多核</b>汽车MCU的运行

    基于Tricore芯片的AUTOSAR架构下的多核启动

    随着汽车ECU迅速的往域控制器方向发展,ECU要出来任务越来越多,单核CPU的负载越来越大,多核ECU势在必行。AUTOSAR架构下OS支持多核处理,本系列文章将详细
    的头像 发表于 10-23 10:15 1212次阅读
    基于Tricore芯片的<b class='flag-5'>AUTOSAR</b><b class='flag-5'>架构</b>下的<b class='flag-5'>多核</b>启动