Jump to content

    
Sign in to follow this  
cz_nikita

Атомарная операция

Recommended Posts

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

__disable_fiq();

__disable_irq();

__enable_fiq();

__enable_irq();

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

 

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

 

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

Share this post


Link to post
Share on other sites
Учите матчасть, в кортексе нет ни fiq, ни swi

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

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

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

:)

Share this post


Link to post
Share on other sites
Как запрерить прерывания в STM32F10x?

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

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

Share this post


Link to post
Share on other sites
Guest 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");
  }
}

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites
А можно подробнее - в каких библиотеках и где?

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

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

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

Share this post


Link to post
Share on other sites
Guest MALLOY2
scmRTOS содержит прекрасный класс-обертку на С++, реализующий вход/выход в/из критической секции.

 

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

 

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

Share this post


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

 

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

Share this post


Link to post
Share on other sites
...А если у вас используются, например, вложенные прерывания?

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

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

Share this post


Link to post
Share on other sites
А объясните плз, что за неатомарные операции в 32-разрядном контроллере?

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

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

Share this post


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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this