ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
4 июля
1528126
POV (Вчера, 22:47, просмотров: 976)
Поясните где дырка в коде, почему компилятор так себя ведёт (Keil 6)... 
static timer_task_t* get_tmr(uint8_t num)
{
    for (uint8_t i = 0; i < sizeof(tasks)/sizeof(tasks[0]); i++)
    {
        if (!tasks[i].timer)
            return NULL;
        if (tasks[i].num == num)
            return &tasks[i];
    }

    return NULL;
}

void TMR2_GLOBAL_IRQHandler(void)
{
    timer_task_t *t = get_tmr(2);
    if (!t)
    {



В обработчике не происходит изменения t. Какой мусор был до вызова, такой и остался. Хотя пошагово в функции get_tmr всё пучком.

Далее t конечно же используется. Применение volatile нахрен нигде не нужно, но пробовал - не помогает.


А вот так работает.

static timer_task_t *t;
t = get_tmr(2);
if (!t)
{


Оптимизации нет. Предупреждений компилятора нет.