文章目录
- 前言
- 修改ld文件
- 核0的ld文件
- 核1的ld文件
- 定义共享数据
- 使用共享数据
- 编译共享数据文件
- 总结
前言
最近项目用S32K324开发,暂时只用了MCAL,没有Autosar上层的模块,最开始用官方给的demo工程双核可以正常跑起来,但实际开发时都是在一个核里跑的。但是随着增加的逻辑越来越多,发现需要使用另外的核来运行部分程序。本文介绍核间的简单通讯示例。主要思路是定义一块共享的ram区域,保证写入操作只有一个地方进行(没有os,也没有做保护),用来传递数据。将需要放到另外一个核运行的代码改到对应的核去编译。
修改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中的地址是否一致
可以看到两个核中的ram地址是一样的。这样就可以进行访问了。
需要注意的是必须要保证两个核不能同时写,可能会导致异常。
总结
核间通信正常应该要做保护,一般多核OS中会有对应的保护机制