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

 
 
> 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
 
Start new topic
Ответов
Golikov A.
сообщение Apr 27 2015, 07:18
Сообщение #2


Гуру
******

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



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

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

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

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


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

Группа: Участник
Сообщений: 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
mantech
сообщение Apr 27 2015, 12:02
Сообщение #4


Гуру
******

Группа: Участник
Сообщений: 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
VadimNic_nt
сообщение Apr 27 2015, 17:00
Сообщение #5


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

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



Цитата(mantech @ Apr 27 2015, 16:02) *
Т.е. во флеш пишите из прерывания?? Знаете, сколь по длительности запись идет?? А прерывать запись флеши далеко не в каждом контроллере разрешается.


Странно, почти везде требуется время...


Нет, FLASH пишется уже не из прерывания, во время записи прерывания запрещены все. Вот такие контроллеры ADI делает, ждать выхода PLL на режим не нужно. biggrin.gif

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

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


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


АЦП должно регистрировать сигнал который вызвал срабатывание компаратора и прерывание FIQ. Фронт сигнала достаточно крутой, поэтому задержки начала регистрации сигнала приведут к потере информации о форме сигнала. При возникновении FIQ в регистре PLL аппаратно сбрасываются биты, задающие коэффициент умножения, так что при в входе в функцию-обработчик FIQ контроллер работает уже на максимальной частоте (впрочем эту возможность можно отключить в файле конфигурации МК), источник тактирования не меняется - всегда работает от собственного RC генератора 32768 Гц. PLL у МК ADUC какая-то хитрая - необходимости ждать выхода PLL на режим не нужно (в документации про это нет информации, да и соответствующих бит в регистрах тоже нет). Запись во FLASH осуществляется после окончания регистрации, при этом используется собственная FLASH память МК. Стирание FLASH заранее - при подготовке прибора к работе. Прибор очень миниатюрный - диаметр 11 мм, высота порядка 15 мм :-), поэтому схемотехнической мысли растекаться особенно некуда :-)?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 28 2015, 04:51
Сообщение #6


Гуру
******

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



Цитата(VadimNic_nt @ Apr 27 2015, 23:00) *
АЦП должно регистрировать сигнал который вызвал срабатывание компаратора и прерывание FIQ. Фронт сигнала достаточно крутой, поэтому задержки начала регистрации сигнала приведут к потере информации о форме сигнала. При возникновении FIQ в регистре PLL аппаратно сбрасываются биты, задающие коэффициент умножения, так что при в входе в функцию-обработчик FIQ контроллер работает уже на максимальной частоте (впрочем эту возможность можно отключить в файле конфигурации МК), источник тактирования не меняется - всегда работает от собственного RC генератора 32768 Гц. PLL у МК ADUC какая-то хитрая - необходимости ждать выхода PLL на режим не нужно (в документации про это нет информации, да и соответствующих бит в регистрах тоже нет). Запись во FLASH осуществляется после окончания регистрации, при этом используется собственная FLASH память МК. Стирание FLASH заранее - при подготовке прибора к работе.

Как уже сказал ув. Golikov A., в прерываниях FIQ и монитора питания не нужно делать никакой работы - просто поставить флажки (т.е. - активизировать фоновую задачу).
А в фоновой задаче выполнять все чтения АЦП/сохранения во флешь. Всё равно если у вас уже идёт запись во флешь, то пока она не закончится, данные монитора питания Вы не запишете.
В фоновой задаче, после обнаружения флажка, можно программно переключить делитель PLL на макс. частоту.

А вообще - по-моему раз у Вас должна захватываться какая-то осциллограмма с АЦП по сигналу аварии, то мне кажется начинать её сохранять после события уже поздно.
Наверняка нужна какая-то предыстория. Поэтому думаю - АЦП должно всегда работать, писать поток данных в кольцевой буфер, а по сигналу аварии защёлкнуть позицию буфера
(за N отсчётов до события), после защёлкивания захватить ещё сколько-то данных и записать их во флешь.
В нашем устройстве тоже как раз должен делаться подобный захват осциллограммы по одному из сигналов события. С предысторией. И кольцевой буфер у нас к тому-же в энергонезависимой памяти.

Цитата(VadimNic_nt @ Apr 27 2015, 23:00) *
Прибор очень миниатюрный - диаметр 11 мм, высота порядка 15 мм :-), поэтому схемотехнической мысли растекаться особенно некуда :-)?

Это Вы про мой совет использовать FRAM?
Так я вообще-то имел в виду, что у TI есть серия MSP430FRxxx - там вместо флешь в качестве энергонезависимой памяти используется FRAM. Так что никаких доп. элементов паять не нужно.
И код и данные (журнал событий), если их не много, можно хранить в ней. И корпус очень миниатюрный. wink.gif
И алгоритм получается очень простой: пишете поток данных с АЦП непрерывно в кольцевой буфер во FRAM (буфер размером N+M, где N - размер предыстории события, M-размер послеистории события).
После возникновения события, в ISR выставляете флаг==M, в фоновой задаче видите если флаг установлен - декрементируете его с каждым записанным в кольцо сэмплом, после обнуления счётчика останавливаете запись. Если нужна возможность регистрации неск. событий - после защёлкивания текущего буфера и исчерпания M, не останавливаете поток записи в кольцо, а просто - переключаетесь на второй кольцевой буфер, третий и т.п.
И при наличии FRAM никаких проблем с занятостью её текущей записью при возникновении аварии монитора питания нет - можете хоть сразу в ISR и записать что надо во FRAM.

Да и тактирование в MSP430 очень удобно сделано:
Запускаете АЦП с тактированием от какого-то низкочастотного источника, с записью потока через DMA. Усыпляете CPU. Высокочастотный RC тактировавший ядро отключается, потребление падает до неск. мкА.
При возникновении прерывания события или монитора питания, ядро пробуждается, его ВЧ RC-генератор (DCO) быстро запускается и во время выполнения ISR работает на высокой частоте.
При выходе из ISR буквально одной командой можно выставить состояние завершения ISR: вернётся он в сон или продолжит выполнение уже фоновой задачи на полной частоте.
Т.е. - CPU будет почти всё время спать изредка просыпаясь при завершении очередного блока DMA, для его перепрограммирования и для обслуживания событий компаратора и монитора питания.
Go to the top of the page
 
+Quote Post
VadimNic_nt
сообщение Apr 28 2015, 08:48
Сообщение #7


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

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



Цитата(jcxz @ Apr 28 2015, 07:51) *
Как уже сказал ув. Golikov A., в прерываниях FIQ и монитора питания не нужно делать никакой работы - просто поставить флажки (т.е. - активизировать фоновую задачу).
А в фоновой задаче выполнять все чтения АЦП/сохранения во флешь. Всё равно если у вас уже идёт запись во флешь, то пока она не закончится, данные монитора питания Вы не запишете.
В фоновой задаче, после обнаружения флажка, можно программно переключить делитель PLL на макс. частоту.

А вообще - по-моему раз у Вас должна захватываться какая-то осциллограмма с АЦП по сигналу аварии, то мне кажется начинать её сохранять после события уже поздно.
Наверняка нужна какая-то предыстория. Поэтому думаю - АЦП должно всегда работать, писать поток данных в кольцевой буфер, а по сигналу аварии защёлкнуть позицию буфера
(за N отсчётов до события), после защёлкивания захватить ещё сколько-то данных и записать их во флешь.
В нашем устройстве тоже как раз должен делаться подобный захват осциллограммы по одному из сигналов события. С предысторией. И кольцевой буфер у нас к тому-же в энергонезависимой памяти.


Это Вы про мой совет использовать FRAM?
Так я вообще-то имел в виду, что у TI есть серия MSP430FRxxx - там вместо флешь в качестве энергонезависимой памяти используется FRAM. Так что никаких доп. элементов паять не нужно.
И код и данные (журнал событий), если их не много, можно хранить в ней. И корпус очень миниатюрный. wink.gif
И алгоритм получается очень простой: пишете поток данных с АЦП непрерывно в кольцевой буфер во FRAM (буфер размером N+M, где N - размер предыстории события, M-размер послеистории события).
После возникновения события, в ISR выставляете флаг==M, в фоновой задаче видите если флаг установлен - декрементируете его с каждым записанным в кольцо сэмплом, после обнуления счётчика останавливаете запись. Если нужна возможность регистрации неск. событий - после защёлкивания текущего буфера и исчерпания M, не останавливаете поток записи в кольцо, а просто - переключаетесь на второй кольцевой буфер, третий и т.п.
И при наличии FRAM никаких проблем с занятостью её текущей записью при возникновении аварии монитора питания нет - можете хоть сразу в ISR и записать что надо во FRAM.

Да и тактирование в MSP430 очень удобно сделано:
Запускаете АЦП с тактированием от какого-то низкочастотного источника, с записью потока через DMA. Усыпляете CPU. Высокочастотный RC тактировавший ядро отключается, потребление падает до неск. мкА.
При возникновении прерывания события или монитора питания, ядро пробуждается, его ВЧ RC-генератор (DCO) быстро запускается и во время выполнения ISR работает на высокой частоте.
При выходе из ISR буквально одной командой можно выставить состояние завершения ISR: вернётся он в сон или продолжит выполнение уже фоновой задачи на полной частоте.
Т.е. - CPU будет почти всё время спать изредка просыпаясь при завершении очередного блока DMA, для его перепрограммирования и для обслуживания событий компаратора и монитора питания.

У рассматриваемого ADUC7021 есть одно хорошее качество - корпус QFN40 размером 6х6 мм. Есть новые контроллеры на Cortex-M0+ c еще меньшим корпусом QFN32 и всеми наворотами включая DMA. Но руководство возлюбило ADUCи, поэтому приходится крутиться на этой МК.


Цитата(Golikov A. @ Apr 28 2015, 08:07) *
Что-то мне говорит что ADuC - это фигня со встроенной АЦП... да еще какой-то хитро много канальной или многодиапазонной. Это же для всяких мультитесторов спец проц да?

и jcxz прав, как он предлагает, еще лучше. АЦП просто долбит по кругу и сохраняет в кольцевой буфер, а по событию оно просто до сохраняет хвост данных и пихает это дело во флэш. В такой организации у вас от прерывания события надо просто поставить флажки и все. Частота АЦП связана с основной частотой проца? Можно ее всегда запустить на максимуме?

Если бы в ADUC было DMA, так бы и сделал. Но там его нет и с АЦП приходится работать программно, а чтобы успевать обрабатывать поступающие данные и кольцевой буфер нужна частота ЦПУ порядка 10 МГц. Поэтому пишу кривую без предыстории, вернее с предысторией но с очень низкой частотой дискретизации на минимальной тактовой частоте ЦПУ.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- VadimNic_nt   ADuC702x и обработчик прерывания FIQ   Apr 26 2015, 10:07
- - mantech   Цитата(VadimNic_nt @ Apr 26 2015, 13:07) ...   Apr 26 2015, 10:49
|- - VadimNic_nt   Цитата(mantech @ Apr 26 2015, 13:49) А чт...   Apr 27 2015, 07:05
|- - jcxz   Цитата(VadimNic_nt @ Apr 27 2015, 13:05) ...   Apr 27 2015, 09:14
|- - mantech   Цитата(Golikov A. @ Apr 27 2015, 10:18) О...   Apr 27 2015, 08:34
|- - jcxz   Цитата(VadimNic_nt @ Apr 27 2015, 15:36) ...   Apr 27 2015, 10:31
||- - VadimNic_nt   Цитата(jcxz @ Apr 27 2015, 14:31) Зачем в...   Apr 27 2015, 10:37
||- - jcxz   Цитата(VadimNic_nt @ Apr 27 2015, 16:37) ...   Apr 27 2015, 14:14
||- - mantech   Цитата(jcxz @ Apr 27 2015, 17:14) Заменит...   Apr 28 2015, 06:45
||- - jcxz   Цитата(mantech @ Apr 28 2015, 12:45) Дак ...   Apr 28 2015, 07:05
|- - jcxz   Цитата(VadimNic_nt @ Apr 28 2015, 14:48) ...   Apr 29 2015, 03:59
- - Golikov A.   мне помниться что для FIQ был свой флаг, нет? То е...   Apr 27 2015, 08:46
- - Golikov A.   А если в фик поставить флаг новые данные, а данные...   Apr 27 2015, 11:27
|- - VadimNic_nt   Цитата(Golikov A. @ Apr 27 2015, 15:27) А...   Apr 27 2015, 11:51
- - Golikov A.   Там может быть стоит переход с PLL клока на внутре...   Apr 27 2015, 13:50
- - Golikov A.   ну так кто вам мешает руками этот делитель перебро...   Apr 27 2015, 18:00
- - Golikov A.   Что-то мне говорит что ADuC - это фигня со встроен...   Apr 28 2015, 05:07
- - Golikov A.   ну учитывая габариты не думаю что там много место ...   Apr 28 2015, 07:53
|- - mantech   Цитата(Golikov A. @ Apr 28 2015, 10:53) F...   Apr 28 2015, 09:41
|- - VadimNic_nt   Цитата(mantech @ Apr 28 2015, 13:41) Я та...   Apr 28 2015, 10:05
- - Golikov A.   ЦитатаЯ так понимаю, что эта FRAM - разновидность ...   Apr 28 2015, 10:57
|- - mantech   Цитата(Golikov A. @ Apr 28 2015, 13:57) д...   Apr 28 2015, 16:36
- - Golikov A.   FM23MLD16 (8 Мбит) 10^14 циклов перезаписи, малюсе...   Apr 28 2015, 17:15
- - Golikov A.   ЦитатаА "чем больше тем лучше" - это рад...   Apr 29 2015, 06:02
|- - jcxz   Цитата(Golikov A. @ Apr 29 2015, 12:02) к...   Apr 29 2015, 07:40
- - Golikov A.   Да верно, это я чего-то напутал. MSP430F149 прост...   Apr 29 2015, 16:37


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

 


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


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