|
|
  |
FreeRTOS+LPC2378+USB, траблы с USB |
|
|
|
Oct 23 2010, 09:31
|
Участник

Группа: Участник
Сообщений: 33
Регистрация: 22-09-08
Пользователь №: 40 378

|
Вставил в свое ПО на FreeRTOSе файлы из примера VirtualCom(наверное, все знаете его, идет с IAR в комплекте). Отдельно оба ПО работают. Но когда соединил, запустил, то через некоторое время происходит вылет на prefetch_handler. Вот как отследить, откуда и по какой причине происходит этот вылет? может есть какие-то способы, о которых не знаю.. USB работает с приоритетом 1, соот-вно системный тик с приоритетом 0, оба IRQ-прерывания.
И еще. Практически все функции USB в этом примере реализованы внутри прерывания, т.е. по сути времени проц много сидит в этом прерывании, что нежелательно. Подскажите, как лучше организовать работу usb в FreeRTOSе. Что можно вынести в задачу, а что обязательно делать в прерывании? Можно ли сделать так: в прерывании обработать только первую транзакцию(запрос), а ответ на него(данные,статус) отсылать в задаче, но тогда ведь в принципе пройдет много времени и произойдет какой-нибудь таймаут у хоста?
|
|
|
|
|
Oct 23 2010, 13:32
|
Местный
  
Группа: Участник
Сообщений: 328
Регистрация: 23-05-08
Пользователь №: 37 760

|
Цитата(M0HAX @ Oct 23 2010, 13:31)  ...происходит вылет на prefetch_handler. Вот как отследить, откуда и по какой причине происходит этот вылет? может есть какие-то способы, о которых не знаю.. Не знаете, что при входе в исключение PrefetchAbort в регистре LR (R14_abt) сохраняется адрес команды, вызвавшей исключение + 4 ??? Или Вы каких-то других способов ищете?
|
|
|
|
|
Oct 25 2010, 05:12
|
Участник

Группа: Участник
Сообщений: 33
Регистрация: 22-09-08
Пользователь №: 40 378

|
Цитата(Student Pupkin @ Oct 23 2010, 17:32)  Не знаете, что при входе в исключение PrefetchAbort в регистре LR (R14_abt) сохраняется адрес команды, вызвавшей исключение + 4 ??? Или Вы каких-то других способов ищете? Не так давно фриртосом стал пользоваться,тем более до этого обходилось без таких фатальностей,поэтому пока не столкнешься,не узнаешь. Спасибо и за эту простенькую подсказку. Подсказка не помогла, в R14_abt сохраняется нереальный адрес,н-р, 0x00E424A0.
Сообщение отредактировал M0HAX - Oct 25 2010, 07:27
|
|
|
|
|
Oct 27 2010, 14:42
|
Участник

Группа: Участник
Сообщений: 33
Регистрация: 22-09-08
Пользователь №: 40 378

|
Дело оказалось не в USB. Закомментил в проге все задачи и все прерывания, оставил только задачу IDLE, прерывание системное и создал прерывание от таймера 1 с частотой 10000Гц и приоритетом 1 (системное прерывание как обычно с приоритетом 0) в качестве теста. В этом прерывании просто делаю инкремент счетчика. Прога в какой-то момент времени вылетает на prefetch с вообще левым адресом в LR_abrt-регистре. У кого-нибудь такое было? Не могу выловить, где ломается... Не помню, чтобы в документации к Фриртосу было написано, что нельзя создавать прерывания с частотой выше частоты системного прерывания. Завтра проверю, вылетает ли на prefetch при преключении контекста при вызове прерываний, но дальше хз что делать и где копать....
|
|
|
|
|
Nov 20 2010, 06:37
|
Участник

Группа: Участник
Сообщений: 33
Регистрация: 22-09-08
Пользователь №: 40 378

|
Исправил уже давно, но пишу только сейчас для приведения темы к логическому завершению. Дело оказалось в следующем. Когда включил в ПО процедуры для USB, то, чтоб не мешались мои другие функции, я кое-что закомментарил,а именно - в одной закомментаренной процедуре создавалась очередь, которая потом применялась в vApplicationTickHook, кот. не закомментарил. И вот из-за этого с течением времени во Фриртосе происходили описанные проблемы при переключении контекста задач и вылетало на неиспльз.адреса. Сейчас все ок.
Сообщение отредактировал M0HAX - Nov 20 2010, 06:38
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|