|
Запрещение и разрешение прерываний |
|
|
|
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 25 2016, 21:22
|
Знающий
   
Группа: Свой
Сообщений: 888
Регистрация: 25-09-08
Из: Питер
Пользователь №: 40 458

|
Цитата(smalcom @ Jan 25 2016, 21:04)  __disable_irq() оно? Нет, не оно. Эта функция сначала считывает CPSR в регистр, меняет биты в регистре, потом заносит регистр в CPSR. Если в это время произойдет прерываие и CPSR будет изменен - будет плохо. Нужно, чтобы одна ассемблерная команда одновременно и записала CPSR в стек и установила в нем запрет прерывания. И обратная операция - восстановиление CPSR из стека без всяких промежуточных операций в регистрах. Иными словами нужна атомарная операция сохранения старого CPSR в стек с одновременной записью указанного бита в CPSR. Ну и обратная операция - восстановление CPSR из стека. Честно сказать, совершенно не понимаю, как всякие функции HAL работают без этого - они обязательно должны глючить. Там все время пользуют общее разрешение и запрет прерываний. Если при этом нет возможности честно (атомарно, чтобы никто не мог перебить) сохранить исходное состояние бита разрешения прерываний, то это полный песец. Цитата(Tarbal @ Jan 25 2016, 22:01)  Именно так я и делаю, но это не снимает проблемы прерывания между считыванием CPSR и запретом прерываний. Для кортекса определены странные макро типа CFI_ARM_BLOCK_start и CFI_ARM_BLOCK_end, но что это и как этим пользоваться не нашел.
|
|
|
|
|
Jan 27 2016, 14:20
|
Профессионал
    
Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439

|
Цитата(Сергей Борщ @ Jan 26 2016, 02:11)  Может потому, что они не пытаются разрешать/запрещать прерывания из обработчиков этих самых прерываний? Интересно, зачем такое может понадобиться? Разрешать прерывания изнури обработчика плохая идея. Цитата(rudy_b @ Jan 26 2016, 00:22)  Нет, не оно. Эта функция сначала считывает CPSR в регистр, меняет биты в регистре, потом заносит регистр в CPSR. Если в это время произойдет прерываие и CPSR будет изменен - будет плохо. Почему будет плохо? Ну сходит в прерывание между командами и вернется в том же виде (того кто напишет прерывание, что изменяет CPSR надо канделябром по фаберже), а затем запретит прерывание и продолжит работу.
|
|
|
|
Сообщений в этой теме
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     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 rudy_b Мы говорим о разных вещах. Попробую более узко сфо... Jan 27 2016, 14:11 GetSmart Цитата(rudy_b @ Jan 27 2016, 18:11) Но фу... Jan 27 2016, 22:52 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
|
|
|