Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Обработчик FIQ
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
GetSmart
Честно признаюсь, первый раз решил в своей проге использовать FIQ. До этого прекрасно обходился только IRQ и чаще всего многовложенными. Сейчас делаю на проце LPC2131 управление светодиодной панелью с 256 градациями и для крутизны программы решил регенерацию посадить на FIQ. Самое прикольное что после этого появилось - обработчик FIQ работает, а основная прога перестала работать. Если запрещаю FIQи, то основная прога работает, а FIQи разумеется нет. Пока при тестировании отключил все вектора исключений кроме FIQ, то есть при переходе на них проц входит в вечный цикл. Основная прога до ужаса простая - инвертирование светодиода раз в секунду и инвертирование видеобуфера из нескольких LONGов.

Кто может определить мою проблему?
zltigo
Цитата(GetSmart @ Nov 25 2006, 15:51) *
Кто может определить мою проблему?

Проблема ничем не отличается от проблемы несброшенного 'обычного' прерывания - просто при попытке
выйти из обработчика Вас снова в него бросает.
Другие "проблемы" практически не просматриваются.
Персональные FIQ проблемы могут заключаться только в том, что у FIQ персональный стек и соответственно не забудьте указать его месторасположениие и размер.
GetSmart
Нет уж. Прорблема не в этом. Тем более что ничего для FIQ в контроллере прерываний и сбрасывать не надо. А флаги прерываний таймера я сбрасываю так же как и для обычного IRQ. Кроме того, прога не всё время находится в FIQ. Регенерация выглядит идеально. Грубо говоря FIQ синхронизируется по таймеру и вызывается через промежутки 10 mks, 20 mks, 40 mks, ... 1280 mks. Всё остальное время процессор непонятно чем занимается.

Щас выяснил что при обращении к памяти 0x40000000 (там видеобуфер) возникает исключение Data Abort. При записи в эту память - сразу, при чтении - иногда. Это при разрешённых FIQ. При запрещённых - никогда не возникает. Установка команды SUBS PC,R14,#8 по адресу обработчика Data Abort никак не помогает. Стек в моём FIQ вообще не используется.
GetSmart
Прикольно то, что даже залетая в Data Abort и крутясь там вечно регенерация продолжает работать smile.gif

Теперь не знаю что вызывает этот Data Abort и как из него корректно выйти. Кто-нибудь может просветить?

Единственное предположение, что FIQ настолько приоритетный, что любую медленную инструкцию прерывает и откладывает её исполнение после того, как выполнится FIQ. Но что-то сомнения меня терзают. Непонятно даже что делать sad.gif
klop
Цитата(GetSmart @ Nov 25 2006, 18:14) *
Единственное предположение, что FIQ настолько приоритетный, что любую медленную инструкцию прерывает и откладывает её исполнение после того, как выполнится FIQ. Но что-то сомнения меня терзают. Непонятно даже что делать sad.gif

Ни FIQ ни любые другие исключения не могут прервать никакую инструкцию находящуюся в pipeline на стадии исполнения(некие вариации возможны только для BUSY-WAIT циклов с сопроцессором).
zltigo
Цитата(GetSmart @ Nov 25 2006, 16:58) *
Нет уж. Прорблема не в этом. Тем более что ничего для FIQ в контроллере прерываний и сбрасывать не надо.

И для внешних тоже :-)
Цитата
Всё остальное время процессор непонятно чем занимается.

:-)

Цитата
Установка команды SUBS PC,R14,#8 по адресу обработчика Data Abort никак не помогает.

К делу не относится, но если Вы хотели пропустить ошибочную команду, то не минус 8.

Цитата
Стек в моём FIQ вообще не используется.

Пишем на ASM.... Тогда у Вас еcть очень широкое поле для ошибок и предположений, а словесные описания того, что Вы предполагаете делает программа с много большей степенью вероятности не совпадают с реальностью. Похоже пора публиковать исходник.
GetSmart
ОК. Читайте исходник.

Ещё предположение, что Data Abort возникает из-за затирания каких-то регистров основной проги внутри FIQ. Однако, внутри я пользуюсь только регистрами R8..R12 и не сохраняю их в стеке, т.к. они персональные для FIQ.
GetSmart
Блин, даже неловко как-то...
Похоже я сам в основной проге перед циклом затирал регистр R0 при разрешении IRQ. И из-за этого далее возникало Data Abort. Пол дня убил на мой же косяк sad.gif

А ещё я узнал про странное отличие портов 0 и 1. При установке любого бита IODIR.x в 1 на порте 0 у него автоматически устанавливается на выходе 1 (IOPIN.x = 1). А на порте 1 этого не происходит!
zltigo
Цитата(GetSmart @ Nov 25 2006, 18:42) *
А ещё я узнал про странное отличие портов 0 и 1.

Странное? Ничего странного не вижу для "undefined" состояния порта :-) - никто ничего не обещал.
GetSmart
"undefined" после сброса проца? Я-то говорю что даже если установить бит в 0-порте в ноль, а потом дрыгнуть тем же битом в IODIR то на выходе уже будет еденица.
zltigo
Цитата(GetSmart @ Nov 25 2006, 20:41) *
Я-то говорю что даже если установить бит в 0-порте в ноль, а потом дрыгнуть тем же битом в IODIR то на выходе уже будет еденица.

Господь с Вами. Ищите ошибку в программе.
Дабы сподвигнуть Вас на поиск ошибки - сообщу, что именно так я "дрыгаю" довольно во многих случаях для получения "открытого коллектора".
GetSmart
Я тоже это сделал как ОК для управления 5-вольт нагрузкой. Но вопреки моим ожиданиям на пине P0.12 этого у меня не получилось. Другие пины этого порта на моей нынешней схеме я не проверял. А вот на порте 1 (P0.16..P0.31) всё было нормально. Удивился я не меньше Вашего. Да и понял в чём причина не сразу.
GetSmart
Ну надо же какая хитрая ошибка попалась smile.gif
Код
IOPIN0 ^= (1<<14);                    // там светодиод
Выглядит как бы нормально. Но оказывается если в этот момент на порте какой-то из пинов настроен как вход, то эта команда изменит его значение в регистре вывода этого порта. Прям недоработка какая-то. В AVR такого косяка нет.

Ладно. Хватит с меня позориться smile.gif Сегодня не мой день.
brag
Та он такой глючненький, этот LPC2106. Сам долго парился,особенно с SPI
С FIQ вроде все ок,я по FIQ процессы переключал..
Я его гнал до около 90мгц,там тоже ни с сего ни с того глюки полезлимкоторыч при 60 нету.лечилось вставкой типа mov r0,r0 в глючных местахsmile.gif
Andy Mozzhevilov
Цитата(brag @ Dec 3 2006, 00:48) *
Та он такой глючненький, этот LPC2106. Сам долго парился,особенно с SPI
С FIQ вроде все ок,я по FIQ процессы переключал..
Я его гнал до около 90мгц,там тоже ни с сего ни с того глюки полезлимкоторыч при 60 нету.лечилось вставкой типа mov r0,r0 в глючных местахsmile.gif


А кто-то обещал больше 60? Тут , что называется ССЗБ.
brag
ну то понятно,но все же он может пахать на таких частотах..мож глюки из за монтажа,но с такими пустышками пахает же..надо будет погонять его хорошенько
etoja
LPC2106 производят с 2003 года. Какие могут в нем быть глюки?

Мойте руки и читайте документацию.
brag
ну мож нам старые кристалы попадаются.я имел дело только с 1м лпц,так что про все говорить не буду.сужу свой конкретный экземлпярsmile.gif
GetSmart
Всё-таки я не нашёл ещё явных аппаратных глюков у 30-й серии кроме указанных в эррате. А жаловаться что на в 1.5 раза выше предельной частоте ошибки возможно появляются по меньшей мере глупо. Даже если появляются - снижайте частоту и не привлекайте чужое внимание.

А вообще, весь этот топик - это история моих ошибок за один день, в который я очень спешил. Я даже сам их нашёл, только успел поставить себя сдесь в глупое положение.

Резюме: никаких подводных камней в FIQах я не обнаружил. Хорошая вещь эти FIQи. Даже очень хорошая smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.