|
|
|
Запуск процесса на одном уровне прерывания, из разных уровней прерываний |
|
|
|
Jun 8 2018, 19:01
|
Местный
Группа: Свой
Сообщений: 232
Регистрация: 13-03-12
Из: Украина
Пользователь №: 70 785
|
Добрый день!
Ув. коллеги, подскажите пожалуста, как вызывая подпрограмму из разных уровней прерываний, обеспечить ее завершение таким образом, чтобы она не была прервана из более высокого приоритета? Речь идет об диспетчере событий (собственная терминология =), который фильтрует события из разных модулей и сохраняет отчет в EEPROM. Разрыв в неподходящий момент непременно приведет к порчи лога, и заметить это будет сложно. Например, чтобы при вызове такая процедура работала на самом высоком уровне. Я полистал документацию по АРМ, но даже не знаю, где копать. Отключать прерывания нахрен до завершения - топорно, но должно работать) По-моему, еще такой функционал реализует RTOS, но опять же я в этом новичок. Какие есть варианты?
Проц STM32F334
--------------------
нет повести печальнее на свете, чем повесть о запавшем ресете
|
|
|
|
|
Jun 9 2018, 22:39
|
Знающий
Группа: Свой
Сообщений: 549
Регистрация: 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, оно может оказаться очень большим.
|
|
|
|
|
Jun 15 2018, 12:34
|
Профессионал
Группа: Свой
Сообщений: 1 215
Регистрация: 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.
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|