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

 
 
 
Reply to this topicStart new topic
> Запуск процесса на одном уровне прерывания, из разных уровней прерываний
Hexel
сообщение Jun 8 2018, 19:01
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 229
Регистрация: 13-03-12
Из: Украина
Пользователь №: 70 785



Добрый день!

Ув. коллеги, подскажите пожалуста, как вызывая подпрограмму из разных уровней прерываний, обеспечить ее завершение таким образом, чтобы она не была прервана из более высокого приоритета? Речь идет об диспетчере событий (собственная терминология =), который фильтрует события из разных модулей и сохраняет отчет в EEPROM. Разрыв в неподходящий момент непременно приведет к порчи лога, и заметить это будет сложно.
Например, чтобы при вызове такая процедура работала на самом высоком уровне. Я полистал документацию по АРМ, но даже не знаю, где копать. Отключать прерывания нахрен до завершения - топорно, но должно работать) По-моему, еще такой функционал реализует RTOS, но опять же я в этом новичок. Какие есть варианты?

Проц STM32F334


--------------------
нет повести печальнее на свете, чем повесть о запавшем ресете
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 8 2018, 19:09
Сообщение #2


Гуру
******

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



Цитата(Hexel @ Jun 8 2018, 22:01) *
Какие есть варианты?

Записать сообщение (которое нужно сохранить в EEPROM) в некую структуру в памяти и вызвать процесс записи в EEPROM, который выгребет сообщение из этой структуры и запишет куда надо. Процесс записи - это или задача ОС или ISR - без разницы.
Go to the top of the page
 
+Quote Post
Hexel
сообщение Jun 8 2018, 19:59
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 229
Регистрация: 13-03-12
Из: Украина
Пользователь №: 70 785



Вот как раз что меня беспокоит: в процессе формирования сообщения может сработать прерывание. можно в первых строках процедуры запомнить текущий индекс StackTop и сразу его инкрементировать. тогда в локальном контексте разрыв уже не повлияет на работу, т. к. место в логе уже будет зарезервировано, а всю необходимую информацию для сообщения передать аргументами, ее на самом деле не так много. Весь лог будет держаться в оперативе, а сохранение в EEP может происходить не прямо сразу.
А через ISR - это как? кажется, я все-таки плохо представляю механизм прерываний.


--------------------
нет повести печальнее на свете, чем повесть о запавшем ресете
Go to the top of the page
 
+Quote Post
adnega
сообщение Jun 9 2018, 06:03
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 608
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Hexel @ Jun 8 2018, 22:59) *
А через ISR - это как? кажется, я все-таки плохо представляю механизм прерываний.

Через прерывание может получится асинхронно, т.е. флажок взвели, а перед обработчиком может выполниться еще несколько инструкций.
Можно через SVCall, тогда все будет синхронно.

Про SVC подробно написано в "Joseph Yiu. The Definitive Guide to ARM Cortex-M3 and Cortex-M4 Processors" раздел "10.3 SVC exception".
Go to the top of the page
 
+Quote Post
Serge V Iz
сообщение Jun 9 2018, 06:32
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 68
Регистрация: 3-05-18
Пользователь №: 103 639



Если эта вызываемая подпрограмма вообще никем не может быть прервана до окончания своей работы, на систему в целом это произведет ровно то же самое впечатление, что и просто запрет прерываний на время ее работы. ) С той разницей, что "топорный" запрет прерываний не требует сбросов конвейера, переключений контекста и прочих всяких времязатратных вещей )

Go to the top of the page
 
+Quote Post
adnega
сообщение Jun 9 2018, 06:49
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 608
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Serge V Iz @ Jun 9 2018, 09:32) *
С той разницей, что "топорный" запрет прерываний не требует сбросов конвейера, переключений контекста и прочих всяких времязатратных вещей )

Работа с EEPROM довольно затратная по времени операция. Лишать систему прерываний на это время довольно опасно.
Я бы через SVC сделал доступ к очереди (быстрая часть), а в mainloop сделал бы вычитывание из очереди и запись в EEPROM.
Go to the top of the page
 
+Quote Post
Serge V Iz
сообщение Jun 9 2018, 08:03
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 68
Регистрация: 3-05-18
Пользователь №: 103 639



Ну, я тоже надеюсь, что под атомарной операцией понимается только упихивпние очередной непременно целостной пачки данных в какой-то буфер в ОЗУ. )
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 9 2018, 11:02
Сообщение #8


Гуру
******

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



Цитата(adnega @ Jun 9 2018, 09:49) *
Я бы через SVC сделал доступ к очереди (быстрая часть), а в mainloop сделал бы вычитывание из очереди и запись в EEPROM.

А SVC то тут зачем? wacko.gif
Если нужно чтобы сообщения, кидаемые разными отправителями (ISR разных приоритетов), не терялись и писались все, делаем очередь с атомарной записью. Ну или несколько очередей (на выбор). Пишем сообщение туда. Потом возбуждаем (программно) какое-нить прерывание (записью в соответствующий регистр NVIC), в ISR которого считываем сообщения из этой очереди (очередей) и пишем их куда надо. Считываем и пишем пока очереди не опустошатся. Опустошились - выходим из ISR.
Вместо ISR в данном алгоритме можно использовать задачу ОС с каким-нить объектом синхронизации ОС (мэйлбокс, семафор, etc.).
Go to the top of the page
 
+Quote Post
adnega
сообщение Jun 9 2018, 11:49
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 608
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(jcxz @ Jun 9 2018, 14:02) *
А SVC то тут зачем?

Для простоты реализации атомарности.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 9 2018, 12:48
Сообщение #10


Гуру
******

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



чем оно проще запрета прерываний?
Go to the top of the page
 
+Quote Post
adnega
сообщение Jun 9 2018, 15:07
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 608
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(jcxz @ Jun 9 2018, 15:48) *
чем оно проще запрета прерываний?

Тем, что в системе могут оставаться высокоприоритетные прерывания.
Разумеется в них доступа к этой очереди быть не должно.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 9 2018, 15:10
Сообщение #12


Гуру
******

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



Цитата(adnega @ Jun 9 2018, 18:07) *
Тем, что в системе могут оставаться высокоприоритетные прерывания.

У SVC вроде как наивысший приоритет. Выше чем у любого асинхронного прерывания. Разве что исключая NMI наверное. Так на NMI запрет прерываний и не влияет.
Да, и если уж так страшен запрет прерываний, то очереди можно и вообще без запрета прерываний организовать.
Go to the top of the page
 
+Quote Post
Hexel
сообщение Jun 9 2018, 16:17
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 229
Регистрация: 13-03-12
Из: Украина
Пользователь №: 70 785



Должен признать, что SVC - не совсем то, что я бы применил для данной задачи. Получается слишком сложно, но это именно то, что я хотел прояснить. Итого процедура логирования выходит строк на 10, так что запрет прерываний мне кажется, оптимальное решение. Ну и выгрузка в EEP конечно будет происходить где-то ближе к мейну, или низкоприоритетному таймеру.
Спасибо за советы! Ну и книжка многое прояснила


--------------------
нет повести печальнее на свете, чем повесть о запавшем ресете
Go to the top of the page
 
+Quote Post
SII
сообщение Jun 9 2018, 22:39
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 544
Регистрация: 13-07-10
Из: Солнечногорск-7
Пользователь №: 58 414



Цитата(jcxz @ Jun 9 2018, 18:10) *
У SVC вроде как наивысший приоритет. Выше чем у любого асинхронного прерывания. Разве что исключая NMI наверное.

Приоритет SVC, как и почти все остальные, настраивается. Но, если его приоритет не самый высокий (HardFault и NMI выше, но при нормальной работе они, как правило, не возникают, и, скорей всего, их можно не учитывать), на входе в обработчик регистры могут быть изменены: если одновременно с выполнением команды SVC появилось более приоритетное прерывание, вход будет выполнен в обработчик последнего, и именно в этот момент регистры будут сохранены в стеке. При возврате из высокоприоритетного обработчика произойдёт переход в ожидающий обработчик более низкого приоритета -- в SVC, при этом регистры из стека не восстанавливаются и повторно не сохраняются, а соответственно, имеют те значения, что в них находились на момент завершения обработчика высокоприоритетного прерывания.


Цитата(Hexel @ Jun 9 2018, 19:17) *
Итого процедура логирования выходит строк на 10, так что запрет прерываний мне кажется, оптимальное решение. Ну и выгрузка в EEP конечно будет происходить где-то ближе к мейну, или низкоприоритетному таймеру.


Дело не в числе строк, а во времени их выполнения: если там ожидание завершения записи в EEPROM, оно может оказаться очень большим.
Go to the top of the page
 
+Quote Post
Forger
сообщение Jun 15 2018, 12:34
Сообщение #15


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

Группа: Свой
Сообщений: 1 005
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(Hexel @ Jun 8 2018, 22:01) *
Отключать прерывания нахрен до завершения - топорно, но должно работать)

В STM запись в EEPROM и так приостанавливает работу выполнение кода на аппаратном уровне. Так что критические секции будут бесполезны.
Цитата
When the code is executing from the Flash program memory, the instruction must be read
from it, this is not possible during a write operation on any memory block of the same bank.
In such case the program execution stalls during the EEPROM data write.
Stalling happens at the Busmatrix interconnection and blocks the data recipient until the
data is available.
The stall does not disrupt the sequence of operation. What happens is that the CPU core
keeps waiting for the instruction fetch. Also, the stall only affects the CPU core. Processes
independent from the core, such as DMA or peripherals may continue to work as long as
they avoid accessing the NVM bank.


Подробности как решить вашу задачу см. тут: AN4808.


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 25th June 2018 - 05:49
Рейтинг@Mail.ru


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