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:在 IRQ 中执行 THUMB 指令时出现问题

Guru**** 2464080 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1111873/tms570lc4357-issues-executing-thumb-instructions-in-irq

器件型号:TMS570LC4357
主题中讨论的其他器件:HALCOGEN

我目前正在处理一个项目、在此项目中、我们将使用编译标记"-code_state=16"来编译项目以获取经验法则指令。 我正在运行中、出现一个问题、即我正在输入 IRQ、进入此 IRQ 后、CPSR 寄存器中的 T 位将从1切换到0 (Thumb 切换到 ARM)、但此 IRQ 中的指令仍然是 Thumb 指令。  在 IRQ 内执行其中一个 thumb 指令(MOV 指令)时、我会得到一个未定义指令硬故障。 我不确定这是因为在 ARM 模式下尝试执行一个 thumb 指令、还是因为其他原因。 在执行导致硬故障的指令之前和执行导致硬故障的指令之后、我附加了一个内核寄存器状态的图像。 我还附上了 C 代码反汇编的图片、以确切显示导致问题的指令。 如果有任何关于如何解决这一问题的指示,将不胜感激。

谢谢、

Thomas

以前:

之后:  

拆卸:

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

    尊敬的  Thomas:

    UNDEF 异常是由 unkown 或未定义的指令引起的。 UNDEF 发生在"BL #0x42892"(R14_UNDEF -2)处、对吧? 我认为拇指支持 LB 指令。

    在快照中、在中断前后、CPSR 的 T 位为0

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

    根据 ARM 文档、未定义的指令不会出现在"MOV r0、#0"、因为 J 和 T 位都为0、所以它将是(R14_UNDEF - 4)?

    https://developer.arm.com/documentation/ddi0406/cb/System-Level-Architecture/The-System-Level-Programrs--Model/Exception-descriptions/Undefined-Instruction-exception?lang=en

    除此之外,我在第一个帖子中附加的图片都在 IRQ 中。 标记为"之前"的是在执行导致 UNDEF 的指令之前、"之后"是在执行导致 UNDEF 的指令之后。 我已附上新图片、以显示 IRQ 进入之前和 IRQ 进入之后 CPSR 寄存器的状态。 如您所见、在进入 IRQ 模式之前、我处于 Thumb 模式、在进入 IRQ 模式之后、我处于 ARM 模式。

    进入 IRQ 前:

    输入 IRQ 后:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [如您所见、在进入 ARM 模式前、在进入 AM / AM 以下模式前、请引用 userid="525295" URL"~/support/microcontrollers/arm-based microcontrollers-group/arm -based-microcontrollers/f/arm based-microcontrollers-forume/1111873/tms570lc4357-issions-executing-thume-ine-ine-ine-ine-ine-ine-ine-ine-IRQ#4120704"]、并在进入 ARM/I thumb 模式。]

    异常进入和退出摘要的快速查看 和 C1、  Cortex-R5和 Cortex-R5F 技术参考手册 r1p1中的系统控制寄存器、在异常进入时:

    [引用]根据 SCTLR[/引用]中 TE 位的状态设置 T 位

    您的程序是否在  SCTLR 中设置了 TE 位、或将其保留在 复位值?

    其中、复位 TE 位值由 主输入 TEINIT 配置、我认为 TI 已将其绑定为提供复位值、以便在 ARM 模式下进行异常。

     虽然 SCTLR 中的 TE 位未标记为只读、但如果更改、它将影响所有异常、直到下次复位、这意味着您可以将不同的异常混合并匹配为 ARM 或 Thumb 模式。

    [引用 userid="525295" URL"~μ C/support/microcontrollers/arm-based microcontrollers-group/arm -based microcontrollers/f/arm based microcontrollers-forume/1111873/tms570lc4357-issues- executing-thume-instructions-in thume-IRQ "]我目前正在处理一个项目、在此项目中、我们将使用 status=16的代码来编译 state-flag 代码。 [/报价]

    我认为针对 IRQ 处理程序的 HALCoGen 方法是使用特定的 pragma 在 ARM 模式下生成 IRQ、从而覆盖项目复位的设置。 例如:

    #pragma CODE_STATE(vPortRTOSRunTimeISR, 32)
    #pragma INTERRUPT(vPortRTOSRunTimeISR, IRQ)
    void vPortRTOSRunTimeISR(void)

    将 使用#pragma CODE_STATE ( 32)要使 IRQ 处理程序处于 ARM 模式,或者是否需要 IRQ 处理程序实际以 THUMB 模式运行?

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

    感谢您提供有关 TE bit 的信息、这正是我要寻找的内容。 是的、我尝试让 IRQ 中的代码部分也在 Thumb 模式下执行。