реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Атомарная операция, STM32F10x
cz_nikita
сообщение Dec 2 2008, 12:59
Сообщение #1





Группа: Новичок
Сообщений: 3
Регистрация: 29-11-08
Пользователь №: 42 058



Как запрерить прерывания в STM32F10x?
Ну, и как разрешить прерывания в STM32F10x?
Нужно, для выполнения атомарной операции.
Go to the top of the page
 
+Quote Post
ssergy
сообщение Dec 2 2008, 17:32
Сообщение #2


Участник
*

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



В Кейле есть инструкции:
__disable_fiq();
__disable_irq();
__enable_fiq();
__enable_irq();
и их ASM варианты.

Иногда полезно использовать SWI режим.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Dec 2 2008, 18:04
Сообщение #3


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Код
save_sr:

       mrs    r0, PRIMASK
       cpsid  I
       bx     lr

restore_sr:

       msr    PRIMASK, r0
       bx     lr
Go to the top of the page
 
+Quote Post
abcdefg
сообщение Dec 3 2008, 10:35
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
sonycman
сообщение Dec 29 2008, 14:51
Сообщение #5


Любитель
*****

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



Цитата(abcdefg @ Dec 3 2008, 14:35) *
Учите матчасть, в кортексе нет ни fiq, ни swi

Однако эти инструкции:
Код
__disable_fiq();
__disable_irq();
__enable_fiq();
__enable_irq();

с таким-же успехом применяются для управления прерываниями и в кортексе.
smile.gif
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Dec 29 2008, 15:39
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(cz_nikita @ Dec 2 2008, 16:59) *
Как запрерить прерывания в STM32F10x?
Ну, и как разрешить прерывания в STM32F10x?

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


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
sonycman
сообщение Dec 30 2008, 00:36
Сообщение #7


Любитель
*****

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



Цитата(Dog Pawlowa @ Dec 29 2008, 19:39) *
В примерах использования библиотек есть макросы ENTR_CRT_SECTION() и EXT_CRT_SECTION().

А можно подробнее - в каких библиотеках и где?
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Dec 30 2008, 06:04
Сообщение #8


Знающий
****

Группа: 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");
  }
}
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 30 2008, 13:07
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



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

То, что выше приведено, это не критическая секция, а просто запрет/разрешение прерываний. Кардинальное отличие - при входе в критическую секцию вы запоминаете текущее состояние прерываний, запрещаете прерывания, а при выходе - восстанавливаете исходное состояние, которое изначально может быть и "запрещено".
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Dec 30 2008, 14:05
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 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, оттуда.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Dec 30 2008, 16:02
Сообщение #11


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



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

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


Если запрещены прерывания тогда зачем критическая секция ? ведь программу нично прервать не может ? Если используется операционка то там они всегда разрешены, и достаточно счетчика как в выше приведенном примере...
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 30 2008, 20:01
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(MALLOY2 @ Dec 30 2008, 20:02) *
Если запрещены прерывания тогда зачем критическая секция ? ведь программу нично прервать не может ? Если используется операционка то там они всегда разрешены, и достаточно счетчика как в выше приведенном примере...


Если прерывания глобально запрещены (т.е. не используются), то и критическая секция,естественно, не нужна. А если у вас используются, например, вложенные прерывания?
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Dec 31 2008, 07:25
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(sergeeff @ Dec 31 2008, 00:01) *
...А если у вас используются, например, вложенные прерывания?

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


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Alex B._
сообщение Dec 31 2008, 07:52
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 943
Регистрация: 6-07-04
Из: Санкт-Петербург
Пользователь №: 274



Цитата(Dog Pawlowa @ Dec 31 2008, 10:25) *
А объясните плз, что за неатомарные операции в 32-разрядном контроллере?
Это еще нужно извратиться, чтобы проблема возникла.

При чем тут 32-бита? А не атомарные - любое чтение-модификация-запись.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Dec 31 2008, 08:07
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Alex B._ @ Dec 31 2008, 11:52) *
При чем тут 32-бита? А не атомарные - любое чтение-модификация-запись.

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


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th June 2025 - 21:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.01491 секунд с 7
ELECTRONIX ©2004-2016