ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
25 ноября
104091
Argon (01.11.2007 20:21, просмотров: 3522)
Писал как-то о баге дебаггера при отладке проекта с 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-битным, не досчитает до переполнения, а затем до нужного периода. Потому и висело. Теперь разбираюсь, почему таймер не сбрасывался последней приведенной инструкцией.