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.

[参考译文] LAUNCHXL2-RM46:使用 RTOS 和中断进行预取和数据中止

Guru**** 2611705 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/771394/launchxl2-rm46-prefetch-and-data-abort-with-rtos-and-interrupts

器件型号:LAUNCHXL2-RM46
主题中讨论的其他器件:HALCOGEN

您好!

我正在使用 LaunchPad XL2-RM46和 CCS 8.2.0 (用于 ARM 的编译器、TI v18.1.5.LTS)。 我基于 FreeRTOS 的简化编写了一个 RTOS。 对于具有 FreeRTOS 的 RM46处理器、此 RTOS 仅使用静态分配的存储器和汇编代码来处理从任务切换到另一任务的上下文、这与 HALCoGen 生成的内容相同(04.07.00)。 我还使用相同的中断(RTI COMP0、SSI 和 SVC)来处理 RTOS 工作。

如果我只使用具有3个中断的 RTOS 调度程序、一切都正常。 我曾尝试创建3个任务、2个用于使板上的两个用户 LED 闪烁、1个用于暂停任务或尝试其他任务控制器。 一切都好。 当我尝试使用其他中断时、例如、处理 eTPWM 模块输出的 PWM 信号时、代码在某些周期内正常工作、然后我有中止条件。 我很难找到这个问题的根源。

这种情况看起来有点奇怪、因为当我第一次运行(在调试中)应用程序时、在大约22k 次 eTPWM 中断被触发后、我通常会有一个预取中止条件、但并非总是如此。 在所有其他情况 下、恰好在8188 eTPWM 中断触发后(ISR 内部有一个计数器)、我会遇到数据中止错误。 我一直在更改总堆栈尺寸(在链接器文件中)以及用户、IRQ 和 SVC 堆栈尺寸(更新_coreInitStackPointer_函数)、但它 没有解决问题(计数器值始终为8188)。

在触发数据中止中断时遵循相关寄存器值:

PC = 0x00000010 (= 中断矢量中"B"_dabort"的位置)

SP = R13_ABT = 0x08001F00 (=_coreInitStackPointer_函数内固定的堆栈"abortSp"的顶部)

LR = R14_ABT = 0x000002B0

R0 = 0xE8FD9800

CP15_DATA_FAULT_STATUS = 0x00000808 (保留值... 我不知道这是什么意思;我检查了 Cortex-R4 TRM r1p3、第129页)

CP15_DATA_FAULT_ADDRESS = 0xE8FD97FC (= R0 - 4)

LR 寄存器指向"portSAVE_context"汇编函数中内联在 RTOS 节拍(RTI Comp0中断) ISR 中的指令、此处为反汇编输出:

229              portSAVE_CONTEXT
         $C:/***** /src/portAsm.asm:225:247$()、osPortPreemptiveTick ():
00000294:  F57FF04F           DSB       有损
00000298:  E92D0001           stmdb     sp!、{r0}
0000029c:  E24DD004                  sub sp、#4
000002a0:  E84D2000           stmda     sp、{sp}^
000002a4:  E8BD0001           LDM       sp!、{r0}
000002a8:  E9204000           stmdb     r0!、{LR}
000002ac:  E1A0E000           mov       LR、r0
000002b0:  E8BD0001           LDM       sp!、{r0}
000002b4:  E94E7FFF           stmdb     LR、{r0、r1、r2、r3、 R4、R5、R6、r7、R8、 R9、R10、r11、R12、sp、 LR}^
000002b8:  E24EE03C           SUB       LR、LR、#0x3c

很明显、问题是访问存储器的禁止地址(0xE8FD97FC)、这可能是因为堆栈损坏、但我无法找到堆栈损坏的时间和位置。

eTPWM ISR 仅更改某些 eTPWM 寄存器和静态全局变量的值、与 RTOS 无关。

是否有关于如何更好地调查此问题的建议? 是否有任何关于错误的想法?

提前感谢您的任何帮助。

电源 我还使用 DMA 和 N2HET 模块的支持为与 SCI 接口的 MODBUS RTU 通信编写了代码。 应用程序使用相同的 RTOS 加 DMA 和 HET 中断。 对于某些消息、MODBUS 通信工作正常、而我遇到了与之前描述的相同的问题(但具有不同的寄存器值)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我进行了更多测试...
    禁用自检。
    Cortex-R4不支持 IRQ 中断的硬件嵌套、因此我尝试将 eTPWM 中断设置为 FIQ、而不是 IRQ。 这样、应用程序似乎可以正常工作、而不会出现任何问题。
    如果 eTPWM 中断类型为 IRQ、为什么它不起作用、但如果类型为 FIQ、它会起作用? 有什么想法吗?

    谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    您的问题将发送给我们的专家!

    此致、
    米罗
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Miro、但我发现了问题的根源。

    在处理 OS 周期计数器递增的 ISR 内、有一个对 SWI 的不必要调用。 调用 SWI 的目的是进入特权模式、但 ISR 已经处于特权模式... 因此、SWI 调用一直保持挂起状态、直到"tick ISR"结束。
    现在、与其他 ISR 之间的交互还不是100%清楚、但其中一个内核寄存器可能已损坏、因此代码的行为几乎不可预测。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我很高兴你已经解决了这个问题。 谢谢更新!

    此致、
    米罗