我是RTOS的新手并且在理解一个奇怪的行为时遇到了一些麻烦。 我有一台运行FreeRTOS的STM32 micro和一个RTC中断也在运行。 RTC中断只更新名为SystemTime的易失性uint32_t变量。
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc) {
UNUSED(hrtc);
SystemTime++;
}
我有一个每100mS运行一次的任务。它只是打印SystemTime值,如果它已经改变。
static void ToggleLEDThread(void const *argument) {
(void) argument;
static uint32_t ost;
uint32_t tst;
for (;;) {
#if 0
tst = SystemTime;
if (ost != tst) {
xprintf("<%d>\n", tst);
ost = tst;
}
#else
if (ost != SystemTime) {
xprintf("<%d>\n", SystemTime);
ost = SystemTime;
}
#endif
vTaskDelay(100);
}
}
如果#if 1(使用临时变量),它按预期工作,但是当#if 0,代码运行正常一段时间后,它会停止打印,并在几秒钟后再次开始打印。
还有另一项任务是每秒打印一些其他值。
工作时的输出:
V:1139 O:1091
<35>
V:1139 O:1123
<36>
V:1140 O:1154
<37>
V:1140 O:1186
<38>
V:1139 O:1218
<39>
V:1139 O:1249
<40>
V:1139 O:1281
<41>
V:1139 O:1313
<42>
V:1139 O:1344
<43>
V:1139 O:1376
<44>
V:1139 O:1408
<45>
V:1139 O:1439
<46>
V:1140 O:1471
<47>
V:1139 O:1503
<48>
V:1139 O:1535
<49>
V:1139 O:1566
<50>
V:1140 O:1598
<51>
V:1139 O:1630
<52>
V:1139 O:1661
问题发生时的输出:
V:1139 O:1091
<35>
V:1139 O:1123
<36>
V:1140 O:1154
<37>
V:1140 O:1186
<38>
V:1139 O:1218
<39>
V:1139 O:1249
<40>
V:1139 O:1281
<41>
V:1139 O:1313
<42>
V:1139 O:1344
V:1139 O:1376
V:1139 O:1408
V:1139 O:1439
V:1140 O:1471
V:1139 O:1503
V:1139 O:1535
V:1139 O:1566
<50>
V:1140 O:1598
<51>
V:1139 O:1630
<52>
V:1139 O:1661
有什么想法吗? 谢谢,毛里西奥
答案 0 :(得分:0)
尝试给出比其他任务打印SystemTime更高优先级的任务。我认为#if 0的情况是正确的实现,因为在另一种情况下,可以在检查和存储之间修改SystemTime。
答案 1 :(得分:0)
请改用vTaskDelayUntil。这将考虑通过UART发送浪费的时间。 SystemTime是一个重要的部门护理。
答案 2 :(得分:0)
if (ost != SystemTime) {
xprintf("<%d>\n", SystemTime);
ost = SystemTime;
下面。在打印SystemTimeValue时,会发生中断并且您的值会增加。之后,将变量 ost 等同于已修改的变量SystemTime。这就是为什么缺少下一轮并且代码没有打印新的时间值的原因。
我想