0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

IAR 开发环境下调试从核工程的方法(IAR篇)

恩智浦MCU加油站 来源:恩智浦MCU加油站 作者:恩智浦MCU加油站 2022-05-26 17:27 次阅读

两年前我写过一篇《双核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.MX RT1170 其实主从核是在 Fuse 里可配的,我们就以默认配置(Cortex-M7 为主,Cortex-M4 为从)为例来介绍,选取的测试工程是SDK_2.11.0_MIMXRT1170-EVKoardsevkmimxrt1170demo_appshello_worldcm4。

二、在IAR下调试

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

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

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

7ed24dd8-dc8b-11ec-ba43-dac502259ad0.png

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

7ef7bf96-dc8b-11ec-ba43-dac502259ad0.png

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 文件里了,我们看不到具体脚本代码实现。

7f250c6c-dc8b-11ec-ba43-dac502259ad0.png

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

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

7f5f5502-dc8b-11ec-ba43-dac502259ad0.png

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

7f99bb84-dc8b-11ec-ba43-dac502259ad0.png

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() 函数。

7fd0b986-dc8b-11ec-ba43-dac502259ad0.png

对于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() 函数。

80103b2e-dc8b-11ec-ba43-dac502259ad0.png

附录一、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);
    }
}

编辑:黄飞

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    18219

    浏览量

    221936
  • IAR
    IAR
    +关注

    关注

    5

    文章

    319

    浏览量

    36281
  • 调试器
    +关注

    关注

    1

    文章

    287

    浏览量

    23392

原文标题:双核i.MX RT1170之单独在线调试从核工程的方法(IAR篇)

文章出处:【微信号:NXP_SMART_HARDWARE,微信公众号:恩智浦MCU加油站】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    请问LAUNCHXL-CC1310开发板可以在IAR下调试开发吗?支持CJTAG吗?

    想买LAUNCHXL-CC1310这个板子,是否支持在IAR下调试开发?是否支持CJTAG?
    发表于 05-15 07:08

    请问有在IAR5.5环境下调试STM32的文档说明吗?

    有在IAR5.5环境下调试STM32的文档说明吗?怎么设置IAR5.5?
    发表于 05-22 02:19

    IAR调试中不同复位类型的介绍

    IAR调试中不同复位类型的介绍在IAR 环境下调试有不同的复位类型,其中一些只复位内核不复位MCU 外设的复位方式在特定情况下可能会造成仿真
    发表于 10-19 07:54

    最新IAR集成开发环境文件下载

    最新IAR集成开发环境文件下载
    发表于 08-12 11:18 223次下载

    IAR 在线调试查看各种变量的不同方法

    IAR在线调试查看各种变量的不同方法
    的头像 发表于 03-12 10:00 1.2w次阅读

    IAR ARM集成开发环境学习教程

    IAR Embedded Workbench for ARM 是IAR Systems 公司为ARM 微处理器开发的一个集成开发环境(下面简
    发表于 08-24 16:47 31次下载
    <b class='flag-5'>IAR</b> ARM集成<b class='flag-5'>开发</b><b class='flag-5'>环境</b>学习教程

    STM32单片机IAR环境下重定向printf函数

    STM32单片机IAR环境下重定向printf函数一、引言在项目开发中,使用printf函数通过串口打印调试信息,需要对printf函数进行改写,重定向到使用的串口号,该例中使用的单片
    发表于 12-03 10:36 15次下载
    STM32单片机<b class='flag-5'>IAR</b><b class='flag-5'>环境</b>下重定向printf函数

    STM32开发,使用IAR软件建立工程

    STM32开发,使用IAR软件建立工程1 概述1.1 资源概述1.2 在IAR中建立工程2 IAR
    发表于 12-03 10:51 12次下载
    STM32<b class='flag-5'>开发</b>,使用<b class='flag-5'>IAR</b>软件建立<b class='flag-5'>工程</b>

    IAR新建包含官方库文件的工程方法

    IAR新建包含官方库文件的工程方法
    发表于 12-03 11:06 10次下载
    <b class='flag-5'>IAR</b>新建包含官方库文件的<b class='flag-5'>工程</b>的<b class='flag-5'>方法</b>

    IAR for 8051 开发环境的安装

    IAR for 8051 开发环境的安装
    发表于 12-03 11:21 16次下载
    <b class='flag-5'>IAR</b> for 8051 <b class='flag-5'>开发</b><b class='flag-5'>环境</b>的安装

    IAR开发环境下调试核工程方法

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是i.MXRT1170下在线联合调试核工程方法(基于IAR)。
    的头像 发表于 06-20 11:32 3080次阅读

    IAR下调试信息输出机制之硬件UART外设

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是IAR下调试信息输出机制之硬件UART外设。
    的头像 发表于 08-24 10:03 1602次阅读

    IAR下调试信息输出机制之半主机

    软件上 PC 这边就需要 IAR 开发环境即可,这里在编译目标板 MCU 应用程序时,除了需要包含打印输出相关代码(标准 I/O 库接口),底层接口实现必须选用 IAR 的 Semih
    发表于 08-24 11:30 546次阅读

    APM32F003F6P6_环境问题_推荐除Keil和IAR以外的开发环境

    APM32F003F6P6_环境问题_推荐除Keil和IAR以外的开发环境
    发表于 11-09 21:03 0次下载
    APM32F003F6P6_<b class='flag-5'>环境</b>问题_推荐除Keil和<b class='flag-5'>IAR</b>以外的<b class='flag-5'>开发</b><b class='flag-5'>环境</b>

    基于IAR for arm9.30.1在VS Code调试仿真RA

    开发环境 IDE:IAR for arm9.30.1 +VS Code 仿真器:J-Link V9 芯片型号:R7FA2L1AB2DFM 本文档是基于芯片R7FA2L1AB2DFM,理论所有ARM
    的头像 发表于 01-16 13:20 1973次阅读