主题中讨论的其他器件: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 通信工作正常、而我遇到了与之前描述的相同的问题(但具有不同的寄存器值)。