Argon (01.11.2007 20:21, просмотров: 3518)
Писал как-то о баге дебаггера при отладке проекта с scmRTOS для ARM7 (см. ссылку). Изредка получалось так, что ОС "висела" при старте проги. Но чаще все же работала. Похоже, найдена проблема. http://caxapa.ru/98022.html
В примерах, идущих вместе с scmRTOS, реализована инициализация системного таймера (внутри __low_level_init() ):
<c>
***************************************************************************
// RTOS system timer
PCONP = 0x00;
PCONP |= BIT1;
T0IR = (unsigned)-1; // clear int requests
T0TCR = (1<<0); // CE = 1, enable timer
T0PR = 0;
T0MR0 = PCLK_Freq / RTOS_TICK_RATE; // int at TICK_RATE
T0MCR = (1<<1) | (1<<0); // MR0INT = 1, MR0RES = 1
</c>
Все это и перекочевало в проект.
В те злополучные моменты, когда ОС висела, обнаружилось, что начальное значение счетчика таймера было выше, чем T0MR0, то бишь, чем заданный период. Таким образом прерывание по таймеру не генерировалось пока он, будучи 32-битным, не досчитает до переполнения, а затем до нужного периода. Потому и висело.
Теперь разбираюсь, почему таймер не сбрасывался последней приведенной инструкцией.