2017-01-25 8 views
2

Я новичок в 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

+0

Код в обоих экземплярах выглядит хорошо для меня из-за быстрого просмотра. Возможно, добавьте еще одну строку отладки, чтобы печатать системное время каждый раз при выполнении задачи. Может быть, проблема кроется в другом месте, и задача блокируется и не работает каждые 100 мс, как вы думаете? –

ответ

0

Попытайтесь дать задачу, которая печатает SystemTime более высокий приоритет, чем ваша другая задача. Случай #if 0, я думаю, является правильной реализацией, потому что в другом случае SystemTime может быть изменен между проверкой и сохранением.

0

Вместо этого использовать vTaskDelayUntil. Это будет учитывать время, потраченное на отправку по UART. SystemTime - это критический раздел с этим.

0
if (ost != SystemTime) { 
    xprintf("<%d>\n", SystemTime); 
    ost = SystemTime; 

Здесь. Пока вы печатаете SystemTimeValue, происходит прерывание, и ваше значение увеличивается. После этого вы приравниваете переменную ost к изменен переменная SystemTime. Вот почему следующий раунд отсутствует, а код не печатает новое значение времени.

Я думаю