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.

[参考译文] TMS570LC4357:如何确定异常处理程序的返回地址

Guru**** 2442090 points
Other Parts Discussed in Thread: TMS570LC4357

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1319814/tms570lc4357-how-to-determine-the-return-address-of-an-exception-handler

器件型号:TMS570LC4357

你好

我想在 cortex-R5F 板上生成预取异常、处理预取异常处理程序、然后返回到原始代码。

当我查看 ARM 文档时、我发现预取异常只需要返回到 LR -4。
但是、lr 表示一个矢量表。

启用了调试监视器功能。 我在主代码中设置断点。
在这种情况下、PC 卡在矢量表预取中。

如果按 STEP、则会进入预取。
我不知道为什么必须继续执行下一步才能进入预取异常处理程序。

我在0x4948处设置了一个断点、0x4948位于 SVC 栈指针的地址- 28。

R14指向一个奇怪的地址、所以我不知道如何返回。

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

    尊敬的 

    很抱歉我的答复出现延误。

    我创建了一个示例工程、但有两个例外、如下所示:

    在这里、我将通过将某个值直接写入闪存来创建数据中止异常、而在这里、我将尝试从 未实现的 闪存区域执行代码来创建预取异常。

    在这里、我将切换一个 LED 的次数有限、例如10次、然后我将创建相应的异常。

    这里、我将在异常处理程序中发生异常后执行软件复位、以便从起始地址正常地对控制器重新工作。

    以下是预取中止的测试结果:

    如果处理器尝试执行来自受保护或有故障的存储器位置的指令、则会接收到预取中止异常。 所有预取中止都是同步的。

    导致 预取中止的指令位于 R14_ABT–4。 lr_ABT 指向导致异常的指令的下一条指令。 所以、这意味着  

    R14_ABT–4 = 0x00400008 - 4 = 0x00400004 (导致中止的指令)。

    此外 、IFAR 寄存器将直接提供导致预取中止的指令。

    我还通过移除断点进行了测试、代码运行良好、我的意思是在触发预取异常后、控制器会直接复位、然后再次 从启动开始执行。

    我将随附用于您的测试的代码:

    e2e.ti.com/.../8547.Writing_5F00_C_5F00_Handler_5F00_For_5F00_Exception_5F00_LC4357.zip

    --
    谢谢。此致、
    Jagadish。

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

    您好!

    我也真诚地请求您参考以下常见问题解答

    (+)[常见问题解答] TMS570LC4357:Hercules 器件上的中止异常疑难解答-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    这里 QJ 详细解释了 TMS570LC4357的不同中止和例外、并且他还提供了它们的调试过程。

    --
    谢谢。此致、
    Jagadish。

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

    您好!
    谢谢你。  
    我能够根据你告诉我的情况确认几件事。
    如果我没有使用调试监视器函数、那么结果可能与您所说的相同。

    我注意到一些奇怪的事情。
    连接调试器后、我激活了调试监视器并到达一个断点、出现了异常、并确认向量表中的预取异常在执行前停止(使用 LED 进行检查)。
    我不知道为什么它会停在这里。 按步进或步越调用进入预取异常处理程序。

    如果删除调试器、激活 DebugMonitor 函数并发送 IFAR 寄存器值、断点的地址实际上将显示
    (通过 CAN 发送进行检查)。

    但是、R14值被判定为不同、恢复不能正常工作。


    连接到调试器时、我是否还需要进行其他配置?
    使用 Debugmonitor 函数时、您能否确认是否在 R14中输入不同的值? 我不知道如何阅读它,因为它不是 GNU 风格的内联汇编。

    此外、它在异常发生之前处于 SVC 模式、如果您查看异常处理程序内部、abt_r14是可矢量表中的预取执行地址、Svc_r14是 BP 捕获的地址+ 4。
    abt_r14必须包含 BP 的地址、对吧?

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

    您好!

    我不明白"调试监视器"如何以及您如何在代码中激活此调试监视器。

    您能更清楚地解释一下吗? 以便我能够理解、并且在最终也进行相同的测试。

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

    您好!

    我从 ARM 架构参考手册(ARMv7-A 和 ARMv7-R 版本)获得了信息。

    据说、如果您在 DBGDCR 寄存器中启用 MDBGen 寄存器并禁用 HDBGen、则在设置断点时将发生预取异常。
    我实施了它。 但是、当插入调试器时、它会在矢量表处停止。


    一旦确认该状态下的内容进入异常、BP 命中位置+ 4值将在进入异常之前以模式(SVC、SYS 等)输入 R14。
    但是、abt_r14仅包含 vectorTable 的预取异常地址。
    与 IFAR 相同、abt_r14包含 vectorTable 预取异常。


    当我检查以在没有调试器的情况下将 IFAR 值作为 CAN 消息发送时、出现了断点+4地址。
    因为它不支持 GNU 样式的汇编程序,我无法准确地检查值,但我立即返回,控制器死了。
    abt_r14似乎仍然具有错误的值。

    将来自前一个模式的 r14置于 abt_r14是否正确?
    是否有办法防止其即使在调试器插入时也在矢量表处停止? (我认为 HDBGen 也可以再次启用。)

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

    尊敬的 

    我刚调到我的同事、检查他能否 在这个问题上提供更好的支持。

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

    尊敬的 Changmin:

    我正在尝试将 DBGDCSC[15:14]编程到 B10。 但我有一个 UNDEF 例外。 如何在测试中启用调试监视器?

    //要使用 DBGDCR,请读取或写入带有的 CP14 C1
    asm (" MRC P14、#0x0、r0、c0、c1、 #0x0");//读取 DBGDCR
    asm (" Orr r0、r0、#0x00008000");// bit 15=1、bit14=0
    asm (" mcr P14、#0x0、r0、c0、c1、 #0x0");//写入 DBGDCSR -->导致 UNDEF 异常
    asm (" MRC P14、#0x0、r0、c0、c1、 #0x0");//读取 DBGDCR

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    
    
    您好 
    我不知道为什么 UNDEF 例外出现。
    我尝试了几件事。 当我直接访问和更改地址时、没有发生任何例外。 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、我将执行另一个测试

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

    您试过吗? 仍然很奇怪。

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

    我无法写入调试 CP14寄存器  

    所有 MCR 指令都会生成 UNDEF 异常。 如何写入 CP14寄存器?

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

    我在 TI TMS570lc4357文档中找到了存储器映射。
    当您更改与调试相关的 baseAddress 和 offset 的地址值时、它会发生更改。
    MRC 和 MCR 指令不起作用、会导致 UNDEF 异常。

    DBGEN 和 SPIDEN 被认为是单个的。 是否有寄存器可用于设置此值? 如何创建 DBGEN 状态?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当您更改 Debug Related baseAddress 的地址值加上 offset 时,它会发生更改。
    MRC 和 MCR 指令不起作用并导致 UNDEF 异常。[/引号]

    我不更改任何这些地址。 向 CP15寄存器写入值时、MCR 不会生成任何异常。

    您的目的是生成预取中止。 您是否会使用其他方法来生成 PABT?  

    如果处理器尝试执行来自受保护或有故障的存储器位置的指令、则会接收到预取中止异常。

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

    如果在没有设置调试监控的情况下执行了实际预取、则正常输入 r14返回地址。
    例如、DBGVR0地址为0xFFA01100。
    并且某些 CP14寄存器似乎未被执行或无法访问。
    另外、可以说 DBGEN 和 SPIDEN 是信号。 是否有寄存器可用于设置此值? 如何创建 DBGEN 状态?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我想在 cortex-R5F 板上生成预取异常,在预取异常处理程序上工作,然后返回到原始代码。

    我的测试显示、多个 CP14寄存器不可写。 您是否可以使用其他方式来生成预取中止? 示例为 writing_C_croningLC4357.zip 中的 Handler_For_Exception_。

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

    它说上次运行良好。
    如果设置了调试监控模式设置并设置了断点、则会发生预取异常。

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

    默认情况下未启用监控模式:bit[15:14]= B01。 如何启用它?

    DCR 通过 CP14只读。  

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

    可按存储器地址访问实现的 cp14寄存器。

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

    我知道一些调试寄存器是内存映射的。 我已解锁这些寄存器的访问权限、但无法将新数据写入 DCR 寄存器。