zoukankan      html  css  js  c++  java
  • 痞子衡嵌入式:Keil在线调试时设不同复位类型可能会导致i.MXRT下调试现象不一致(J-Link/DAPLink)


      大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是Keil在线调试时设不同复位类型可能会导致i.MXRT下调试现象不一致

      本篇是 《IAR EWARM复位类型》《MCUXpresso IDE复位类型》的同系列篇,三大经典IDE(IAR EWARM、Keil MDK、MCUXpresso IDE)下的复位策略只剩 Keil MDK 没介绍了,心事不了,觉睡不好。今天痞子衡就来认真讲一下搞嵌入式生涯里最早接触的 IDE - Keil,完结这个系列。

    • Note: 痞子衡测试的Keil MDK版本是v5.31。

    一、Keil调试机制与调试分类

      关于 Keil MDK 下的调试机制原理在 Keil_v5ARMHlp 目录下没有找到专门的设计性文档,IDE 帮助手册 uv4.chm 里 Debugging 章节更多是介绍如何在 IDE 里使用下载调试功能。

      不过调试机制在各 IDE 上大同小异,设计理念都是一致的,这部分建议参考 《IAR EWARM复位类型》 里的一、二章节。

    二、复位类型全解析

      好了,现在我们进入正题,开始介绍 Keil 下复位类型。我们知道不同硬件仿真器下复位功能有差异,痞子衡主要介绍 i.MXRT 上两种最常用的仿真器:J-Link 和 DAPLink。此外不管是哪种仿真器,其都借助了 Cortex-M7 内核功能,内核在 SCB 模块的 AIRCR 寄存器中集成了复位的支持,详见 《IAR EWARM复位类型》3.1 Cortex-M7复位功能 小节。

    2.1 J-Link复位类型

      Keil 里关于 J-Link 连接(Connect)和复位(Reset)是两级设置,先连接后复位,并且复位动作仅在勾选了"Reset after Connect"之后才有效。实际使用中推荐 Connect 选项固定设为"Normal",且勾选上"Reset after Connect",然后在 Reset 选项里指定想要的复位类型。

    Note: 详细介绍可以查看 Keil_v5ARMHlpjlink.chm 文档中 Debug 小节

      连接类型选项:

    • Normal:默认的连接策略,连接后只是将 PC 停在当前执行的指令处
    • with Pre–reset:在连接前,先执行一次 HW RESET
    • under Reset:在连接过程中一直保持 HW RESET 有效(该选项适用于用户程序误将 JTAG/SWD 禁掉的情况)

      复位类型选项:

    • Normal(复位编号0):默认的复位策略,对于i.MXRT来说等同于Core and peripherals方式
    • Core(复位编号1):借助Cortex-M内核模块SCB中的AIRCR寄存器的VECTRESET位功能来复位Core
    • Reset Pin(复位编号2):通过拉低J-Link的RESET引脚(一般也会接到MCU reset脚)来复位MCU
    • Core and peripherals(复位编号8):借助Cortex-M内核模块SCB中的AIRCR寄存器的VECTRESET位和SYSRESETREQ位来同时复位Core和MCU外设模块

      剩下几种复位类型不适用i.MXRT,暂不介绍。

    2.2 DAPLink复位类型

      Keil 里关于 DAP-Link 连接(Connect)和复位(Reset)也是两级设置,先连接后复位,并且复位动作仅在勾选了"Reset after Connect"之后才有效。实际使用中推荐 Connect 选项固定设为"Normal",且勾选上"Reset after Connect",然后在 Reset 选项里指定想要的复位类型。此外相比 J-Link 还多一个 "Stop after Reset "选项,这个选项用于永久使能应用程序复位向量的捕获,我们一般不勾选。

    Note: 详细介绍可以查看 Keil_v5ARMHlpdapdebug.chm 文档中 Debug 小节

      连接类型选项:

    • Normal:默认的连接策略,连接后只是将 PC 停在当前执行的指令处
    • with Pre–reset:在连接前,先执行一次 HW RESET
    • under Reset:在连接过程中一直保持 HW RESET 有效(该选项适用于用户程序误将 JTAG/SWD 禁掉的情况)
    • without Stop:连接后任 CPU 自由执行(适用于观测存储器或者外设 SFR 情况)

      复位类型选项:

    • HW RESET:通过翻转DAPLink的nSRST/nRESET引脚(一般也会接到MCU reset脚)来复位MCU
    • SYSRESETREQ:借助Cortex-M内核模块SCB中的AIRCR寄存器的SYSRESETREQ位来同时复位MCU外设模块
    • VECTRESET:借助Cortex-M内核模块SCB中的AIRCR寄存器的VECTRESET位功能来复位Core

    三、复位类型对在线调试的影响

      复位类型对在线调试的影响分两种:一、是否影响应用程序正常调试;二、是否影响应用程序正常运行。对于第二点,因为应用程序的设计差异,无法确定复位类型的不同导致的未复位模块对其产生何种影响,因此我们暂不讨论这点,我们主要看第一点。

      设置不同的复位类型是否影响应用程序正常调试(能否停在程序入口函数,能否进行单步)?痞子衡在MIMXRT1050-EVKB上实测了SDK里的led_blinky例程,选取了flexspi_nor_debug(在Flash)build做了很多组测试,结果如下:

    例程Build 仿真器 复位类型 BootMode 调试现象
    debug J-Link
    DAPLink
    所有的(除了DAPLink下HW RESET) 2'b01 - SDP
    2'b10 - Flash Boot
    正常下载与调试
    flexspi_nor_debug J-Link - Core 2'b01 - SDP
    2'b10 - Flash Boot
    正常下载与调试
    flexspi_nor_debug J-Link - Normal
    - Core and peripherals
    2'b01 - SDP 关闭校验后可正常下载,但无法调试
    flexspi_nor_debug J-Link - Normal
    - Core and peripherals
    2'b10 - Flash Boot 关闭校验后可正常下载,能正常调试
    flexspi_nor_debug J-Link - Reset Pin 2'b01 - SDP 正常下载,但无法调试
    flexspi_nor_debug J-Link - Reset Pin 2'b10 - Flash Boot 正常下载与调试
    flexspi_nor_debug DAPLink - VECTRESET 2'b01 - SDP
    2'b10 - Flash Boot
    正常下载与调试
    flexspi_nor_debug DAPLink - SYSRESETREQ 2'b01 - SDP 关闭校验后可正常下载,但无法调试
    flexspi_nor_debug DAPLink - SYSRESETREQ 2'b10 - Flash Boot 正常下载与调试
    flexspi_nor_debug DAPLink - HW RESET 2'b01 - SDP
    2'b10 - Flash Boot
    无法下载,报错无法停止CPU

      从上表的测试结果,我们可以得到如下结论:

    • 结论1:在Flash调试,要想正常调试,要么不复位片上外设(保留Flashloader对FlexSPI等模块的初始化),要么启动模式设成Flash Boot(让BootROM完成FlexSPI等模块的初始化),因为Clock/GPIO/FlexSPI的初始化必须保留,CPU才能正常获得Flash里指令。
    • 结论2:JLink复位下,Keil MDK调试体验与其他IDE是一致的。
    • 结论3:DAPLink复位下,Keil MDK下HW RESET方式复位可能会报奇怪的内核连接错误。

      至此,Keil在线调试时设不同复位类型可能会导致i.MXRT下调试现象不一致现象痞子衡便介绍完毕了,掌声在哪里~~~

    欢迎订阅

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

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

      最后欢迎关注痞子衡个人微信公众号【痞子衡嵌入式】,一个专注嵌入式技术的公众号,跟着痞子衡一起玩转嵌入式。

    痞子衡嵌入式-微信二维码 痞子衡嵌入式-微信收款二维码 痞子衡嵌入式-支付宝收款二维码

      衡杰(痞子衡),目前就职于恩智浦MCU系统部门,担任嵌入式系统应用工程师。

      专栏内所有文章的转载请注明出处:http://www.cnblogs.com/henjay724/

      与痞子衡进一步交流或咨询业务合作请发邮件至 hengjie1989@foxmail.com

      可以关注痞子衡的Github主页 https://github.com/JayHeng,有很多好玩的嵌入式项目。

      关于专栏文章有任何疑问请直接在博客下面留言,痞子衡会及时回复免费(划重点)答疑。

      痞子衡邮箱已被私信挤爆,技术问题不推荐私信,坚持私信请先扫码付款(5元起步)再发。


  • 相关阅读:
    Mysql group by语句的优化
    Mysql join语句的优化
    jquery 只读
    【Unity Shaders】Transparency —— 使用渲染队列进行深度排序
    oracle多表查询之内连接,外连接语句总结
    String比较相等的问题探索
    markdown实例
    集合list里存储list,要遍历最底层list的对象元素的遍历方法
    System.out.println(i++); System.out.println(++i);的区别
    windows自动快捷方式
  • 原文地址:https://www.cnblogs.com/henjay724/p/14907528.html
Copyright © 2011-2022 走看看