Я новичок в RTOS и в некоторых проблемах понимаю странное поведение. У меня есть микропроцессор STM32, работающий FreeRTOS и прерывание RTC. Прерывание RTC только обновляет изменчивую переменную uint32_t с именем SystemTime.глобальная переменная freertos внутри isr
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
Есть идеи? Спасибо, Mauricio
Код в обоих экземплярах выглядит хорошо для меня из-за быстрого просмотра. Возможно, добавьте еще одну строку отладки, чтобы печатать системное время каждый раз при выполнении задачи. Может быть, проблема кроется в другом месте, и задача блокируется и не работает каждые 100 мс, как вы думаете? –