gpt4 book ai didi

scheduled-tasks - isr 中的 freertos 全局变量

转载 作者:行者123 更新时间:2023-12-04 17:54:07 27 4
gpt4 key购买 nike

我是 RTOS 的新手,在理解一个奇怪的行为时遇到了一些麻烦:

我有一个运行 FreeRTOS 的 STM32 微 Controller 和一个正在运行的 RTC 中断。RTC 中断仅更新名为 SystemTimevolatile uint32_t 变量:

void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc) {
UNUSED(hrtc);
SystemTime++;
}

此外,我还有另一个任务每 100 毫秒运行一次。如果 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

有什么想法吗?

最佳答案

使用vTaskDelayUntil反而。这将考虑通过 UART 发送所浪费的时间。 SystemTime 是一个关键部分。

关于scheduled-tasks - isr 中的 freertos 全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41858849/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com