ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
29 марта
556060
AlexBi (28.10.2014 13:16, просмотров: 15941)
Столкнулся со странной работой TNKernel в PIC24HJ. ОС скачал с сайта pic24.ru Хотел взять ее как готовую, не углубляясь в ее внутреннюю структуру, но пока не получается. Может кто-нибудь уже сталкивался с таким и знает где я ошибаюсь? Для пробы взял пример, идущий с ОС, немного его перекроил, оставил только 2 задачи, которые должны светодиодами мигать. Вот они: void TN_TASK User_Task3 (void *par) { par=par; for (;;) { tn_sem_acquire(&sem_Led_Exchange, TN_WAIT_INFINITE); SetLedGreenOn(); tn_task_sleep(10); SetLedGreenOff(); tn_sem_signal(&sem_Led_Exchange); } } Вторая такая же. Настройка таймера, портов, все как обычно. Обработка системного тика: tn_sys_interrupt(_T1Interrupt) { _T1IF=0; tn_tick_int_processing(); } Программирую, запускаю, получаю по 12мс на 1 и 0. Хотя ожидалось 10мс. Немного модифицирую обработку системного тика: tn_sys_interrupt(_T1Interrupt) { _T1IF=0; tn_tick_int_processing(); __builtin_nop(); } Программирую, запускаю, получаю ожидаемые 10мс. Дальше модифицирую: void foo() { unsigned i; SetLedRedOn(); for(i=0; i<200; ++i) { __builtin_nop(); } SetLedRedOff(); } tn_sys_interrupt(_T1Interrupt) { _T1IF=0; foo(); tn_tick_int_processing(); __builtin_nop(); } Получаю по 24мс на 1 и 0. Вижу, что системные тики идут ровно, через 1мс. Почему могут быть такие странности? Оптимизация компилятору поставлена максимальная, сама ОС скомпилирована отдельно, линкуется как библиотека, так же как в родном примере.