|
Запрещение и разрешение прерываний |
|
|
|
Jan 25 2016, 02:55
|
Профессионал
    
Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439

|
Я сгенерировал кубом код для STM32F429 и добавляю в него необходимые мне функции. Обнаружил, что вопреки ожиданиям не запрещались прерывания когда следовало их запретить. На 100 процентов не уверен, что это так, но другого обюяснения поведения найти не могу. Вот так определены функции управления запрещением прерывания. Код /** \brief Enable IRQ Interrupts
This function enables IRQ interrupts by clearing the I-bit in the CPSR. Can only be executed in Privileged modes. */ __attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_irq(void) { __ASM volatile ("cpsie i" : : : "memory"); }
/** \brief Disable IRQ Interrupts
This function disables IRQ interrupts by setting the I-bit in the CPSR. Can only be executed in Privileged modes. */ __attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_irq(void) { __ASM volatile ("cpsid i" : : : "memory"); } В дисассемблерном коде я не вижу ничего похожего на них. Или я чего-то не разглядел? Посмотрите пожалуйста свежим взглядом.
|
|
|
|
|
 |
Ответов
|
Jan 27 2016, 14:11
|
Знающий
   
Группа: Свой
Сообщений: 888
Регистрация: 25-09-08
Из: Питер
Пользователь №: 40 458

|
Мы говорим о разных вещах. Попробую более узко сформулировать задачу.
Есть функция с критической секцией (запрет и разрешение прерываний), которая может вызываться как с разрешенными, так и с запрещенными прерываниями. Естественно, она должна восстановить исходное значение разрешения прерываний.
Но функция работает в кривой среде, в которой возможно возникновение другого прерывания, которое вполне может изменить разрешение прерываний. Т.е., если прерывания разрешены, то, после возврата они могут оказаться запрещенными. Вот такой бред.
Отсюда и возникает та проблема, о которой я говорю.
Посмотрел SVC (SWI). На его основе вполне можно сделать корректную функции запрета и разрешения прерываний с восстановлением исходного состояния разрешения прерываний. SVC имеет более высокий приоритет чем пользовательские прерывания, поэтому все должно быть корректно.
|
|
|
|
|
Jan 27 2016, 22:52
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(rudy_b @ Jan 27 2016, 18:11)  Но функция работает в кривой среде, в которой возможно возникновение другого прерывания, которое вполне может изменить разрешение прерываний. Т.е., если прерывания разрешены, то, после возврата они могут оказаться запрещенными. Вот такой бред.
Отсюда и возникает та проблема, о которой я говорю. Это кривой код обработчика прерываний, или код, оттуда вызывающийся. Который должен быть исправлен ТАМ ЖЕ. А не в другом месте программы. Или хитрая (но ничего не гарантирующая) задумка воздействия на обработку прерываний всей системы. От самого простого предположения: остановить приём всех прерываний до того, как тред не разрешит их снова. Общие критические секции (вставки) в этом случае не должны меняться.
Сообщение отредактировал GetSmart - Jan 28 2016, 00:11
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
Сообщений в этой теме
Tarbal Запрещение и разрешение прерываний Jan 25 2016, 02:55 SII Похоже, в дизассемблере команды разрешения-запреще... Jan 25 2016, 04:41 johnshadow Регулярно наблюдаю такие приколы у кокосовского де... Jan 25 2016, 07:32 Tarbal Спасибо за ответы.
Картинку я залил воспользовав... Jan 25 2016, 11:47 Сергей Борщ Отожмите иконку "Show Source" на рамке о... Jan 25 2016, 12:19 rudy_b Кстати, еще вопрос по той же теме. Нужна функция з... Jan 25 2016, 15:25 Tarbal Цитата(rudy_b @ Jan 25 2016, 19:25) Кстат... Jan 25 2016, 19:01 GetSmart Цитата(rudy_b @ Jan 25 2016, 19:25) Пробл... Jan 26 2016, 00:24  rudy_b Цитата(GetSmart @ Jan 26 2016, 03:24) Как... Jan 26 2016, 03:42   GetSmart Цитата(rudy_b @ Jan 26 2016, 07:42) В дан... Jan 26 2016, 06:37 smalcom Цитата__disable_irq()
оно? Jan 25 2016, 18:04 rudy_b Цитата(smalcom @ Jan 25 2016, 21:04) __di... Jan 25 2016, 21:22  Сергей Борщ Цитата(rudy_b @ Jan 25 2016, 23:22) Честн... Jan 25 2016, 23:11   Tarbal Цитата(Сергей Борщ @ Jan 26 2016, 02:11) ... Jan 27 2016, 14:20    Сергей Борщ Цитата(Tarbal @ Jan 27 2016, 16:20) Разре... Jan 27 2016, 22:08     Tarbal Цитата(Сергей Борщ @ Jan 28 2016, 01:08) ... Jan 28 2016, 12:15      Сергей Борщ Цитата(Tarbal @ Jan 28 2016, 14:15) Но по... Jan 28 2016, 12:43  Непомнящий Евгений Цитата(rudy_b @ Jan 26 2016, 00:22) Нет, ... Jan 26 2016, 05:37   rudy_b Цитата(Непомнящий Евгений @ Jan 26 2016, 08... Jan 26 2016, 13:28    Непомнящий Евгений Цитата(rudy_b @ Jan 26 2016, 16:28) Это у... Jan 26 2016, 13:32     rudy_b Цитата(Непомнящий Евгений @ Jan 26 2016, 16... Jan 26 2016, 20:00      Непомнящий Евгений Цитата(rudy_b @ Jan 26 2016, 23:00) Зато ... Jan 27 2016, 05:02       GetSmart Цитата(Непомнящий Евгений @ Jan 27 2016, 09... Jan 27 2016, 08:50        Сергей Борщ Цитата(GetSmart @ Jan 27 2016, 10:50) то ... Jan 27 2016, 10:07         GetSmart Цитата(Сергей Борщ @ Jan 27 2016, 14:07) ... Jan 27 2016, 13:00    GetSmart Цитата(rudy_b @ Jan 26 2016, 17:28) Кодpr... Jan 26 2016, 21:02 AVI-crak Цитата(Tarbal @ Jan 25 2016, 09:55) Я сге... Jan 27 2016, 18:59 rudy_b Все совершенно справедливо. Но переписывать стек н... Jan 28 2016, 04:00 GetSmart Цитата(rudy_b @ Jan 28 2016, 08:00) Да и ... Jan 28 2016, 04:51 GetSmart У NXP ARM7 была такая особенность ARM spurious IRQ... Jan 29 2016, 02:01
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|