This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM2434:使用 cp14运行调试相关寄存器、将导致未定义的异常

Guru**** 2418170 points
Other Parts Discussed in Thread: AM2434

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1315957/am2434-using-cp14-to-operate-debug-related-registers-will-result-in-an-undefined-exception

器件型号:AM2434

我使用 cp14、这是 MRC 和 MCR 用于操作调试相关寄存器的指令、这将导致未定义的异常。 然而,armV7r 的官方发布手册规定 cp14可用于操作,如图所示。  

那么、我可以问一下如何操作它吗? 如果是方法1、可以看出 V7debug 的 cp14接口是由制造商定义的、那么 TI 本身是否定义了方法? 如果是 TI 设置的方法2地址映射、还请告知映射的地址区域。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我们需要系统架构师的帮助来解答您的问题。 在此主题中、我们可能需要几天时间才能再次与您联系。

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Lin:

    下面是我们的系统架构师给出的答案:  

    1. CP14是访问 V7R 调试寄存器的有效方式、但与此相关的规则记录在《V7R 架构参考手册》中。  根据 E2E 博文中提到的行为、我猜测代码并非在具有 PL1或更高权限级别(这是 ARMv7-R 要求的)的情况下执行。
    2. TI 的确支持寄存器的存储器映射视图、所以这可被用作一种访问这些寄存器的方法:

     

    物理地址

    AM2434–Arm R5F 内核

    APB-AP (32位)

    SoC 地址空间(36位)

    R5F0_0

    0x9D410000

    0x73D410000

    R5F0_1

    0x9D412000

    0x73D412000

    R5F1_0

    0x9D510000

    0x73D510000

    R5F1_1

    0x9D512000

    0x73D512000

    请注意、对调试资源的访问也会受到器件安全状态的影响。

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我已经检查过代码已在系统模式中执行、即 PL1、具有 PL1的特权级别。 但仍会发生未定义的异常。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Lin:

    您能否提供生成 未定义异常的代码?

    此致、  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     如图所示, 使用 MCR 写入 DBGDSCRext 时,它处于系统模式。 如下图所示、一旦代码被执行、它就会进入一个未定义的异常。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Lin:

    我将您的信息传递给了我们的系统架构师。 在等待他们的回答时、我可以问 wa=hat 是您想要访问 CP14寄存器的原因吗? 您是否在开发自己的调试器?

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Lin:

    以下是我们的系统架构师的评论:

    ----------------

    我有一些意见、再说一次、我只是阅读 ARM 文档。 如果此指示灯亮起、那么我们可能需要将客户转至 ARM 支持。

    1. 代码片段显示了在活动 CCS 调试器会话的上下文中对写入 CP14寄存器的代码进行的调试。  CCS 驱动程序将使用相同的寄存器来管理调试会话、更新这些寄存器可能会在调试会话中引入不稳定并导致未定义行为。  
      1. 请索取有关客户尝试执行的操作的信息。
      2. 关于到 DBGSCRext 的访问—有没有一个为什么需要通过 DBGSCRint 来实现这一操作的原因?
      3. 根据 Arm 文档、必须满足几个标准(有关详细信息、请参阅 v7《Arm 架构参考手册》(ARM)文档)。  其中一项检查是:IF DBGPRSR。 SPD= 1之后、对某些寄存器的访问变为未定义(尽管此寄存器应该可读)。  请检查此项。  
      4. 根据 R5 TRM、有一种锁定机制会阻止写入调试寄存器(请参阅 DBGLSR、DBGLAR)、如果您在 CCS 上下文之外运行、该机制会相关。

    ----------------

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    正如系统架构师所说的、我在没有 CCS 调试器的情况下运行代码、但未定义的异常仍然会发生、因此我认为未定义的异常并不是由 CCS 调试器环境导致的。  

    答:我们要做的就是 编写自己的代码来实现调试函数。 因此、我们应借助一些调试寄存器来实现它。

    b:因为  DBGDSCRint 是 RO、所以我们需要写入 DBGDCSR。 然后 DBGDSCRext 是 RW、所以我们要访问 DBGSCRext。

    c. d  我也可以找到这些要求。  我还需要检查 DBGPRSR。 SPD 和 DBGLSR。 但如下图中的代码所示、读取 DBGPRSR 和 DBGLSR 仍会导致未定义的异常。  

    所以我不知道要解决这个问题。 请告诉我如何详细编程,而不是根据手册猜测。 谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Lin:

    我确实尝试了对表 C 6-3中列出的寄存器进行读取/写入。 只能读取寄存器 0、1、5。 我已经向更广泛的受众发送了一封电子邮件、以寻求帮助。 可能需要几天时间才能得到回复。 非常感谢您的耐心。

    此致、

    明  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Lin:

    我们终于找到了这个问题的根本原因。 对于 ARM V7架构、只能通过 CP14接口访问少数几个 CP14寄存器:

    其余寄存器必须通过存储器映射接口进行访问:

     

    物理地址

    AM2434–Arm R5F 内核

    APB-AP (32位)

    SoC 地址空间(36位)

    R5F0_0

    0x9D410000

    0x73D410000

    R5F0_1

    0x9D412000

    0x73D412000

    R5F1_0

    0x9D510000

    0x73D510000

    R5F1_1

    0x9D512000

    0x73D512000

    由于 CP14存储器映射基址为36位、因此您需要在 syscfg 中为其设置 RAT 条目:

    我们 在 RAT 条目中将0x73D410000映射到0x10000000。

    以下是用于访问 CP14接口和内存映射接口的代码段:

     

    uint32_t * CP14_MMR_REGION_ptr =(uint32_t *) 0x10000000;// 0x73D410000的本地地址
    uint32_t cp14_193 = 0;
    uint32_t cp14_197 = 0;
    void hello_world_main (void * args)
    {
      /*打开驱动程序以打开控制台的 UART 驱动程序*/
      drivers_open();
      Board_driversOpen();

      //通过 CP14接口进行寄存器访问
      _asm ("MRC P14、0、r0、c0、c0、 0");//读取 DBIDR (寄存器0)
      _asm ("MRC P14、0、r0、c0、c1、 0");//读取 DBGDSRCint (寄存器1)
      _asm ("MRC P14、0、r0、c0、C5、 0");//读取 DBGDTRRXint (寄存器5)
      //__asm ("MCR P14、0、r0、c0、C5、 0");//写入 DBGDTRTXint

      _asm ("MRC P14、0、r0、c1、c0、 0");//读取 DBGDRAR (寄存器128)
      _asm ("MRC P14、0、r0、C2、c0、 0");//读取 DBGDSAR (寄存器256)

      //通过存储器映射接口进行寄存器访问
      cp14_193 = CP14_MMR_REGION_PTR[193];//读取 DBGOSLSR (寄存器193)
      cp14_197 = CP14_MMR_REGION_ptr[197];//读取 DBGPRSR (寄存器197)

      DebugP_log ("Hello World!\r\n);

      ...

    我已经测试了上述代码。 它像预期的那样工作。  

    请注意这个代码与 DAP 冲突的事实、所以您不能使用 CCS 内存浏览器来查看0x10000000区域。

    此致、