大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是i.MXRT1170下单独在线调试从核工程的方法(基于IAR)

  两年前痞子衡写过一篇《双核i.MXRT1170之Cortex-M7与Cortex-M4互相激活之道》,那篇文章从离线启动的角度介绍了跑双核应用的基本方法,基本上把双核启动的细节都介绍到了。

  在应用开发的阶段,很多时候我们还是需要在线调试的,主核的调试没什么特别要注意的地方,从核的调试大家估计就有点陌生了,今天痞子衡就给大家介绍下 IAR 开发环境下调试从核工程的方法:

一、测试准备

  首先需要准备好测试环境,包含必要的软件和硬件,痞子衡的环境如下:

  • 集成开发环境: IAR EW for Arm v9.10.2,[点此下载](https://www.iar.com/products/architectures/
  • 软件开发包: SDK_2.11.0_MIMXRT1170-EVK(Toolchain要包含IAR),点此下载
  • 软件驱动: J-Link driver v7.56b,点此下载
  • 硬件工具: J-Link Plus调试器
  • 硬件开发板: MIMXRT1170-EVK (Rev.C),含板载 DAP-Link 调试器

  我们知道 i.MXRT1170 其实主从核是在 Fuse 里可配的,我们就以默认配置(Cortex-M7 为主,Cortex-M4 为从)为例来介绍,选取的测试工程是 \SDK_2.11.0_MIMXRT1170-EVK\boards\evkmimxrt1170\demo_apps\hello_world\cm4。

二、在IAR下调试

  使用 IAR 打开 hello_world_demo_cm4.eww 工程,切换到 debug build (就是在 RAM 中执行)。

2.1 工程选项处理器选 Cortex-M4 核调试情况

  我们先来看一下工程选项里处理器选择 Cortex-M4,并且不使能任何额外脚本时调试情况。也就是说在明知主核 Cortex-M7 处于激活状态而 Cortex-M4 处于未激活状态时,IAR C-SPY 调试组件能否工作。

  痞子衡分别测试了板载 DAP-Link 调试器以及外接 J-Link 调试器,测试结果均是不能直接调试,DAP-Link 下提示 "Failed to connect to CPU",J-Link 下提示 "Select core is not same as the target core"。

2.2 工程选项处理器选 NXP MIMXRT1176xxxA_M4 调试情况

  再来看一下工程选项里处理器选择 NXP MIMXRT1176xxxA_M4 时调试情况(会调用相关脚本,在 IAR/J-Link 里已经做好)。也就是虽然 Cortex-M4 处于未激活状态,但是有配套脚本会负责激活工作。

  J-Link 下是可以直接调试的,在 Debug Log 窗口,我们可以看到有 .jlinkscript 脚本执行的痕迹,脚本打印信息里显示其识别到 Cortex-M4 未激活,并且会做激活相关工作。

  • Note: 这个跟 NXP MIMXRT1176xxxA_M4 选择相关的 .jlinkscript 脚本在 JLink 驱动安装目录下,由于 log 里没有直接显示路径,那大概率已经被打包进 DLL 文件里了,我们看不到具体脚本代码实现。

  DAP-Link 下也是可以直接调试的,在 Debug Log 窗口,我们可以看到 iMXRT_1170.dmac 脚本被执行了,脚本打印信息里显示其识别到 Cortex-M4 未激活,并且会做激活相关工作。

  • Note: 这个跟 NXP MIMXRT1176xxxA_M4 选择相关的 iMXRT_1170.dmac 脚本在 IAR 安装目录下,具体路径已经在 log 里显示出来了,我们可以看到其具体脚本代码实现。

  如果你细心观察,你会发现 DAP-Link 下必须要在工程选项 Debugger / Extra Options 里加 “--macro_param enable_core=1” 语句才能正常调试,这是因为 iMXRT_1170.dmac 脚本需要接受这个参数才能正常激活从核 Cortex-M4。

2.3 自己实现用于从核调试的脚本

  现在我们知道了调试从核 Cortex-M4 工程必须要有专门脚本来负责激活从核才行,虽然 IAR/J-Link 里已经做好这个脚本,但是两者行为是否统一我们不清楚(毕竟看不见 J-Link 下脚本源码),而且这个脚本是随着 IAR/J-Link 版本而变化的,具有一定的不可控性。

  为了完全掌控从核调试的主动性与确定性,最好我们自己重新实现 IAR/J-Link 下的调试脚本,在线调试时直接指定使用我们自己写的脚本,这样即使工程选项里处理器选择 Cortex-M4 我们也能正常调试。

  对于 DAP-Link,我们新建一个 mimxrt1170_connect_cm4_user.mac 文件(具体内容见附录一)放到工程目录下,并且在 IAR 选项里指定使用这个 mac 文件。这个 mac 文件语法详见 《IAR内部C-SPY调试组件配套宏文件(.mac)用法介绍》,其中最重要的是 execUserCoreConnect() 保留宏函数里要做激活 Cortex-M4 工作。

  • Note: 如果希望调试从核 Cortex-M4 时,主核 Cortex-M7 依然在跑,可以注释掉 mimxrt1170_connect_cm4_user.mac 文件里的 execUserSetup() 函数。

  对于 J-Link,我们新建一个 mimxrt1170_connect_cm4_user.jlinkscript 文件(具体内容见附录二)放到工程目录下,并且在 IAR 选项里指定使用这个 jlinkscript 文件。这个 jlinkscript 文件语法详见 《JLink Script文件基础及其在IAR下调用方法》,其中最重要的是 InitTarget() 用户自定义动作函数里要做激活 Cortex-M4 工作。

  • Note: 如果希望调试从核 Cortex-M4 时,主核 Cortex-M7 依然在跑,可以注释掉 mimxrt1170_connect_cm4_user.jlinkscript 文件里的 AfterResetTarget() 函数。

附录一、IAR 脚本(用于DAP-Link)

prepare_core_spin_code(cmVersion)
{
__var start;
if (cmVersion == 7)
{
start = 0x2021FF00;
__writeMemory32(start >> 7, 0x40c0c068, "AP0_Memory");
}
if (cmVersion == 4)
{
start = 0x20200000;
__writeMemory32(start & 0xFFFF, 0x40c0c000, "AP0_Memory");
__writeMemory32(start >> 16, 0x40c0c004, "AP0_Memory");
}
__writeMemory32(start + 0x20, start, "AP0_Memory");
__writeMemory32(0x223105, start + 0x4, "AP0_Memory");
} release_core(cmVersion)
{
if (cmVersion == 7)
{
__writeMemory32(0x2, 0x40c04000, "AP0_Memory");
}
if (cmVersion == 4)
{
__writeMemory32(0x1, 0x40c04000, "AP0_Memory");
}
} reset_core(cmVersion)
{
__var reg;
__var ctrlAddr;
__var statAddr;
if (cmVersion == 7)
{
ctrlAddr = 0x40c042a4;
statAddr = 0x40c042b0;
}
if (cmVersion == 4)
{
ctrlAddr = 0x40c04284;
statAddr = 0x40c04290;
}
__writeMemory32(0x1, ctrlAddr, "AP0_Memory");
do
{
reg = __readMemory32(statAddr, "AP0_Memory");
__delay(10);
}while(reg & 0x1);
} //_ExecDeviceCoreConnect()
execUserCoreConnect()
{
__probeCmd("j.i swd /force");
// dummy read
__readAPReg(2);
__delay(10);
// Disable system reset caused by sysrstreq from each core
__writeMemory32(0x3c00, 0x40C04004, "AP0_Memory");
prepare_core_spin_code(4);
release_core(4);
// switch to AP1
__writeDPReg(1<<24, 2);
} execUserPreReset()
{
reset_core(4);
release_core(4);
__writeDPReg(1<<24, 2);
} execUserSetup()
{
__var reg;
reg = __readMemory32(0x40c04000, "AP0_Memory");
if((reg & 0x2) == 0)
{
prepare_core_spin_code(7);
reset_core(7);
}
}

附录二、J-Link 脚本

void prepare_core_spin_code(unsigned int cmVersion)
{
unsigned int start;
if (cmVersion == 7)
{
start = 0x2021FF00;
MEM_WriteU32(0x40c0c068, start >> 7);
}
if (cmVersion == 4)
{
start = 0x20200000;
MEM_WriteU32(0x40c0c000, start & 0xFFFF);
MEM_WriteU32(0x40C0c004, start >> 16);
}
MEM_WriteU32(start, start + 0x20);
// BootROM go_fatal_mode()
MEM_WriteU32(start + 0x4, 0x223105);
} void release_core(unsigned int cmVersion)
{
if (cmVersion == 7)
{
MEM_WriteU32(0x40C04000, 0x2);
}
if (cmVersion == 4)
{
MEM_WriteU32(0x40C04000, 0x1);
}
} void reset_core(unsigned int cmVersion)
{
unsigned int reg;
unsigned int ctrlAddr;
unsigned int statAddr; if (cmVersion == 7)
{
ctrlAddr = 0x40c042a4;
statAddr = 0x40c042b0;
}
if (cmVersion == 4)
{
ctrlAddr = 0x40c04284;
statAddr = 0x40c04290;
} MEM_WriteU32(ctrlAddr, 1);
do
{
reg = MEM_ReadU32(statAddr);
SYS_Sleep(10);
}while (reg & 0x1);
} void InitTarget(void)
{
CPU = CORTEX_M7;
// Manually configure AP
JLINK_CORESIGHT_AddAP(0, CORESIGHT_AHB_AP);
JLINK_CORESIGHT_AddAP(1, CORESIGHT_AHB_AP);
JLINK_CORESIGHT_AddAP(2, CORESIGHT_APB_AP);
// Dummy read
JLINK_CORESIGHT_ReadAP(JLINK_CORESIGHT_AP_REG_IDR);
SYS_Sleep(10);
// Disable system reset caused by sysrstreq from each core
MEM_WriteU32(0x40C04004, 0x3c00);
prepare_core_spin_code(4);
release_core(4);
// Switch to AP1
CPU = CORTEX_M4;
CORESIGHT_IndexAHBAPToUse = 1;
} void ResetTarget(void)
{
CORESIGHT_IndexAHBAPToUse = 0;
reset_core(4);
release_core(4);
CORESIGHT_IndexAHBAPToUse = 1;
} void AfterResetTarget(void)
{
unsigned int reg;
reg = MEM_ReadU32(0x40c04000);
if((reg & 0x2) == 0)
{
prepare_core_spin_code(7);
reset_core(7);
}
}

  至此,i.MXRT1170下单独在线调试从核工程的方法痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

文章会同时发布到我的 博客园主页CSDN主页知乎主页微信公众号 平台上。

微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

痞子衡嵌入式:大话双核i.MXRT1170之单独在线调试从核工程的方法(IAR篇)的更多相关文章

  1. 痞子衡嵌入式:聊聊i.MXRT1170双核下不同GPIO组的访问以及中断设计

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1170双核下不同GPIO组的访问以及中断设计. 在双核 i.MXRT1170 下设计应用程序,有一个比较重要的考虑点就是外 ...

  2. 痞子衡嵌入式:揭秘i.MXRT1170 eFuse空间访问可靠性的保护策略(冗余与ECC)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MXRT1170的eFuse空间访问可靠性保护策略. 关于i.MXRT系列的eFuse/OTP,痞子衡之前在介绍Boot时写过 ...

  3. 痞子衡嵌入式:在i.MXRT1170上启动含DQS的Octal Flash可不严格设Dummy Cycle (以MT35XU512为例)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是Octal或Hyper Flash上DQS信号与Dummy Cycle联系. 关于在 i.MXRT 上启动 NOR Flash 时如何设 ...

  4. 痞子衡嵌入式:揭秘i.MXRT1170上用J-Link连接复位后PC总是停在0x223104的原因

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1170上安全调试策略实现对JLink调试的影响. 痞子衡之前写过一篇旧文 <i.MXRT600的ISP模式下用J-L ...

  5. 痞子衡嵌入式:揭秘i.MXRT1170上串行NOR Flash双程序可交替启动设计

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1170上串行NOR Flash双程序可交替启动设计. 在上一篇文章 <i.MXRT1060/1010上串行NOR F ...

  6. 痞子衡嵌入式:MCUXpresso IDE下SDK工程在Build配置上与IAR,MDK差异

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下SDK工程在Build配置上与IAR,MDK差异. 恩智浦 SW 团队每个季度都会公布 SDK.Tool ...

  7. 痞子衡嵌入式:大话双核i.MXRT1170之在线联合调试双核工程的三种方法(IAR篇)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT1170下在线联合调试双核工程的方法(基于IAR). 前段时间痞子衡写过一篇<双核i.MXRT1170之单独在线调试从 ...

  8. 痞子衡嵌入式:大话双核i.MXRT1170之Cortex-M7与Cortex-M4互相激活之道

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是恩智浦i.MXRT1170上Cortex-M7与Cortex-M4内核互相激活的方法. 痞子衡最近在深耕i.MXRT1170这颗划时代的 ...

  9. 痞子衡嵌入式:简析i.MXRT1170 Cortex-M7 FlexRAM ECC功能特点、开启步骤、性能影响

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是恩智浦i.MXRT1170上Cortex-M7内核的FlexRAM ECC功能. ECC是"Error Correcting ...

随机推荐

  1. 空顺序表的实现(基于c语言)

    书中对于创建一个空线性表的定义如下: struct SeqList{ int MAXNUM; // 顺序表中最大元素的个数(也就是最多多少个元素),(其实MAXNUM也可以定义在外面) int n; ...

  2. Java案例——字符串中的数据排序

    需求:有一个字符串"9 1 2 7 4 6 3 8 5 0",请编写程序实现从小到大数据排序 分析:最重要的部分是如何将字符串中的数据取出来 1.定义一个字符串为"9 1 ...

  3. 使用Typora做笔记

    本文旨在分享使用Typora做笔记的一些心得 一.介绍 为什么要用Typora 作为一个程序员,在学习过程中打交道的不单单是文字,还有各种语言的代码块和公式,以及一些简单的流程图和思维导图(就目前而言 ...

  4. 网络IO模型 非阻塞IO模型

    网络IO模型 非阻塞IO模型 同步 一件事做完后再做另一件事情 异步 同时做多件事情 相对论 多线程 多进程 协程 异步的程序 宏观角度:异步 并发聊天 阻塞IO 阻塞IO的问题 一旦阻塞就不能做其他 ...

  5. web自动化之svg标签定位

    今天在定位元素的时候,发现页面有一个svg标签需要进行定位. 于是便使用常规的xpath定位方法试了一下,很明显结果是不行的,哈哈哈... 错误定位方法://div[@class="oper ...

  6. 线程池提交任务时submit()和execute()的区别

    因为之前一直是用的execute方法,最近有个情况需要用到submit方法,所以研究了下. 他们的区别: 1.execut()可以添加一个Runable任务,submit()不仅可以添加Runable ...

  7. CodeForces Round #760 (Div. 3)

    A. Polycarp and Sums of Subsequences 题目大意: 给七个不降序的数字,为三个数组合后得到的七种答案,求原来的三个数是哪些 思路: 由样例不难发现,第一个一定是三个数 ...

  8. 《手把手教你》系列基础篇(八十三)-java+ selenium自动化测试-框架设计基础-TestNG测试报告-下篇(详解教程)

    1.简介 其实前边好像简单的提到过测试报告,宏哥觉得这部分比较重要,就着重讲解和介绍一下.报告是任何测试执行中最重要的部分,因为它可以帮助用户了解测试执行的结果.失败点和失败原因.另一方面,日志记录对 ...

  9. linux设置java环境变量与开机自启

    一.下载jdk并放置在指定位置 二.编辑profile文件 vim /etc/profile  或者  将/etc下的profile 文件修改好再上传覆盖源文件 修改方式即添加以下内容至文件最底部即可 ...

  10. 面试问题之C++语言:面向对象的三大特性

    转载于:https://www.cnblogs.com/BEN-LK/p/10720249.html 面向对象的三大特性:封装.继承.多态 封装:就是把客观事物封装成抽象的类,并且类可以把自己的数据和 ...