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

news2024/10/7 20:30:54

文章目录

    • 前言
    • 修改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中会有对应的保护机制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/778741.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用nginx和ffmpeg搭建HTTP FLV流媒体服务器(摄像头RTSP视频流->RTMP->http-flv)

名词解释 RTSP (Real-Time Streaming Protocol) 是一种网络协议,用于控制实时流媒体的传输。它是一种应用层协议,通常用于在客户端和流媒体服务器之间建立和控制媒体流的传输。RTSP允许客户端向服务器发送请求,如…

数据分析工具与技术

数据分析工具与技术 数据分析技术 数据分析工具 备选方案分析 一种对已识别的可选方案进行评估的技术,用来决定选择哪种方案 或使用何种方法来执行项目工作。 其他风险参数评估 为了方便未来分析和行动,在对单个项目风险进行优先级排序时&#xff0…

GO内存模型(同步机制)

文章目录 概念1. 先行发生 编译器重排同步机制init函数协程的创建channelsync 包1. sync.mutex2. sync.rwmutex3. sync.once atomic 参考文献 概念 1. 先行发生 The happens before relation is defined as the transitive closure of the union of the sequenced before and …

超详细-Vivado配置Sublime+Sublime实现Verilog语法实时检查

目录 一、前言 二、准备工作 三、Vivado配置Sublime 3.1 Vivado配置Sublime 3.2 环境变量添加 3.3 环境变量验证 3.4 Vivado设置 3.5 配置验证 3.6 解决Vivado配置失败问题 四、Sublime配置 4.1 Sublime安装Package Control 4.2 Sublime安装Verilog插件 4.3 安装语…

centos7中MySQL备份还原策略

目录 一、直接拷贝数据库文件 1.1在shangke主机上停止服务并且打包压缩数据库文件 1.2 在shangke主机上把数据库文件传输到localhost主机上(ip为192.168.33.157) 1.3在localhost主机上停止服务,解压数据库文件 1.4 在localhost主机上开启服务 1.5 测试 二、m…

利用@Excel实现复杂表头导入

EasyPoi导入 <a-upload name"file" :showUploadList"false" :multiple"false" :headers"tokenHeader" :action"importExcelUrl"change"handleImportExcel"><a-button type"primary" icon&quo…

【软件测试】如何选择回归用例

目录 如何在原始用例集中挑选测试用例 具体实践 总结 本文讨论一下在回归测试活动中&#xff0c;如何选择测试用例集。 回归测试用例集包括基本测试用例集&#xff08;原始用例&#xff09;迭代新增测试用例集&#xff08;修复故障引入的用例和新增功能引入的用例集&#xf…

洛必达法则和分部积分的应用之计算数学期望EX--概率论浙大版填坑记

如下图所示&#xff0c;概率论与数理统计浙大第四版有如下例题&#xff1a; 简单说就是&#xff1a;已知两个相互独立工作电子装置寿命的概率密度函数&#xff0c;将二者串联成整机&#xff0c;求整机寿命的数学期望。 这个题目解答中的微积分部分可谓是相当的坑爹&#xff0c;…

【1++的C++初阶】之适配器

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的C初阶】 文章目录 一&#xff0c;什么是适配器二&#xff0c;栈与队列模拟实现三&#xff0c;优先级队列四&#xff0c;reverse_iterator 一&#xff0c;什么是适配器 适配器作为STL的六大组…

【高阶数据结构】跳表

文章目录 一、什么是跳表二、跳表的效率如何保证&#xff1f;三、skiplist的实现四、skiplist跟平衡搜索树和哈希表的对比 一、什么是跳表 skiplist本质上也是一种查找结构&#xff0c;用于解决算法中的查找问题&#xff0c;跟平衡搜索树和哈希表的价值是 一样的&#xff0c;可…

Windows环境Docker安装

目录 安装Docker Desktop的步骤 Docker Desktop 更新WSL WSL 的手动安装步骤 Windows PowerShell 拉取&#xff08;Pull&#xff09;镜像 查看已下载的镜像 输出"Hello Docker!" Docker Desktop是Docker官方提供的用于Windows的图形化桌面应用程序&#xff0c…

区间预测 | MATLAB实现QRBiLSTM双向长短期记忆神经网络分位数回归多输入单输出区间预测

区间预测 | MATLAB实现QRBiLSTM双向长短期记忆神经网络分位数回归多输入单输出区间预测 目录 区间预测 | MATLAB实现QRBiLSTM双向长短期记忆神经网络分位数回归多输入单输出区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 区间预测 | MATLAB实现QRBiLSTM…

odoo16 用好计量单位中的激活功能

odoo16 用好计量单位中的激活功能 根据国内常用&#xff0c;把不常用的单位去除&#xff0c;删除不了&#xff0c;提示已用&#xff0c;其实不用删除&#xff0c;每个单位后有个激活功能&#xff0c;选一下就可以了&#xff0c;显示成整洁的界面了 第一次用时&#xff0c;小伙伴…

解决spring cloud 中使用spring security全局异常处理器失效

写auth认证模块实现忘记密码与注册功能时&#xff0c;用异常抛出&#xff0c;全局异常处理器无法捕获。 无法进行异常捕捉 解决方案&#xff1a;使用WebSecurityConfigurerAdapter.configure中http实现自定义异常&#xff1a; EnableWebSecurity EnableGlobalMethodSecurity(…

87、springcloud核心组件及其作用

spring Eureka: 服务注册与发现 注册:&#xff1a;每个服务都向Eureka登记自己提供服务的元数据&#xff0c;包括服务的ip地址、端口号、版本号、通信协议等 eureka将各个服务维护在了一个服务清单中 (双层Map&#xff0c;第一层key是服务名&#xff0c;第二层key是实例名&…

macOS 源码编译 qpress

╰─➤ git clone https://github.com/PierreLvx/qpress.git ╰─➤ cd qpress ╰─➤ make g -O3 -o qpress -x c quicklz.c -x c qpress.cpp aio.cpp utilities.cpp -lpthread -Wall -Wextra -Werror ╰─➤ sudo make install …

Vue--》打造个性化医疗服务的医院预约系统(三)

今天开始使用 vue3 + ts 搭建一个医院预约系统的前台页面,因为文章会将项目的每一个地方代码的书写都会讲解到,所以本项目会分成好几篇文章进行讲解,我会在最后一篇文章中会将项目代码开源到我的GithHub上,大家可以自行去进行下载运行,希望本文章对有帮助的朋友们能多多关…

Java基础小知识(待续)

类型转换、ASCII码、除法取余、三元表达式 long x 100;//int->long自动类型转换&#xff08;隐式) 1&#xff0e;特点:代码不需要进行特殊处理&#xff0c;自动完成。2&#xff0e;规则:数据范围从小到大。double y 2.5F;//2.5 float->double自动类型转换&#xff08…

pyqt5-Ctrl+鼠标滚轮实现文本区文字大小调整

技术简介 在 PyQt5 中&#xff0c;你可以使用 QTextEdit 的 wheelEvent 方法和 QKeyEvent 的 key() 方法来检测 Ctrl 键和鼠标滚轮事件&#xff0c;从而实现按下 Ctrl 键并滚动鼠标滚轮时&#xff0c;调整 QTextEdit 的字体大小。 这个示例中&#xff0c;我们创建了一个窗口&am…

模板方法模式(java)

目录 结构 案例 代码实现 抽象类 具体子类 测试类 优缺点 优点 缺点 结构 模板方法&#xff08;Template Method&#xff09;模式包含以下主要角色&#xff1a; 抽象类&#xff08;Abstract Class&#xff09;&#xff1a;负责给出一个算法的轮廓和骨架。它由一个模板…