Other Parts Discussed in Thread: HALCOGEN, TMS570LS3137
器件型号: TMS570LS3137
主题中讨论的其他器件: HALCOGEN、
您好:
我使用的是 TMS570LS3137 与 HALCoGen 4.07.01、CCS 12.2 和 TI ARM 编译器 20.2.7.LTS。
该工程在禁用优化的情况下进行编译:
-mv7R4
——code_state=32
-Ooff
-- abi=eabi
应用中使用了两条 UART 接收路径:
1. sciREG:
VIM channel: 74ISR: comp_pod_sci_low_level_interruptReceive interrupt vector: INTVECT1 == 11
2. scilinREG:
VIM channel: 27ISR: comp_maintenance_sci_low_level_interruptReceive interrupt vector: INTVECT1 == 11
两个外设都配置了 UART_INT_LEVEL_1。 在两条中断路径上会观察到相同问题。
我的 UART 接收 ISR 声明如下:
#pragma CODE_STATE(comp_pod_sci_low_level_interrupt, 32) #pragma INTERRUPT(comp_pod_sci_low_level_interrupt, IRQ)
void comp_pod_sci_low_level_interrupt(void) { if (g_s_cp != NULL) { uint32_t vec = g_s_cp->pod_com.instance->INTVECT1;
if (11U == vec) { uint8_t received_data =(uint8_t)(g_s_cp->pod_com.instance->RD & 0x00FFU);
comp_pod_ring_buf_put(g_s_cp, received_data); } } }
被调用函数为:
static result_enum_t comp_pod_ring_buf_put(comp_pod_struct_t *const p_cp, uint8_t data) { if (NULL == p_cp) { return RESULT_ERR_NULL; }
uint16_t next = (p_cp->ring_buf.head + 1U) & POD_RING_BUF_MASK;
if (next != p_cp->ring_buf.tail) { p_cp->ring_buf.buffer[p_cp->ring_buf.head] = data; p_cp->ring_buf.head = next; }
return RESULT_SUCCESS; }
从 ISR 调用 comp_pod_ring_buf_put () 时、板的 ECC/nError LED 变为活动状态。
但是、应用程序会继续正常运行。 它不会保留在 ramErrorReal、flashErrorReal 或其他数据中止循环中。
如果我将相同的振铃缓冲区操作直接复制到 ISR 中、LED 不会变为活动状态:
uint16_t next = (g_s_cp->ring_buf.head + 1U) & POD_RING_BUF_MASK;
if (next != g_s_cp->ring_buf.tail) { g_s_cp->ring_buf.buffer[g_s_cp->ring_buf.head] = received_data;
g_s_cp->ring_buf.head = next; }
在具有等效振铃缓冲功能的另一个 UART 组件中可以观察到相同的行为。
我还将 IRQ 栈从 0x100 字节增加到 0x400 字节、并相应地调整了链接器 RAM 边界。 这没有改变行为、因此简单的 IRQ 栈溢出似乎不是原因。
由于禁用了优化、因此函数不会内联。 调用它会添加一个 BL 指令、从另一个闪存地址执行代码并创建一个额外的函数堆栈帧。 将函数体复制到 ISR 中可以避免这些操作。
什么原因可能导致此问题?
此致、
Hasan