Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: FreeRTOS+LPC2378+USB
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > FreeRTOS
M0HAX
Вставил в свое ПО на FreeRTOSе файлы из примера VirtualCom(наверное, все знаете его, идет с IAR в комплекте). Отдельно оба ПО работают. Но когда соединил, запустил, то через некоторое время происходит вылет на prefetch_handler. Вот как отследить, откуда и по какой причине происходит этот вылет? может есть какие-то способы, о которых не знаю.. USB работает с приоритетом 1, соот-вно системный тик с приоритетом 0, оба IRQ-прерывания.

И еще. Практически все функции USB в этом примере реализованы внутри прерывания, т.е. по сути времени проц много сидит в этом прерывании, что нежелательно. Подскажите, как лучше организовать работу usb в FreeRTOSе. Что можно вынести в задачу, а что обязательно делать в прерывании? Можно ли сделать так: в прерывании обработать только первую транзакцию(запрос), а ответ на него(данные,статус) отсылать в задаче, но тогда ведь в принципе пройдет много времени и произойдет какой-нибудь таймаут у хоста?
Student Pupkin
Цитата(M0HAX @ Oct 23 2010, 13:31) *
...происходит вылет на prefetch_handler. Вот как отследить, откуда и по какой причине происходит этот вылет? может есть какие-то способы, о которых не знаю..

Не знаете, что при входе в исключение PrefetchAbort в регистре LR (R14_abt) сохраняется адрес команды, вызвавшей исключение + 4 ??? Или Вы каких-то других способов ищете?
M0HAX
Цитата(Student Pupkin @ Oct 23 2010, 17:32) *
Не знаете, что при входе в исключение PrefetchAbort в регистре LR (R14_abt) сохраняется адрес команды, вызвавшей исключение + 4 ??? Или Вы каких-то других способов ищете?

Не так давно фриртосом стал пользоваться,тем более до этого обходилось без таких фатальностей,поэтому пока не столкнешься,не узнаешь. Спасибо и за эту простенькую подсказку.
Подсказка не помогла, в R14_abt сохраняется нереальный адрес,н-р, 0x00E424A0.
M0HAX
Дело оказалось не в USB. Закомментил в проге все задачи и все прерывания, оставил только задачу IDLE, прерывание системное и создал прерывание от таймера 1 с частотой 10000Гц и приоритетом 1 (системное прерывание как обычно с приоритетом 0) в качестве теста. В этом прерывании просто делаю инкремент счетчика.
Прога в какой-то момент времени вылетает на prefetch с вообще левым адресом в LR_abrt-регистре.
У кого-нибудь такое было? Не могу выловить, где ломается... Не помню, чтобы в документации к Фриртосу было написано, что нельзя создавать прерывания с частотой выше частоты системного прерывания. Завтра проверю, вылетает ли на prefetch при преключении контекста при вызове прерываний, но дальше хз что делать и где копать....
DpInRock
Как раз использую переключатель от Фриртос.
И как раз тот самый пример с USB.
Прерывание от ОС никак не связано с другими прерываниями. И по сему оне друг на друга не влияют.

Разве что вы тут намекнули, что у вас контекст переключается при вызове прерываний (множ. число). А вообще-то контекст должен переключаться по таймеру ОС, либо по SWI. А обработчик прерывания - сам по себе.
Другое дело, если у вас обработчик прерывания вызывает какую-нибудь процедуру изнутри себя. Вот тут могут быть проблемы, если обработчик остается в IRQ mode, к примеру.
M0HAX
Исправил уже давно, но пишу только сейчас для приведения темы к логическому завершению. Дело оказалось в следующем. Когда включил в ПО процедуры для USB, то, чтоб не мешались мои другие функции, я кое-что закомментарил,а именно - в одной закомментаренной процедуре создавалась очередь, которая потом применялась в vApplicationTickHook, кот. не закомментарил. И вот из-за этого с течением времени во Фриртосе происходили описанные проблемы при переключении контекста задач и вылетало на неиспльз.адреса. Сейчас все ок.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.