|
Атомарная операция, STM32F10x |
|
|
|
Dec 2 2008, 12:59
|
Группа: Новичок
Сообщений: 3
Регистрация: 29-11-08
Пользователь №: 42 058

|
Как запрерить прерывания в STM32F10x? Ну, и как разрешить прерывания в STM32F10x? Нужно, для выполнения атомарной операции.
|
|
|
|
|
Dec 2 2008, 17:32
|
Участник

Группа: Участник
Сообщений: 21
Регистрация: 29-01-06
Пользователь №: 13 730

|
В Кейле есть инструкции: __disable_fiq(); __disable_irq(); __enable_fiq(); __enable_irq(); и их ASM варианты.
Иногда полезно использовать SWI режим.
|
|
|
|
|
Dec 3 2008, 10:35
|
Местный
  
Группа: Свой
Сообщений: 201
Регистрация: 23-01-06
Из: Msk
Пользователь №: 13 490

|
Цитата(ssergy @ Dec 2 2008, 20:32)  В Кейле есть инструкции: __disable_fiq(); __disable_irq(); __enable_fiq(); __enable_irq(); и их ASM варианты.
Иногда полезно использовать SWI режим. Учите матчасть, в кортексе нет ни fiq, ни swi
|
|
|
|
|
Dec 29 2008, 14:51
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(abcdefg @ Dec 3 2008, 14:35)  Учите матчасть, в кортексе нет ни fiq, ни swi Однако эти инструкции: Код __disable_fiq(); __disable_irq(); __enable_fiq(); __enable_irq(); с таким-же успехом применяются для управления прерываниями и в кортексе.
|
|
|
|
|
Dec 30 2008, 06:04
|
Знающий
   
Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317

|
Разрешение прерываний : Код 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"); } }
|
|
|
|
|
Dec 30 2008, 14:05
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(sonycman @ Dec 30 2008, 04:36)  А можно подробнее - в каких библиотеках и где? Да, я ошибся по памяти, почему-то подумал, что в библиотеках от STM32, но это в файле arm_comm.h от IAR. " ** Common definition for IAR EW ARM ..." Определения, приведенные MALLOY2, оттуда.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Dec 30 2008, 16:02
|
Знающий
   
Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317

|
Цитата scmRTOS содержит прекрасный класс-обертку на С++, реализующий вход/выход в/из критической секции.
То, что выше приведено, это не критическая секция, а просто запрет/разрешение прерываний. Кардинальное отличие - при входе в критическую секцию вы запоминаете текущее состояние прерываний, запрещаете прерывания, а при выходе - восстанавливаете исходное состояние, которое изначально может быть и "запрещено". Если запрещены прерывания тогда зачем критическая секция ? ведь программу нично прервать не может ? Если используется операционка то там они всегда разрешены, и достаточно счетчика как в выше приведенном примере...
|
|
|
|
|
Jan 1 2009, 22:18
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(Alex B._ @ Jan 2 2009, 01:33)  Про разрядность так и не понял. У любой RMW архитектуры существует подобная проблема, вне зависимости от разрядности. Но ведь всё просто. К примеру, имеется ISR таймера с единственной инструкцией - counter++; Если проц восьмибитный и counter имеет разрядность больше байта - перед чтением значения (в основном цикле) надо заходить в critical section, иначе, после чтения первого байта, может проскочить прерывание и второй байт будет изменён. Таким образом мы получим один байт от предыдущего значения счётчика, а второй и последующие - от нового. Если разрядность проца 32 бита (а переменная counter в большинстве случаев не будет превышать такую разрядность), то считывать можно без всяких секций - проц в любом случае прочитает её целиком.
|
|
|
|
|
May 14 2011, 22:53
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046

|
Цитата(KRS @ Jan 2 2009, 15:36)  а какая атомарная операция вам нужна? у кортекса есть еще LDREX STREX (их можно и прямо из С использовать) и прерывания запрещать не понадобится только толку от этих инстуркций мало Cortex-M3 Device Generic User Guide: Цитата The result of executing a Store-Exclusive instruction to an address that is different from that used in the preceding Load-Exclusive instruction is unpredictable. ARM®v7-M ArchitectureReference Manual Цитата If the local monitor is in its Exclusive Access state and a processor performs a Store-Exclusive to any address other than the last one from which it has performed a Load-Exclusive, it is IMPLEMENTATION DEFINED whether the store succeeds, but in all cases the local monitor is reset to its Open Access state. In ARMv7-M, the store must be treated as a software programming error.
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|