Перейти к содержанию
    

Как запрерить прерывания в STM32F10x?

Ну, и как разрешить прерывания в STM32F10x?

Нужно, для выполнения атомарной операции.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В Кейле есть инструкции:

__disable_fiq();

__disable_irq();

__enable_fiq();

__enable_irq();

и их ASM варианты.

 

Иногда полезно использовать SWI режим.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

save_sr:

       mrs    r0, PRIMASK
       cpsid  I
       bx     lr

restore_sr:

       msr    PRIMASK, r0
       bx     lr

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В Кейле есть инструкции:

__disable_fiq();

__disable_irq();

__enable_fiq();

__enable_irq();

и их ASM варианты.

 

Иногда полезно использовать SWI режим.

 

Учите матчасть, в кортексе нет ни fiq, ни swi

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Учите матчасть, в кортексе нет ни fiq, ни swi

Однако эти инструкции:

__disable_fiq();
__disable_irq();
__enable_fiq();
__enable_irq();

с таким-же успехом применяются для управления прерываниями и в кортексе.

:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как запрерить прерывания в STM32F10x?

Ну, и как разрешить прерывания в STM32F10x?

В примерах использования библиотек есть макросы ENTR_CRT_SECTION() и EXT_CRT_SECTION().

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В примерах использования библиотек есть макросы ENTR_CRT_SECTION() и EXT_CRT_SECTION().

А можно подробнее - в каких библиотеках и где?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость MALLOY2

Разрешение прерываний :

asm("CPSIE i");

 

Запрещение прерываний:

asm("CPSID i");

 

Если компилятор IAR подлючаем "intrinsics.h "

и юзаем функции

__disable_interrupt(void);
__enable_interrupt(void);
unsigned long __get_PRIMASK( void );
void          __set_PRIMASK( unsigned long );
unsigned long __get_FAULTMASK( void );
void          __set_FAULTMASK(unsigned long);
unsigned long __get_BASEPRI( void );
void          __set_BASEPRI( unsigned long );

 

Если программа работает без операционки то атомарность нужно соблюдать относительно 1 какогото прерывания и лучше его запрещать/разрешать в NVIC.

 

inline void EntrCritSection(void)
{
  if(CriticalSecCntr == 0)
  {
    asm("CPSID i");
  }
  // avoid lost of one count in case of simultaneously calling from both places
  ++CriticalSecCntr;
}

inline void ExtCritSection(void)
{
  if(--CriticalSecCntr == 0)
  {
    asm("CPSIE i");
  }
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

scmRTOS содержит прекрасный класс-обертку на С++, реализующий вход/выход в/из критической секции.

 

То, что выше приведено, это не критическая секция, а просто запрет/разрешение прерываний. Кардинальное отличие - при входе в критическую секцию вы запоминаете текущее состояние прерываний, запрещаете прерывания, а при выходе - восстанавливаете исходное состояние, которое изначально может быть и "запрещено".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А можно подробнее - в каких библиотеках и где?

Да, я ошибся по памяти, почему-то подумал, что в библиотеках от STM32, но это в файле arm_comm.h от IAR.

" ** Common definition for IAR EW ARM ..."

Определения, приведенные MALLOY2, оттуда.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость MALLOY2
scmRTOS содержит прекрасный класс-обертку на С++, реализующий вход/выход в/из критической секции.

 

То, что выше приведено, это не критическая секция, а просто запрет/разрешение прерываний. Кардинальное отличие - при входе в критическую секцию вы запоминаете текущее состояние прерываний, запрещаете прерывания, а при выходе - восстанавливаете исходное состояние, которое изначально может быть и "запрещено".

 

Если запрещены прерывания тогда зачем критическая секция ? ведь программу нично прервать не может ? Если используется операционка то там они всегда разрешены, и достаточно счетчика как в выше приведенном примере...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если запрещены прерывания тогда зачем критическая секция ? ведь программу нично прервать не может ? Если используется операционка то там они всегда разрешены, и достаточно счетчика как в выше приведенном примере...

 

Если прерывания глобально запрещены (т.е. не используются), то и критическая секция,естественно, не нужна. А если у вас используются, например, вложенные прерывания?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...А если у вас используются, например, вложенные прерывания?

А объясните плз, что за неатомарные операции в 32-разрядном контроллере?

Это еще нужно извратиться, чтобы проблема возникла.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А объясните плз, что за неатомарные операции в 32-разрядном контроллере?

Это еще нужно извратиться, чтобы проблема возникла.

При чем тут 32-бита? А не атомарные - любое чтение-модификация-запись.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При чем тут 32-бита? А не атомарные - любое чтение-модификация-запись.

Да не любое. Банальная передача флага от одного "процесса" другому не требует атомарности. Ну опросит второй процесс флаг после чтения переменной из памяти первым процессом ? - ничего не изменится.

А вот инкремент переменной - требует. Поэтому разрядность влияет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...