реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Обработчик FIQ, Подводные камни
GetSmart
сообщение Nov 25 2006, 16:51
Сообщение #1


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Честно признаюсь, первый раз решил в своей проге использовать FIQ. До этого прекрасно обходился только IRQ и чаще всего многовложенными. Сейчас делаю на проце LPC2131 управление светодиодной панелью с 256 градациями и для крутизны программы решил регенерацию посадить на FIQ. Самое прикольное что после этого появилось - обработчик FIQ работает, а основная прога перестала работать. Если запрещаю FIQи, то основная прога работает, а FIQи разумеется нет. Пока при тестировании отключил все вектора исключений кроме FIQ, то есть при переходе на них проц входит в вечный цикл. Основная прога до ужаса простая - инвертирование светодиода раз в секунду и инвертирование видеобуфера из нескольких LONGов.

Кто может определить мою проблему?


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 25 2006, 17:43
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



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

Проблема ничем не отличается от проблемы несброшенного 'обычного' прерывания - просто при попытке
выйти из обработчика Вас снова в него бросает.
Другие "проблемы" практически не просматриваются.
Персональные FIQ проблемы могут заключаться только в том, что у FIQ персональный стек и соответственно не забудьте указать его месторасположениие и размер.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 25 2006, 17:58
Сообщение #3


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



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

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


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 25 2006, 18:14
Сообщение #4


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Прикольно то, что даже залетая в Data Abort и крутясь там вечно регенерация продолжает работать smile.gif

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

Единственное предположение, что FIQ настолько приоритетный, что любую медленную инструкцию прерывает и откладывает её исполнение после того, как выполнится FIQ. Но что-то сомнения меня терзают. Непонятно даже что делать sad.gif


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
klop
сообщение Nov 25 2006, 18:27
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 433
Регистрация: 28-02-06
Пользователь №: 14 788



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

Ни FIQ ни любые другие исключения не могут прервать никакую инструкцию находящуюся в pipeline на стадии исполнения(некие вариации возможны только для BUSY-WAIT циклов с сопроцессором).
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 25 2006, 19:09
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



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

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

:-)

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

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

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

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 25 2006, 19:23
Сообщение #7


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



ОК. Читайте исходник.

Ещё предположение, что Data Abort возникает из-за затирания каких-то регистров основной проги внутри FIQ. Однако, внутри я пользуюсь только регистрами R8..R12 и не сохраняю их в стеке, т.к. они персональные для FIQ.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 25 2006, 19:42
Сообщение #8


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Блин, даже неловко как-то...
Похоже я сам в основной проге перед циклом затирал регистр R0 при разрешении IRQ. И из-за этого далее возникало Data Abort. Пол дня убил на мой же косяк sad.gif

А ещё я узнал про странное отличие портов 0 и 1. При установке любого бита IODIR.x в 1 на порте 0 у него автоматически устанавливается на выходе 1 (IOPIN.x = 1). А на порте 1 этого не происходит!


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 25 2006, 20:23
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(GetSmart @ Nov 25 2006, 18:42) *
А ещё я узнал про странное отличие портов 0 и 1.

Странное? Ничего странного не вижу для "undefined" состояния порта :-) - никто ничего не обещал.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 25 2006, 21:41
Сообщение #10


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



"undefined" после сброса проца? Я-то говорю что даже если установить бит в 0-порте в ноль, а потом дрыгнуть тем же битом в IODIR то на выходе уже будет еденица.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 25 2006, 21:51
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



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

Господь с Вами. Ищите ошибку в программе.
Дабы сподвигнуть Вас на поиск ошибки - сообщу, что именно так я "дрыгаю" довольно во многих случаях для получения "открытого коллектора".


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 25 2006, 23:22
Сообщение #12


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Я тоже это сделал как ОК для управления 5-вольт нагрузкой. Но вопреки моим ожиданиям на пине P0.12 этого у меня не получилось. Другие пины этого порта на моей нынешней схеме я не проверял. А вот на порте 1 (P0.16..P0.31) всё было нормально. Удивился я не меньше Вашего. Да и понял в чём причина не сразу.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 25 2006, 23:41
Сообщение #13


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Ну надо же какая хитрая ошибка попалась smile.gif
Код
IOPIN0 ^= (1<<14);                    // там светодиод
Выглядит как бы нормально. Но оказывается если в этот момент на порте какой-то из пинов настроен как вход, то эта команда изменит его значение в регистре вывода этого порта. Прям недоработка какая-то. В AVR такого косяка нет.

Ладно. Хватит с меня позориться smile.gif Сегодня не мой день.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
brag
сообщение Dec 2 2006, 22:48
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046



Та он такой глючненький, этот LPC2106. Сам долго парился,особенно с SPI
С FIQ вроде все ок,я по FIQ процессы переключал..
Я его гнал до около 90мгц,там тоже ни с сего ни с того глюки полезлимкоторыч при 60 нету.лечилось вставкой типа mov r0,r0 в глючных местахsmile.gif
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Dec 4 2006, 07:51
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



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


А кто-то обещал больше 60? Тут , что называется ССЗБ.


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 14:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.0151 секунд с 7
ELECTRONIX ©2004-2016