S32K324双核的核间通信使用示例

文章目录

    • 前言
    • 修改ld文件
      • 核0的ld文件
      • 核1的ld文件
    • 定义共享数据
    • 使用共享数据
    • 编译共享数据文件
    • 总结

前言

最近项目用S32K324开发,暂时只用了MCAL,没有Autosar上层的模块,最开始用官方给的demo工程双核可以正常跑起来,但实际开发时都是在一个核里跑的。但是随着增加的逻辑越来越多,发现需要使用另外的核来运行部分程序。本文介绍核间的简单通讯示例。主要思路是定义一块共享的ram区域,保证写入操作只有一个地方进行(没有os,也没有做保护),用来传递数据。将需要放到另外一个核运行的代码改到对应的核去编译。

S32K324双核的核间通信使用示例_第1张图片

修改ld文件

核0的ld文件

增加共享的ram区域

    sram_shareable          : ORIGIN = 0x20449000, LENGTH = 0x00002000    /* 8KB */

自定义段:

    .shared_bss                    (NOLOAD) ALIGN(16)      : > sram_shareable
    .shared_data                            ALIGN(4)       : > . 

如果之前有放到核0的sram需要放到核1的,也需要进行处理。

核1的ld文件

跟核0一样。

增加共享的ram区域

    sram_shareable          : ORIGIN = 0x20449000, LENGTH = 0x00002000    /* 8KB */

自定义段:

    .shared_bss                    (NOLOAD) ALIGN(16)      : > sram_shareable
    .shared_data                            ALIGN(4)       : > . 

定义共享数据

将需要共享的数据放到一个c文件中,并指定链接段

#pragma ghs section bss=".shared_bss"
uint8 runnable_1ms_flag = 0;
#pragma ghs section

.bss段即初始化为0,或未初始化的变量

使用共享数据

在核0中改变值,在核1中读取值

核0中1ms触发

void Gpt_1ms_notification(void)
{
    runnable_1ms_flag ++;
}

核1中主函数判断

int main(void)
{
	
    static uint32 counter = 0;   

    for(;;)
    {
        counter ++;
        if(runnable_1ms_flag % 2 == 0)
        {
           /* do something */
        }
        if(exit_code1 != 0)
        {
            break;
        }
    }

    return 0;
}

编译共享数据文件

在GHS编译路径中加入共享数据的c文件,两个核都需要加入。

编译之后确认下两个map中的地址是否一致

S32K324双核的核间通信使用示例_第2张图片
可以看到两个核中的ram地址是一样的。这样就可以进行访问了。

需要注意的是必须要保证两个核不能同时写,可能会导致异常。

总结

核间通信正常应该要做保护,一般多核OS中会有对应的保护机制

你可能感兴趣的:(Autosar笔记,S32K3学习笔记,Autosar,多核)