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

 
 
> Атомарность чтения, в Cortex M3
Serg_el
сообщение Apr 1 2014, 08:41
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 302
Регистрация: 13-12-06
Из: Togliatti
Пользователь №: 23 473



Коллеги!

Правильно ли я понимаю, что чтение переменной в основном цикле, значение которой изменяется в прерывании, можно считать атомарным?

Т.е. к примеру существует структура, элементами которой являются:

1) 32-битная переменная, значение которой меняется через некий интерфейс (UART, CAN и т.п.) - изменяется в прерывании получения пакета;
2) копия этой переменной, значение которой может использоваться в основном цикле как угодно (чтение, запись), но к которой нет доступа из прерываний;
3) 32-битная переменная, значение которой уменьшается до 0 в прерывании таймера (время жизни переменной 1) и устанавливается равной некой константе в прерывании получения пакета;

typedef struct
{
volatile unsigned int Value_int;

unsigned int Value;

volatile unsigned int Valid_Timer;

} RxParameterInfo;

В основном цикле, если переменная 3 не равна 0, переменная 2 = переменной 1, иначе = 0.

if (Valid_Timer)
{
Value = Value_int;
}
else
{
Value = 0;
}

Вопрос возник из-за того, что Value = Value_int; состоит из минимум 3х ассемблерных команд. Но как я понимаю при входе в прерывание регистры R0-R2 автоматически сохраняются, а остальные через PUSH.
Т.е. мы в итоге не теряем информации об адресах и в результате присваивания в худшем случае в Value мы будем иметь предыдущее значение Value_int.

Также интересно, если Value или Value_int - это сложные указатели на структуры и для того, чтобы получить в итоге адрес, нужно несколько ассемблерных команд. Гарантируется ли в это случае компилятором сохранение всех участвующих регистров в стеке?

Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Golikov A.
сообщение Apr 3 2014, 06:52
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
И еще: кто-нить пользуется SVC? Может, лучше через SVC, раз "лишние" прерывания KnightIgor не напрягают?

начинаю ненавидеть аббревиатуры, впечатление что все в курсе, а ты один дурак не понимаешь о чем речь. SVS - это че?sm.gif

Цитата
Так вот в момент определения уровня заполнения буфера, необходимо сравнивать 2 указателя. В общем случае требуется критическая секция.

только на момент выбора этих указателей из памяти, да и то только в том случае если указатель выбирается не за 1 такт. В этом случае пока вы считываете указатель между вашими командами может что-то влезть и вы получите начало указателя верное, а конец нет. В прочих случаях вы максимум получите прошлое значение указателя, и достаточно ввести запас, снимать сигнал готовности на 90% а не на 99.9% и всех делов.


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

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

Если я чего-то упустил, был бы благодарен примеру, не стеба ради, а чтобы стать лучше чем был вчера...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Serg_el   Атомарность чтения   Apr 1 2014, 08:41
- - demiurg_spb   Цитата(Serg_el @ Apr 1 2014, 12:41) Прави...   Apr 1 2014, 09:15
|- - Serg_el   Цитата(demiurg_spb @ Apr 1 2014, 13:15) Н...   Apr 1 2014, 09:20
|- - demiurg_spb   Цитата(Serg_el @ Apr 1 2014, 13:20) А что...   Apr 1 2014, 09:24
|- - Serg_el   Цитата(demiurg_spb @ Apr 1 2014, 13:24) Э...   Apr 1 2014, 09:42
|- - demiurg_spb   Повторюсь, не нужно блокировать прерывания при зап...   Apr 1 2014, 10:31
||- - Serg_el   Цитата(demiurg_spb @ Apr 1 2014, 14:31) П...   Apr 1 2014, 11:12
|- - jcxz   Цитата(Serg_el @ Apr 1 2014, 15:42) Опаса...   Apr 1 2014, 12:05
- - Golikov A.   Да вы вообще не о том думаете. Какая разница вам ...   Apr 1 2014, 12:06
- - Serg_el   Всем спасибо за комментарии!   Apr 1 2014, 12:48
|- - demiurg_spb   Цитата(Serg_el @ Apr 1 2014, 16:48) Всем ...   Apr 2 2014, 03:30
- - amaora   Это такой ABI, один набор регистров сохраняется вн...   Apr 1 2014, 16:41
- - KnightIgor   Цитата(Serg_el @ Apr 1 2014, 09:41) Колле...   Apr 2 2014, 05:20
- - Golikov A.   туманно вы в конце написали а главное решения то н...   Apr 2 2014, 06:06
|- - KnightIgor   Цитата(Golikov A. @ Apr 2 2014, 07:06) ту...   Apr 2 2014, 08:28
- - Golikov A.   Цитата2.1. Установить флаг. 2.2. Выполнить действи...   Apr 2 2014, 09:04
|- - KnightIgor   Цитата(Golikov A. @ Apr 2 2014, 10:04) а ...   Apr 2 2014, 09:33
- - Golikov A.   давайте еще раз, я чего то не понимаю моя последо...   Apr 2 2014, 11:48
|- - KnightIgor   Цитата(Golikov A. @ Apr 2 2014, 12:48) да...   Apr 2 2014, 14:27
- - SasaVitebsk   По-моему, задача обработки фифо решена была нескол...   Apr 2 2014, 16:15
|- - jcxz   Цитата(SasaVitebsk @ Apr 2 2014, 22:15) П...   Apr 3 2014, 00:39
||- - SasaVitebsk   Цитата(jcxz @ Apr 3 2014, 03:39) Для FIFO...   Apr 3 2014, 02:12
||- - jcxz   Как так? FIFO не должно переполняться. Что-то у ва...   Apr 3 2014, 02:54
||- - SasaVitebsk   Цитата(jcxz @ Apr 3 2014, 05:54) Как так?...   Apr 3 2014, 06:32
|- - demiurg_spb   Цитата(SasaVitebsk @ Apr 2 2014, 20:15) Р...   Apr 3 2014, 03:57
- - Golikov A.   Цитатато есть прерывание РАБОТАЕТ внутри куска. И ...   Apr 2 2014, 16:59
- - adnega   Хорошо бы примерчик взаимной блокировки от KnightI...   Apr 3 2014, 06:23
|- - jcxz   Цитата(adnega @ Apr 3 2014, 12:23) И еще:...   Apr 3 2014, 08:24
|- - SasaVitebsk   Цитата(jcxz @ Apr 3 2014, 11:24) Так вот ...   Apr 3 2014, 10:23
|- - adnega   Цитата(jcxz @ Apr 3 2014, 12:24) Я пользу...   Apr 3 2014, 14:23
|- - jcxz   Цитата(adnega @ Apr 3 2014, 20:23) На чис...   Apr 3 2014, 15:21
|- - demiurg_spb   Цитата(Golikov A. @ Apr 3 2014, 10:52) на...   Apr 3 2014, 06:56
- - andrewlekar   ЦитатаSVS - это че? Это видимо имелось в виду прог...   Apr 3 2014, 06:58
|- - jcxz   Цитата(andrewlekar @ Apr 3 2014, 12:58) П...   Apr 3 2014, 11:45
- - andrewlekar   ЦитатаИнтересно - как вы с помощью мьютексов и про...   Apr 3 2014, 13:29
|- - jcxz   Цитата(andrewlekar @ Apr 3 2014, 19:29) П...   Apr 3 2014, 14:38
|- - kostyan   Цитата(andrewlekar @ Apr 3 2014, 19:29) П...   Apr 4 2014, 01:26
- - andrewlekar   Тут достаточно не критической секции, а запрета ко...   Apr 3 2014, 15:08


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

 


RSS Текстовая версия Сейчас: 24th July 2025 - 19:03
Рейтинг@Mail.ru


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