痞子衡嵌入式:大话双核i.MXRT1170之在线联合调试双核工程的三种方法(IAR篇)
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是i.MXRT1170下在线联合调试双核工程的方法(基于IAR)。
前段时间痞子衡写过一篇《双核i.MXRT1170之单独在线调试从核工程的方法》,那篇文章介绍了如何单独在线调试从核工程的方法。当我们把主核工程和从核工程分别调稳定之后,底下便开始需要双核联调,验证双核通信交互相关功能。今天痞子衡就给大家介绍下 IAR 开发环境下双核工程联调的三种方法:
一、测试准备
首先需要准备好测试环境,包含必要的软件和硬件,痞子衡的环境如下:
我们知道 i.MXRT1170 其实主从核是在 Fuse 里可配的,我们就以默认配置(Cortex-M7 为主,Cortex-M4 为从)为例来介绍。
二、在IAR下调试
2.1 通用办法:双核工程无关联,调试器分别加载
第一种方法就是单纯借助外部调试器来做加载,主核工程和从核工程之间无依赖关系。我们选择 SDK 包里如下两个 hello_world 普通工程来做测试:
主核工程:\SDK_2.11.0_MIMXRT1170-EVK\boards\evkmimxrt1170\demo_apps\hello_world\cm7\iar
从核工程:\SDK_2.11.0_MIMXRT1170-EVK\boards\evkmimxrt1170\demo_apps\hello_world\cm4\iar
首先将 hello_world_demo_cm7 工程(选择 flexspi_nor_debug build)调试起来(菜单栏 Download and Debug 按钮),断点停在 main 即可。然后继续将 hello_world_demo_cm4 工程(选择 debug build)也调试起来(菜单栏 Download and Debug 按钮),过程很顺利,底下在两个工程下可以分别单步或者设断点进行调试。
- Note1: 调试顺序不一定非要主核工程在先,从核工程在后,调换顺序一样可以,但是后调试的工程复位类型必须选 Core 复位(建议两个工程均选择这种复位)。
- Note2: 调试从核工程 hello_world_demo_cm4 需借助 《双核i.MXRT1170之单独在线调试从核工程的方法》 一文里的脚本激活从核,并且脚本里不要挂起主核。
- Note3: 对于 J-Link 调试器,双核工程分别调试没有问题;但是对于 DAP-Link 调试器,当第一个工程正在调试时,第二个工程无法直接调试(会提示找不到可用的 DAP-Link 调试器)。
痞子衡将两个 hello world 工程主函数稍稍修改了一下,打印出不同内容,并且增加了一些延时,从结果来看,两个核都在正常跑。不过这里要提醒一句,i.MXRT1170 内部大部分外设对于两个核都是共享的,建议合理分配资源,尽量不要像本次测试这样,两个核都通过同一个 UART 来打印信息(除非代码里刻意做了资源共享设计)。
2.2 专用方法:双核工程无关联,IAR多核组件加载
第二种方法依然是借助外部调试器来做加载,主核工程和从核工程之间还是无需依赖关系。不过这一次我们要借助 IAR 软件里自带的多核组件,具体设置在工程选项 Debugger/Multicore 里面,在这里填上另外一个核工程(也叫 Partner 工程)文件(.eww)路径以及 build 即可,然后点击菜单栏 Download and Debug 按钮,IAR 会自动完成全部加载工作并返回给用户两个工程的调试界面:
- Note1: 多核组件的设置既可以在主核工程里,也可以在从核工程里。我们既可以从主核工程开始调试,也可以从从核工程开始调试。
- Note2: 多核组件仅仅是自动去打开 Partner 工程完成下载调试,并不包含从核激活功能,因此从核工程还是需要保留从核激活脚本。
- Note3: 多核组件功能仅在 DAP-Link 调试器(或者 I-Jet)下有效,在 J-Link 调试器下不适用。
2.3 通用方法:双核工程有关联,主核加载从核
前两种方法本质上都是借助调试器完成从核工程加载的,其实除了调试器,我们也可以利用主核工程里的代码来加载从核,步骤都在《双核i.MXRT1170之Cortex-M7与Cortex-M4互相激活之道》 一文里,我们以 SDK 包里如下两个 hello_world 多核例程来做测试:
主核工程:\SDK_2.11.0_MIMXRT1170-EVK\boards\evkmimxrt1170\multicore_examples\hello_world\cm7\iar
从核工程:\SDK_2.11.0_MIMXRT1170-EVK\boards\evkmimxrt1170\multicore_examples\hello_world\cm4\iar
在多核示例里,从核工程选项 Output Converter / Output 里会指定生成 hello_world_cm4.bin,然后主核工程选项 Linker / Input 里会输入 hello_world_cm4.bin 的路径,这样主核工程直接把从核可执行机器码当作源文件数组,用于后续复制加载从核程序(具体代码在主核工程 hello_world_core0.c 文件里)。
多核示例主要是为了展示双核通信交互,而本文主要介绍双核调试,因此我们可以将原始工程里关于 MCMGR 相关代码全部去掉(主核工程代码里要添加从核激活语句),主核工程里多核组件的设置也去掉。
- Note1: 此方法不依赖从核工程的激活脚本,因为激活工作在主核工程代码里做掉了。
- Note2: 此方法适用 J-Link 调试器,不适用 DAP-Link 调试器,原因与 2.1 节 Note 3 类似。
两个工程修改完之后,先调试主核工程(菜单栏 Download and Debug 按钮),跑到从核激活语句全部执行完毕,然后再调试从核工程(菜单栏 Attach to Running Target 按钮),至此也可以愉快地进行双核调试。
至此,i.MXRT1170下在线联合调试双核工程的方法痞子衡便介绍完毕了,掌声在哪里~~~
欢迎订阅
文章会同时发布到我的 博客园主页、CSDN主页、知乎主页、微信公众号 平台上。
微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

痞子衡嵌入式:大话双核i.MXRT1170之在线联合调试双核工程的三种方法(IAR篇)的更多相关文章
- 痞子衡嵌入式:聊聊i.MXRT1170双核下不同GPIO组的访问以及中断设计
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1170双核下不同GPIO组的访问以及中断设计. 在双核 i.MXRT1170 下设计应用程序,有一个比较重要的考虑点就是外 ...
- 痞子衡嵌入式:揭秘i.MXRT1170 eFuse空间访问可靠性的保护策略(冗余与ECC)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MXRT1170的eFuse空间访问可靠性保护策略. 关于i.MXRT系列的eFuse/OTP,痞子衡之前在介绍Boot时写过 ...
- 痞子衡嵌入式:在i.MXRT1170上启动含DQS的Octal Flash可不严格设Dummy Cycle (以MT35XU512为例)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是Octal或Hyper Flash上DQS信号与Dummy Cycle联系. 关于在 i.MXRT 上启动 NOR Flash 时如何设 ...
- 痞子衡嵌入式:揭秘i.MXRT1170上用J-Link连接复位后PC总是停在0x223104的原因
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1170上安全调试策略实现对JLink调试的影响. 痞子衡之前写过一篇旧文 <i.MXRT600的ISP模式下用J-L ...
- 痞子衡嵌入式:揭秘i.MXRT1170上串行NOR Flash双程序可交替启动设计
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1170上串行NOR Flash双程序可交替启动设计. 在上一篇文章 <i.MXRT1060/1010上串行NOR F ...
- 痞子衡嵌入式:ARM Cortex-M文件那些事(3)- 工程文件(.ewp)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式开发里的project文件. 前面两节课里,痞子衡分别给大家介绍了嵌入式开发中的两种典型input文件:源文件(.c/.h/.s). ...
- 痞子衡嵌入式:MCUXpresso IDE下添加C++源文件进SDK工程编译的方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下添加C++源文件进SDK工程编译的方法. 最近有客户反映在MCUXpresso IDE下的SDK工程里添加 ...
- 痞子衡嵌入式:飞思卡尔Kinetis开发板OpenSDA调试器那些事(上)- 背景与架构
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔Kinetis MCU开发板板载OpenSDA调试器(上篇). 众所周知,嵌入式软件开发几乎离不开调试器,因为写一个稍有代码规模 ...
- 痞子衡嵌入式:嵌入式Cortex-M裸机环境下临界区保护的三种实现
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是Cortex-M裸机环境下临界区保护的三种实现. 搞嵌入式玩过 RTOS 的朋友想必都对 OS_ENTER_CRITICAL().OS_ ...
随机推荐
- notify()和 notifyAll()有什么区别?
当一个线程进入 wait 之后,就必须等其他线程 notify/notifyall,使用 notifyall,可 以唤醒所有处于 wait 状态的线程,使其重新进入锁的争夺队列中,而 notify 只 ...
- 转:C++初始化成员列表
转载至:https://blog.csdn.net/zlintokyo/article/details/6524185 C++初始化成员列表和新机制初始化表达式列表有几种用法: 1.如果类存在继承关系 ...
- Servlet与JSP之间相互传值问题
一.JSP向Servlet传值 JSP向Servlet传值的方式有三种:URL后面跟参数.form表单提交.在JSP内置对象Session设置值. URL后面跟参数 JSP文件:<a href= ...
- redis主从复制与哨兵高可用
redis主从复制 话不多说,直接看案例: 环境准备, 主从规划 主节点:6380 从节点:6381.6382 运行3个redis数据库,达到 1主 2从的配置 #主库 6379.conf port ...
- 与和或(&&和||)比较的区别
&&(短路与)和&(逻辑与)的时候: 有假则为假,全真则为真(有假必假,全真为真) ||(短路或)和|(逻辑或)的时候: 有真则为真,全假则为假(有真必真,全假为假)
- (stm32学习总结)—GPIO位带操作
本章参考资料:<STM32F10X-中文参考手册>存储器和总线构架章节.GPIO 章节,<CM3 权威指南 CnR2>存储器系统章节. 位带简介 位操作就是可以单独的对一个比特 ...
- sqlite的Query方法操作和参数详解
query()方法实际上是把select语句拆分成了若干个组成部分,然后作为方法的输入参数: SQLiteDatabase db = databaseHelper.getWritableDatabas ...
- node+express+mysql 实现登陆注册
基于 node.express.mysql 实现的登录注册. 1.`首先在终端中 安装 node .` 2.`通过npm install express -g 命令全局安装 express`. 3.` ...
- 用Python爬取斗鱼网站的一个小案例
思路解析: 1.我们需要明确爬取数据的目的:为了按热度查看主播的在线观看人数 2.浏览网页源代码,查看我们需要的数据的定位标签 3.在代码中发送一个http请求,获取到网页返回的html(需要注意的是 ...
- Tomcat安装(安装版)
安装Tomcat(安装版) 下载地址https://tomcat.apache.org/ 下载成功,双击进行安装(一路Next). 等待安装结束. 然后打开浏览器输入地址:http://localho ...