|
|
  |
Флаги прерывания. |
|
|
|
Mar 4 2015, 08:56
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Сейчас делаю так. Есть несколько переменных. Код volatile uint8_t int1, int2, int3. В прерывании делаю int1 = 1 и в main Код If (int1) { int1 = 0; // и так далее } Подумал сделать так Код #define TIMER_COMP0 BIT0 #define TIMER_COMP1 BIT1 #define TIMER_UF BIT2 #define ADC_SINCOS BIT3 #define ADC_MAGREAD BIT4
volatile uint32_t intFlags; и потом в прерывании intFlags |= TIMER_COMP0; и в main Код if (intFlags & TIMER_COMP0) { intFlags &= ~ TIMER_COMP0; } какой вариант лучше? второй по моему на одну операцию больше.
|
|
|
|
|
Mar 4 2015, 13:19
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Цитата(Jenya7 @ Mar 4 2015, 17:58)  мда...это весомый аргумент.
а что после прерывания исполнение не продолжиться со следующей инструкции? Оно продолжится, но .. intFlags &= ~ TIMER_COMP0; транслируется в три команды: 1. выборка intFlags из памяти в регистр, 2. операция and с константой, результат остаётся в регистре, 3. запись из регистра в память нового значения intFlags. Если после 1. но перед 3. в середину вклинится прерывание, которое установит в intFlags ещё какой-то бит, то этот бит будет потерян, поскольку после выхода из обработчика выполнится команда 3., и она запишет в intFlags старое значение этого бита, которое было до прерывания.
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
|
Mar 4 2015, 13:27
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(SSerge @ Mar 4 2015, 18:19)  Оно продолжится, но ..
intFlags &= ~ TIMER_COMP0; транслируется в три команды: 1. выборка intFlags из памяти в регистр, 2. операция and с константой, результат остаётся в регистре, 3. запись из регистра в память нового значения intFlags.
Если после 1. но перед 3. в середину вклинится прерывание, которое установит в intFlags ещё какой-то бит, то этот бит будет потерян, поскольку после выхода из обработчика выполнится команда 3., и она запишет в intFlags старое значение этого бита, которое было до прерывания. понял. похоже лучше пожертвовать куском рама. он большой с него не убудет.  таки да - второй способ небезопасный. спасибо.
Сообщение отредактировал Jenya7 - Mar 4 2015, 14:09
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|