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

 
 
> Атомарная операция, 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
 
Start new topic
Ответов
MALLOY2
сообщение Dec 30 2008, 16:02
Сообщение #2


Знающий
****

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



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

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


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


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

Группа: Свой
Сообщений: 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
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 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
Сообщение #6


Гуру
******

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



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

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


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Alex B._
сообщение Jan 1 2009, 21:33
Сообщение #7


Знающий
****

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



Цитата(Dog Pawlowa @ Dec 31 2008, 11:07) *
Да не любое. Банальная передача флага от одного "процесса" другому не требует атомарности. Ну опросит второй процесс флаг после чтения переменной из памяти первым процессом ? - ничего не изменится.
А вот инкремент переменной - требует. Поэтому разрядность влияет.

Проблемы начнутся, когда эти "процессы" начнут взаимно синхронизироваться через этот флаг.
Про разрядность так и не понял. У любой RMW архитектуры существует подобная проблема, вне зависимости от разрядности.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jan 1 2009, 22:18
Сообщение #8


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

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



Цитата(Alex B._ @ Jan 2 2009, 01:33) *
Про разрядность так и не понял. У любой RMW архитектуры существует подобная проблема, вне зависимости от разрядности.

Но ведь всё просто.
К примеру, имеется ISR таймера с единственной инструкцией - counter++;
Если проц восьмибитный и counter имеет разрядность больше байта - перед чтением значения (в основном цикле) надо заходить в critical section, иначе, после чтения первого байта, может проскочить прерывание и второй байт будет изменён. Таким образом мы получим один байт от предыдущего значения счётчика, а второй и последующие - от нового.
Если разрядность проца 32 бита (а переменная counter в большинстве случаев не будет превышать такую разрядность), то считывать можно без всяких секций - проц в любом случае прочитает её целиком.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 1 2009, 22:52
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(sonycman @ Jan 2 2009, 00:18) *
Но ведь всё просто.
А если эта переменная - структура? А если система команд не имеет команды "установить бит" для ячейки памяти (как AVR) - тогда для взведения флага один процесс (а) считывает переменную, накладывает маску, хочет записать результат назад и в это время возникает перепланировка или прерывание и другой участок кода (б) тоже считывает-модифицирует-записывает переменную, возвращая управление коду (а), который заканчивая RMW затирает изменение, только что внесенное кодом (б).


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jan 2 2009, 02:15
Сообщение #10


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

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



Цитата(Сергей Борщ @ Jan 2 2009, 02:52) *
А если эта переменная - структура? А если система команд не имеет команды "установить бит" для ячейки памяти (как AVR) - тогда для взведения флага один процесс (а) считывает переменную, накладывает маску, хочет записать результат назад и в это время возникает перепланировка или прерывание и другой участок кода (б) тоже считывает-модифицирует-записывает переменную, возвращая управление коду (а), который заканчивая RMW затирает изменение, только что внесенное кодом (б).

Тогда тоже всё просто - critical section smile.gif
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jan 2 2009, 11:06
Сообщение #11


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

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



Цитата(sonycman @ Jan 2 2009, 06:15) *
Тогда тоже всё просто - critical section smile.gif


Так вот именно про это выше по-русски и сказано : критическая секция, а не просто запрет/разрешение прерываний.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jan 2 2009, 11:22
Сообщение #12


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

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



Цитата(sergeeff @ Jan 2 2009, 15:06) *
Так вот именно про это выше по-русски и сказано : критическая секция, а не просто запрет/разрешение прерываний.

А кто спорит? Если задача не совсем простенькая, и прерывания в процессе динамически запрещаются/разрешаются в нескольких потоках, то нужно восстанавливать сохранённое значение PRIMASK/FAULMASK перед выходом из CS, а не просто тупо их разрешать.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- cz_nikita   Атомарная операция   Dec 2 2008, 12:59
- - ssergy   В Кейле есть инструкции: __disable_fiq(); __disabl...   Dec 2 2008, 17:32
|- - abcdefg   Цитата(ssergy @ Dec 2 2008, 20:32) В Кейл...   Dec 3 2008, 10:35
|- - sonycman   Цитата(abcdefg @ Dec 3 2008, 14:35) Учите...   Dec 29 2008, 14:51
- - IgorKossak   Кодsave_sr: mrs r0, PRIMASK cpsid I ...   Dec 2 2008, 18:04
- - Dog Pawlowa   Цитата(cz_nikita @ Dec 2 2008, 16:59) Как...   Dec 29 2008, 15:39
|- - sonycman   Цитата(Dog Pawlowa @ Dec 29 2008, 19:39) ...   Dec 30 2008, 00:36
|- - Dog Pawlowa   Цитата(sonycman @ Dec 30 2008, 04:36) А м...   Dec 30 2008, 14:05
- - MALLOY2   Разрешение прерываний : Кодasm("CPSIE i...   Dec 30 2008, 06:04
- - sergeeff   scmRTOS содержит прекрасный класс-обертку на С++, ...   Dec 30 2008, 13:07
||- - klop   Извините если не в тему но мне всегда казалось что...   Jan 2 2009, 00:24
|- - HARMHARM   Цитата(Alex B._ @ Dec 31 2008, 09:52) При...   Dec 31 2008, 08:35
- - KRS   а какая атомарная операция вам нужна? у кортекса е...   Jan 2 2009, 12:36
- - brag   Цитата(KRS @ Jan 2 2009, 15:36) а какая а...   May 14 2011, 22:53


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 23:59
Рейтинг@Mail.ru


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