Jump to content

    

FreeRTOS+LPC2378+USB

Вставил в свое ПО на FreeRTOSе файлы из примера VirtualCom(наверное, все знаете его, идет с IAR в комплекте). Отдельно оба ПО работают. Но когда соединил, запустил, то через некоторое время происходит вылет на prefetch_handler. Вот как отследить, откуда и по какой причине происходит этот вылет? может есть какие-то способы, о которых не знаю.. USB работает с приоритетом 1, соот-вно системный тик с приоритетом 0, оба IRQ-прерывания.

 

И еще. Практически все функции USB в этом примере реализованы внутри прерывания, т.е. по сути времени проц много сидит в этом прерывании, что нежелательно. Подскажите, как лучше организовать работу usb в FreeRTOSе. Что можно вынести в задачу, а что обязательно делать в прерывании? Можно ли сделать так: в прерывании обработать только первую транзакцию(запрос), а ответ на него(данные,статус) отсылать в задаче, но тогда ведь в принципе пройдет много времени и произойдет какой-нибудь таймаут у хоста?

 

Share this post


Link to post
Share on other sites
...происходит вылет на prefetch_handler. Вот как отследить, откуда и по какой причине происходит этот вылет? может есть какие-то способы, о которых не знаю..

Не знаете, что при входе в исключение PrefetchAbort в регистре LR (R14_abt) сохраняется адрес команды, вызвавшей исключение + 4 ??? Или Вы каких-то других способов ищете?

Share this post


Link to post
Share on other sites
Не знаете, что при входе в исключение PrefetchAbort в регистре LR (R14_abt) сохраняется адрес команды, вызвавшей исключение + 4 ??? Или Вы каких-то других способов ищете?

Не так давно фриртосом стал пользоваться,тем более до этого обходилось без таких фатальностей,поэтому пока не столкнешься,не узнаешь. Спасибо и за эту простенькую подсказку.

Подсказка не помогла, в R14_abt сохраняется нереальный адрес,н-р, 0x00E424A0.

Edited by M0HAX

Share this post


Link to post
Share on other sites

Дело оказалось не в USB. Закомментил в проге все задачи и все прерывания, оставил только задачу IDLE, прерывание системное и создал прерывание от таймера 1 с частотой 10000Гц и приоритетом 1 (системное прерывание как обычно с приоритетом 0) в качестве теста. В этом прерывании просто делаю инкремент счетчика.

Прога в какой-то момент времени вылетает на prefetch с вообще левым адресом в LR_abrt-регистре.

У кого-нибудь такое было? Не могу выловить, где ломается... Не помню, чтобы в документации к Фриртосу было написано, что нельзя создавать прерывания с частотой выше частоты системного прерывания. Завтра проверю, вылетает ли на prefetch при преключении контекста при вызове прерываний, но дальше хз что делать и где копать....

Share this post


Link to post
Share on other sites

Как раз использую переключатель от Фриртос.

И как раз тот самый пример с USB.

Прерывание от ОС никак не связано с другими прерываниями. И по сему оне друг на друга не влияют.

 

Разве что вы тут намекнули, что у вас контекст переключается при вызове прерываний (множ. число). А вообще-то контекст должен переключаться по таймеру ОС, либо по SWI. А обработчик прерывания - сам по себе.

Другое дело, если у вас обработчик прерывания вызывает какую-нибудь процедуру изнутри себя. Вот тут могут быть проблемы, если обработчик остается в IRQ mode, к примеру.

Share this post


Link to post
Share on other sites

Исправил уже давно, но пишу только сейчас для приведения темы к логическому завершению. Дело оказалось в следующем. Когда включил в ПО процедуры для USB, то, чтоб не мешались мои другие функции, я кое-что закомментарил,а именно - в одной закомментаренной процедуре создавалась очередь, которая потом применялась в vApplicationTickHook, кот. не закомментарил. И вот из-за этого с течением времени во Фриртосе происходили описанные проблемы при переключении контекста задач и вылетало на неиспльз.адреса. Сейчас все ок.

Edited by M0HAX

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this