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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> ADuC702x и обработчик прерывания FIQ
VadimNic_nt
сообщение Apr 26 2015, 10:07
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 80
Регистрация: 25-10-09
Из: Екатеринбург
Пользователь №: 53 194



Здравствуйте форумчане!

Посоветуйте способ выхода из прерывания FIQ в микроконтроллере ADuC702x (ядро ARM7TDMI) на адрес нужной функции.
Из прерывания FIQ вызывать эту функцию не хочу, так как она по времени выполнения занимает порядка 30 мс, к тому же в процессе ее выполнения
может произойти прерывание от монитора напряжения питания в случае возникновения которого необходимо корректное остановка работы микроконтроллера.
Если у кого-то есть такой опыт, прошу поделиться примером кода. Использую в проекте Keil.
Go to the top of the page
 
+Quote Post
mantech
сообщение Apr 26 2015, 10:49
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(VadimNic_nt @ Apr 26 2015, 13:07) *
Посоветуйте способ выхода из прерывания FIQ в микроконтроллере


А что, разрешение прерывания в обработчике и мутекс для запрета повтороного входа в ту же функцию не помогает?
Go to the top of the page
 
+Quote Post
VadimNic_nt
сообщение Apr 27 2015, 07:05
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 80
Регистрация: 25-10-09
Из: Екатеринбург
Пользователь №: 53 194



Цитата(mantech @ Apr 26 2015, 13:49) *
А что, разрешение прерывания в обработчике и мутекс для запрета повтороного входа в ту же функцию не помогает?

Я так понимаю, что в случае вызова нужной мне функции из FIQ, работа контроллера прерываний будет восстановлена только после выхода из FIQ.
Мне необходимо максимальная реакция микроконтроллера на прерывание, поэтому установка флага в прерывании с последующей его проверкой в основном цикле программы не устраивает. Хотелось бы завершить прерывание переходом не в точку, предшествующую его возникновению, а на адрес нужной мне функции. Когда-то давно еще на архитектуре 8051 это было возможно путем манипуляции со стеком при помощи ассемблерных инструкций. Я думаю, что и на архитектуре ARM7TDMI это возможно....
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 27 2015, 07:18
Сообщение #4


Гуру
******

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



А как вы вернетесь то в точку где было прерывание, если вы из него улетите в вашу функцию...
вам предется в функцию передавать точку возврата, делать там непонятный переход... а если опять будет прерывание?

Когда вы попадает в FIQ прерывание, у вас снимается флажок реакции на прерывания, по выходу из FIQ он ставиться снова. Никто вам не мешает, при переходе в вашу функцию из FIQ опять поставить этот флажок.

тогда если ваша функция отработает до конца, вы выйдите из FIQ в точку остановки программы.
А если же у вас пока вы будите в функции возникнет прерывание, вы политите отработаете его и вернетесь в свою функцию, а когда ее закончите выйдите из FIQ в точку остановки программы.

Одна сложность вам надо сделать так чтобы повторно вы опять в FIQ не полетели, за этим просто надо следить.
Go to the top of the page
 
+Quote Post
mantech
сообщение Apr 27 2015, 08:34
Сообщение #5


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(Golikov A. @ Apr 27 2015, 10:18) *
Одна сложность вам надо сделать так чтобы повторно вы опять в FIQ не полетели, за этим просто надо следить.


Вот для этого и нужен мутекс, чтоб вновь не попасть в функцию, из которой еще не вышли в предидущий раз.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 27 2015, 08:46
Сообщение #6


Гуру
******

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



мне помниться что для FIQ был свой флаг, нет? То есть можно просто обычные прерывания разрешить, а FIQ не разрешать. или он все равно забьет обычные и пока он стоит, обычные не вызовутся?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 27 2015, 09:14
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(VadimNic_nt @ Apr 27 2015, 13:05) *
Мне необходимо максимальная реакция микроконтроллера на прерывание, поэтому установка флага в прерывании с последующей его проверкой в основном цикле программы не устраивает. Хотелось бы завершить прерывание переходом не в точку, предшествующую его возникновению, а на адрес нужной мне функции. Когда-то давно еще на архитектуре 8051 это было возможно путем манипуляции со стеком при помощи ассемблерных инструкций. Я думаю, что и на архитектуре ARM7TDMI это возможно....

Берёте любую RTOS. Например: uCOS. ЗавОдите высокоприоритетную задачу, которая ждёт события на каком-то мэйлбоксе.
В ISR посылаете сообщение в этот мэйлбокс. Задача просыпается, делает работу и опять уходит на ожидание мэйлбокса. Всё.
Стандартный подход построения задач-обработчиков событий.

Цитата(Golikov A. @ Apr 27 2015, 14:46) *
мне помниться что для FIQ был свой флаг, нет? То есть можно просто обычные прерывания разрешить, а FIQ не разрешать. или он все равно забьет обычные и пока он стоит, обычные не вызовутся?

В ARM7 всего два внешних прерывания: FIQ и IRQ. У каждого свой флаг и свой бит разрешения.
При срабатывании одного из них, процессор переключается в соотв. контекст (FIQ или IRQ) со своим стеком. При входе в FIQ, насколько помню, автоматом запрещается IRQ.
Как правило - прерывание от любой периферии можно направить на любой из входов: FIQ или IRQ. Так что - прерывание любой периферии может быть как FIQ так и IRQ (по крайней мере в LPC23xx).
Go to the top of the page
 
+Quote Post
VadimNic_nt
сообщение Apr 27 2015, 09:36
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 80
Регистрация: 25-10-09
Из: Екатеринбург
Пользователь №: 53 194



Цитата(Golikov A. @ Apr 27 2015, 11:18) *
А как вы вернетесь то в точку где было прерывание, если вы из него улетите в вашу функцию...
вам предется в функцию передавать точку возврата, делать там непонятный переход... а если опять будет прерывание?

Когда вы попадает в FIQ прерывание, у вас снимается флажок реакции на прерывания, по выходу из FIQ он ставиться снова. Никто вам не мешает, при переходе в вашу функцию из FIQ опять поставить этот флажок.

тогда если ваша функция отработает до конца, вы выйдите из FIQ в точку остановки программы.
А если же у вас пока вы будите в функции возникнет прерывание, вы политите отработаете его и вернетесь в свою функцию, а когда ее закончите выйдите из FIQ в точку остановки программы.

Одна сложность вам надо сделать так чтобы повторно вы опять в FIQ не полетели, за этим просто надо следить.

У меня алгоритм работы устройства довольно простой - после возникновения прерывания FIQ максимально быстро перейти к функции регистрации данных с АЦП (записать данные в массив), затем записанный массив данных перезаписать в FLASH память и выключить прибор. Но в процессе регистрации возможна ситуации срабатывания монитора напряжения питания (из-за разряда батареи). В этом случае мне необходимо остановить процесс регистрации и завершит программу с установленным флагом в FLASH 'сбой напряжения питания'. В данный момент функцию регистрации я вызываю из FIQ, поэтому если происходит сбой по напряжению питания я теряю зарегистрированные данные и флаг с информацией о сбое напряжения питания тоже не устанавливается.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 27 2015, 10:31
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(VadimNic_nt @ Apr 27 2015, 15:36) *
В данный момент функцию регистрации я вызываю из FIQ, поэтому если происходит сбой по напряжению питания я теряю зарегистрированные данные и флаг с информацией о сбое напряжения питания тоже не устанавливается.

Зачем всё на FIQ повесили??? Прикладные ISR - расположите на IRQ, а монитор питания - на FIQ. Тогда он прервёт любой обработчик IRQ.
Go to the top of the page
 
+Quote Post
VadimNic_nt
сообщение Apr 27 2015, 10:37
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 80
Регистрация: 25-10-09
Из: Екатеринбург
Пользователь №: 53 194



Цитата(jcxz @ Apr 27 2015, 14:31) *
Зачем всё на FIQ повесили??? Прикладные ISR - расположите на IRQ, а монитор питания - на FIQ. Тогда он прервёт любой обработчик IRQ.

Выбрал FIQ потому, что фоновая задача выполняется на низкой тактовой частоте ядра, а FIQ в ADUC702x обеспечивает аппаратное переключение на максимальную частоту тактирования ядра при возникновении прерывания FIQ. У прерывания IRQ такой возможности нет, а значит реакция на прерывание гораздо медленнее происходит.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 27 2015, 11:27
Сообщение #11


Гуру
******

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



А если в фик поставить флаг новые данные, а данные пихнуть в буффер, а всю обработку дальше в основном цикле? Или опять беда с малой тактовой вне?. Кстати переход с частоты на частоту разьве не требует ожидания плл?
Go to the top of the page
 
+Quote Post
VadimNic_nt
сообщение Apr 27 2015, 11:51
Сообщение #12


Частый гость
**

Группа: Участник
Сообщений: 80
Регистрация: 25-10-09
Из: Екатеринбург
Пользователь №: 53 194



Цитата(Golikov A. @ Apr 27 2015, 15:27) *
А если в фик поставить флаг новые данные, а данные пихнуть в буффер, а всю обработку дальше в основном цикле? Или опять беда с малой тактовой вне?. Кстати переход с частоты на частоту разьве не требует ожидания плл?

Нужные биты в PLL устанавливаются аппаратно, после выхода из FIQ устанавливаются в исходное состояние. Ждать выхода PLL на режим не нужно. Может стоит попробовать ваше предложение на практике. Спасибо.
Go to the top of the page
 
+Quote Post
mantech
сообщение Apr 27 2015, 12:02
Сообщение #13


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(VadimNic_nt @ Apr 27 2015, 12:36) *
У меня алгоритм работы устройства довольно простой - после возникновения прерывания FIQ максимально быстро перейти к функции регистрации данных с АЦП (записать данные в массив), затем записанный массив данных перезаписать в FLASH память


Т.е. во флеш пишите из прерывания?? Знаете, сколь по длительности запись идет?? А прерывать запись флеши далеко не в каждом контроллере разрешается.

Цитата(VadimNic_nt @ Apr 27 2015, 14:51) *
Ждать выхода PLL на режим не нужно.

Странно, почти везде требуется время...
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 27 2015, 13:50
Сообщение #14


Гуру
******

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



Там может быть стоит переход с PLL клока на внутренний и обратно, оба из которых стабильно работают все время, то есть PLL настроился и держит его. Но вроде переход то же какое-то время занимает.

Запись во внутреннюю флэш это вещь такая... но с другой стороны для нее все равно надо прерывания запрещать в 90% так что можно и из прерывания это делатьsm.gif они будут автоматом запрещены... без запрета проц вроде не просто флэш запорит, а вообще повиснуть может, нет?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 27 2015, 14:14
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(VadimNic_nt @ Apr 27 2015, 16:37) *
Выбрал FIQ потому, что фоновая задача выполняется на низкой тактовой частоте ядра, а FIQ в ADUC702x обеспечивает аппаратное переключение на максимальную частоту тактирования ядра при возникновении прерывания FIQ. У прерывания IRQ такой возможности нет, а значит реакция на прерывание гораздо медленнее происходит.

Что мешает в обработчике IRQ сделать то же самое программно?
И что именно там делается с частотой аппаратно?: включается и разгоняется PLL или меняется источник тактирования (PLL/внутренний RC) или просто меняется делитель тактовой перед CPU?
Если первое - то время стабилизации PLL довольно велико и много больше времени входа в любой ISR.
Если второе или третье - то программно переключить источник (при условии, что он уже работает и готов) или изменить делитель тактовой CPU дело одной-двух записей в регистры на входе в обработчик IRQ.
Если Вы не вынесете монитор питания в FIQ, а прочие прерывания - в IRQ, а всё повесите на FIQ, то новый FIQ монитора у Вас не вызовется никак до окончания обработки текущего ISR
(у Вас наверное и другие ISR в системе есть?). Ну если только не предпринять каких-то хитрых манипуляций с режимами работы CPU.

Да и вообще - говорить о скорости реакции на прерывание, учитывая какую Вам работу на сделать по его обслуживанию (работа с ADC, запись флешь) смешно.
Она будет несравнима мала по сравнению со временем доступа к флешь.
Флешь у Вас кстати какая? SPI или ...?
А учитываете, что если сработал монитор, а у вас уже идёт, не дай бог, операция стирания, сколько придётся ждать?
Может всё-таки Вам лучше для записи событий монитора поставить батарейное ОЗУ или FRAM?

Цитата(Golikov A. @ Apr 27 2015, 19:50) *
Запись во внутреннюю флэш это вещь такая... но с другой стороны для нее все равно надо прерывания запрещать в 90% так что можно и из прерывания это делатьsm.gif они будут автоматом запрещены... без запрета проц вроде не просто флэш запорит, а вообще повиснуть может, нет?

Заменить на MSP430 из серии с FRAM-памятью wink.gif
Там что запись в ОЗУ, что во FRAM - никакой разницы. Не хватает ОЗУ - отрезал от памяти программ скока надо wink.gif
Go to the top of the page
 
+Quote Post

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

 


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


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