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

 
 
7 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> stm32 NVIC: сброс маскировки прерываний внутри обработчика
jeka
сообщение Jul 12 2017, 16:58
Сообщение #1


Administrator
***

Группа: Свой
Сообщений: 400
Регистрация: 10-05-04
Пользователь №: 1



Назрела необходимость (уже давно), разрешить прерывания более низкого приоритета в обработчике высокого приоритета. Способ в лоб - подкорректировав стек и сделать фиктивный возврат из прерывания.
С помощью MRS/MSR как я понял этого не сделать - в документации написано что запись в IPSR игнорируется.
Есть ли какое-то более человеческое решение чем через формирование стека возврата и возврат из прерывания?

Собственно, зачем это нужно - в случае аварии вызывается определенный irq. В обработчике нужно сделать некую аварийную последовательность действий, но для этого нужны рабочие обработчики другиз, в т.ч. низкоприоритетных прерываний. Можно конечно приоритеты нужных irq повысить.
Но есть вторая задача - сделать софтовый ресет (разумеется с обнулением стека), в нужную функцию и с разблокированными прерываниями. Например, в bootolader для перепрошивки.
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 12 2017, 17:29
Сообщение #2


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

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



Цитата(jeka @ Jul 12 2017, 19:58) *
Назрела необходимость (уже давно), разрешить прерывания более низкого приоритета в обработчике высокого приоритета.

Это противоречит самому принципу приоритетов прерываний. Странная необходимость ...

Цитата
Способ в лоб - подкорректировав стек и сделать фиктивный возврат из прерывания.
С помощью MRS/MSR как я понял этого не сделать - в документации написано что запись в IPSR игнорируется.

В режиме handler (обработка прерываний) автоматом включается привилегированный режим, т.е. при остром желании можно влезть в любой стек и нагадить там как положено ))
Обычно это используют лишь в портах RTOS.

Цитата
Есть ли какое-то более человеческое решение чем через формирование стека возврата и возврат из прерывания?

Можно форсить более высокоприоритетное прерывание прямо из текущего обработчика.
В зависимости от его приоритета оно будет вызвано сразу или лишь после выхода из текущего обработчика.
Для этой цели хорошо подойдет NMI, у него самый высокий приоритет (после Reset).
Можно даже извратиться - вызывать hardfault, например, обращаясь к несуществующей памяти smile3046.gif

Цитата
Собственно, зачем это нужно - в случае аварии вызывается определенный irq.

А в чем проблема вызывать некую функцию? К чему городить огород с отдельным прерыванием?

Цитата
Например, в bootolader для перепрошивки.

А вот эта задача реализуется уже несколько иначе. Тут неоднократно поднималась эта тема. Пройдитесь поиском ))


зы. Подобную задачу я реализую просто: вызываю в случае аварии System Reset (нужно смотреть на его реализацию в каждом семействе МК).
Однако, не во всех задачах полный сброс допустим.
Аппаратно само устройство делаю так, что в сброшенном состоянии все силовые цепи отключаются, автоматом снимаются все сигналы готовности (если используются внешние силовые модули).
Это реализована подтяжками соотв. портов МК внешними резисторами.
Остальные обработчики типа HardFault у меня тоже в итоге вызывают System Reset (после анализа и фиксации в журнале событий причины сбоя).
Т.е. любое зависание, срабатывание вотчдога и т. д. всегда сбрасывают проц, что автоматом вырубает все силовые цепи.
Это удобно при отладке и прошивке - пока шьется проц, вырубается всякая опасная "сила", скажем силовые ключи привода мощного мотора, гасится мощной источник для "силы".
В таком решении гарантировано, что ничего никуда не поедет и не сожжет никакие "пробки" )))


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
jeka
сообщение Jul 12 2017, 17:55
Сообщение #3


Administrator
***

Группа: Свой
Сообщений: 400
Регистрация: 10-05-04
Пользователь №: 1



Собственно в мягком ресете есть необходимость именно из-за сброса gpio - например, обрывается питание и bluetooth подвисает перед прошивкой. Плюс, все переменные переинициализируются и нельзя точку входа выбрать, неудобно.

То что колхоз это понятно, но без него не вижу простых решений. Хотя не сильный колхоз. Единственное неудобство - повторный вход в оборванные обработчики прерываний, но это не сильно пугает. Сброс состояний - дело несложное.
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 12 2017, 18:02
Сообщение #4


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

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



Цитата(jeka @ Jul 12 2017, 20:55) *
Единственное неудобство - повторный вход в оборванные обработчики прерываний, но это не сильно пугает. Сброс состояний - дело несложное.

Все-таки не пойму, чем не годится обычная функция, которая делает всю эту инициализацию?

Цитата
например, обрывается питание и bluetooth подвисает перед прошивкой
Я бы в таком случае поставил ключ на питание блютуса - какой нить подходящий p-mosfet.
Управление им от соотв. gpio. Так и питание батарейки проще экономить (если девайс батарейный).


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
jeka
сообщение Jul 12 2017, 18:06
Сообщение #5


Administrator
***

Группа: Свой
Сообщений: 400
Регистрация: 10-05-04
Пользователь №: 1



п.с. irq вызывается, поскольку авария может прилететь извне в любой момент и независимо от режима работы нужно немедленно выполнить аварийные процедуры. Проще всего это сделать с чистого листа - заново принудительно с нуля переинициализировать нужную периферию (чтоб наверняка) в нужный режим, отключить все лишнее и сделать несколько действий.
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 12 2017, 18:14
Сообщение #6


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

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



Цитата(jeka @ Jul 12 2017, 21:06) *
п.с. irq вызывается, поскольку авария может прилететь извне в любой момент и независимо от режима работы нужно немедленно выполнить аварийные процедуры. Проще всего это сделать с чистого листа - заново принудительно с нуля переинициализировать нужную периферию (чтоб наверняка) в нужный режим, отключить все лишнее и сделать несколько действий.

Так все-таки, чем не годится вызов некой функции, где все это делается?
Она же вызывается при запуске проца однократно.


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
jeka
сообщение Jul 12 2017, 18:14
Сообщение #7


Administrator
***

Группа: Свой
Сообщений: 400
Регистрация: 10-05-04
Пользователь №: 1



Цитата(Forger @ Jul 12 2017, 21:02) *
Я бы в таком случае поставил ключ на питание блютуса - какой нить подходящий p-mosfet.

как вариант, только с RC цепочкой. Чтоб вырубался, но не сразу. Но честно не думал что проблемы такого характера могут возникнуть, думаю все-таки правильнее программно решить.
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 12 2017, 18:18
Сообщение #8


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

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



Цитата(jeka @ Jul 12 2017, 21:14) *
как вариант, только с RC цепочкой. Чтоб вырубался, но не сразу. Но честно не думал что проблемы такого характера могут возникнуть, думаю все-таки правильнее программно решить.

Правильно - как можно надежнее ))
Блютус тоже может зависнуть программно и перестать отвечать по каналу обмена, тут единственный вариант - передернуть его питание, но только его питание.
В идеале хорошо бы еще мониторить потребляемый ток, чтобы вовремя вырубать мертвые узлы, но такое нужно очень редко ....

В одном моем проекте стояла ESP-ка, которая любила иногда подвисать по usart-у. Зная это, я сразу поставил для нее отдельный стабилизатор 3.3В со входом EN.
Это позволило включать ESP-ку только тогда, когда это было нужно, чисто программно. Зависла - передергиваем питание стабилизаатора и начинаем все по-новой.
Фактически производился сброс только модуля, отвечающего за обмен под wifi, а все остальные модули (программные модули) работали в штатном режиме.


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
jeka
сообщение Jul 12 2017, 18:25
Сообщение #9


Administrator
***

Группа: Свой
Сообщений: 400
Регистрация: 10-05-04
Пользователь №: 1



Цитата(Forger @ Jul 12 2017, 21:14) *
Так все-таки, чем не годится вызов некой функции, где все это делается?
Она же вызывается при запуске проца однократно.

Ей нужно по хорошему передать несколько параметров. Плюс как определить что на ребут для определенной цели ушел? В память записать определенную сигнатуру? Но это то же колхоз.
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 12 2017, 18:32
Сообщение #10


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

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



Цитата(jeka @ Jul 12 2017, 21:25) *
Ей нужно по хорошему передать несколько параметров.
Зачем?
Сделайте разные функции для разных задач. Дайте им соотв. имена.

Цитата
Плюс как определить что на ребут для определенной цели ушел?

Я использую модульную структура проекта, каждый модуль нужно инициализировать индивидуально при старте.
Но ничто не мешает принудительно его переинициализировать (скажем, вызвав соотв. SWI).
Каждый модуль у меня "владеет" своими пинами и своими аппаратными узлами (таймеры, цапы и т.п.).
Никто не обращается к одному и тому же аппаратному узлу из разных модулей. Т. е. у всех аппаратных сущностей есть владелец в единственном числе.
Так я точно могу управлять всей системой. Т. е. на этапе проектировки закладывается строгая и очень жесткая иерархия.
Она неизменна в процессе работы всей железки.
Каждый модуль обязан самостоятельно инициализировать "свое" железо (в т.п. числе и пины!).
Общая пока что только инициализация системного таймера и тактовой частоты, но и она скоро "уйдет" в свой модуль (SystemController).

Цитата
В память записать определенную сигнатуру? Но это то же колхоз.

Я совсем запутался ... Какую еще сигнатуру?
Что же на самом деле вы хотите реализовать?
Распишите конкретный пример, а то, может оказаться, что мы толкуем о разных вещах )))


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
jeka
сообщение Jul 12 2017, 18:34
Сообщение #11


Administrator
***

Группа: Свой
Сообщений: 400
Регистрация: 10-05-04
Пользователь №: 1



Сейчас я в одном из девайсов делаю примерно так. Т.е. делаю софт-ресет из основного цикла (где контроллер irq не замаскирован), а в AHBENR ставлю флаг, который в загрузчике анализируется и после железного ресета гарантированно сброшен.

Код
        RCC->AHBENR=1;// marker for software reset
  
        SysTick->CTRL=0;
        uint32_t* ptr=(uint32_t*)(0x08000000);
        SCB->VTOR=(uint32_t)ptr;
        __set_MSP(*(ptr++));
        __set_BASEPRI(0);
        __set_CONTROL(0);
        NVIC->ICER[0]=0xFFFFFFFF;
        NVIC->ICER[1]=0xFFFFFFFF;
        NVIC->ICER[2]=0xFFFFFFFF;
        NVIC->ICER[3]=0xFFFFFFFF;
        NVIC->ICER[4]=0xFFFFFFFF;
        NVIC->ICER[5]=0xFFFFFFFF;
        NVIC->ICER[6]=0xFFFFFFFF;
        NVIC->ICER[7]=0xFFFFFFFF;
        NVIC->ICPR[0]=0xFFFFFFFF;
        NVIC->ICPR[1]=0xFFFFFFFF;
        NVIC->ICPR[2]=0xFFFFFFFF;
        NVIC->ICPR[3]=0xFFFFFFFF;
        NVIC->ICPR[4]=0xFFFFFFFF;
        NVIC->ICPR[5]=0xFFFFFFFF;
        NVIC->ICPR[6]=0xFFFFFFFF;
        NVIC->ICPR[7]=0xFFFFFFFF;
        void (*start)()=(void(*)())(*ptr);
        start();


Вполне доволен таким софтовым ресетом без сброса железа.
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 12 2017, 18:36
Сообщение #12


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

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



Цитата(jeka @ Jul 12 2017, 21:34) *
Вполне доволен таким софтовым ресетом без сброса железа.

А приведите пример, когда действительно нужен такой "софтовый ресет"?


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
jeka
сообщение Jul 12 2017, 18:45
Сообщение #13


Administrator
***

Группа: Свой
Сообщений: 400
Регистрация: 10-05-04
Пользователь №: 1



Цитата(Forger @ Jul 12 2017, 21:32) *
Я совсем запутался ... Какую еще сигнатуру?
Что же на самом деле вы хотите реализовать?
Распишите конкретный пример, а то, может оказаться, что мы толкуем о разных вещах )))

Мы видимо по разному думаем.

Я про то, как передать загрузчику после железного ресета параметры. Это некий квест и тоже с колхозом.

Работает примерно так: работает девайс в обычном режиме. Приходит кодограмма на перепрошивку, с дополнительными данными. Независимо от режима он должен ребутнуться, продолжить обмен по этому протоколу (без обрыва и без переинициализации протокола обмена) и прошиться. При этом в этой кодограмме содержатся данные, которые надо передать загрузчику.
То есть загрузчик должен получить содержимое кодограммы и все состояния протокола обмена.
После перепрошивки также без переинициализации протокола обмена запустить основную программу.
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 12 2017, 18:56
Сообщение #14


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

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



Цитата(jeka @ Jul 12 2017, 21:45) *
После перепрошивки также без переинициализации протокола обмена запустить основную программу.

Имхо, очень сомнительная и где-то даже опасная необходимость ...
Обычно, всякая смена прошивки софта предполагает сброс всего проца. Мне никогда не попадалось обратное.

Но, может быть, вы имеете ввиду некие настройки конкретного экземпляра девайса?
У меня такие настройки храняться в внешней EEPROM/FRAM или во внутреннем EEPROM (или FLASH, если нету EEPROM).
При перезапуске приложения все настройки загружаются в ОЗУ и оттуда все работает до очередного сброса.
Также предусмотрены настройки по дефолту, позволяет вернуть девайс соотв. командами к заводским настройкам.
За все это отвечает отдельный модуль Settings, он хранит все изменяемые параметры системы, которые могут быть разные для разных девайсов (в т. ч. серийны номер).

Цитата
Мы видимо по разному думаем.
Это вообще-то справедливо для всех, иначе вообще не были бы нужны форумы sm.gif


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
jeka
сообщение Jul 12 2017, 19:17
Сообщение #15


Administrator
***

Группа: Свой
Сообщений: 400
Регистрация: 10-05-04
Пользователь №: 1



Специфика такая. Не хочется протокол обмена обрывать, т.к. это вызывает проблемы на главном устройстве, а их решить сложнее чем протокол поддерживать.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 07:03
Рейтинг@Mail.ru


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