器件型号: LP-MSPM0G3519
您好:
一般项目信息:
- 中断会触发每个 100µs 来执行紧急代码、并检查任务是否挂起
- 在进入 WFI () 之前在主循环内处理挂起的任务
在我们的一个项目中、我们需要测量 CPU 负载、并认为我们可以使用计时器来实现此目的。
每次进入任何中断时、计时器都会启动 (DL_TIMER_startCounter ())、并且仅在 MCU 进入 WFI () 时才停止、因此计时器会在中断期间以及挂起的任务期间计数。
每执行第 10 次 100µs 中断、就会读取计时器计数器值、并且计时器会复位、因此我们会在最后 1ms 内使用 CPU。
在第一次触发时、我们使用正常计时器 (TIMG 或 TIMA) 实现了这一点、但我们观察到 DL_TIMER_startCounter () 似乎将计时器计数器寄存器复位为“0“。 这是有意为之、因为在查看 driverlib 时并不明显? 即使将 CVAE-Reg 设置为“无更改“也没有帮助。 这在图 1 中可见。
图 2 还显示了一种奇怪的行为。 由于某种原因、Buffer_Before_stop 和 Buffer_after_stop 在样本 210 处丢失“同步“、这毫无意义、因为两个缓冲区都被写入同一索引、唯一的区别是在写入之前写入一个缓冲区、而一个缓冲区在停止计时器之后。
也许有人可以帮助解决这个问题。
下面是一个简化的示例、我们在其中观察到了错误行为。
#include "ti_msp_dl_config.h"
bool exe_task = false;
uint32_t buffer[256u] = {0u};
uint8_t i = 0u;
uint32_t buffer_before_start[256u] = {0u};
uint32_t buffer_after_start[256u] = {0u};
uint8_t i_start = 0u;
uint32_t buffer_before_stop[256u] = {0u};
uint32_t buffer_after_stop[256u] = {0u};
uint8_t i_stop = 0u;
/* Interrupt triggered by timer every 100µs */
void TIMER_SWTICK_INST_IRQHandler( void ) {
static uint8_t cnt = 0u;
buffer_before_start [i_start] = DL_Timer_getTimerCount(TIMER_CPU_LOAD_INST);
DL_Timer_startCounter(TIMER_CPU_LOAD_INST);
buffer_after_start [i_start] = DL_Timer_getTimerCount(TIMER_CPU_LOAD_INST);
i_start++;
DL_GPIO_setPins(DEBUG_PORT,DEBUG_PIN_0_PIN);
if(0u == cnt) {
exe_task = true;
buffer [i] = DL_Timer_getTimerCount(TIMER_CPU_LOAD_INST);
i++;
cnt = 10u;
}
cnt--;
DL_Common_delayCycles(320u); // Do some work
}
int main(void)
{
SYSCFG_DL_init();
/* start base timer */
DL_Timer_startCounter( TIMER_SWTICK_INST );
DL_Timer_setCounterValueAfterEnable( TIMER_CPU_LOAD_INST, DL_TIMER_COUNT_AFTER_EN_NO_CHANGE );
/* enable interrupts */
NVIC_EnableIRQ( TIMER_SWTICK_INST_INT_IRQN );
while (1) {
if (true == exe_task ) {
/* Do normal priority processing here */
}
buffer_before_stop [i_stop] = DL_Timer_getTimerCount(TIMER_CPU_LOAD_INST);
DL_Timer_stopCounter(TIMER_CPU_LOAD_INST);
buffer_after_stop [i_stop] = DL_Timer_getTimerCount(TIMER_CPU_LOAD_INST);
i_stop++;
DL_GPIO_clearPins(DEBUG_PORT,DEBUG_PIN_0_PIN);
__WFI();
}
}

图 1.

图 2.
提前感谢!
此致