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

 
 
> Атомарная работа с данными в Cortex-M3
Rev0.0
сообщение Aug 8 2013, 18:17
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 3-05-13
Пользователь №: 76 718



Привет!
Почитал разные материалы про атомарные операции, никак не могу прийти к выводу в чем опасность чтения? При модификации все понятно - произошло прерывание или переключение задач в ОСРВ, которое вклинилось между инструкциями, данные испортятся.
А вот при чтении?
Возьмем функцию на Cortex-M3:
long long a;
void store(void)
{
a=0xDDCCFFEE12345678;
}
Ассемблерный код после компиляции такой:
0x00001314 493A LDR r1,[pc,#232] ; @0x00001400
0x00001316 483B LDR r0,[pc,#236] ; @0x00001404
0x00001318 4A3B LDR r2,[pc,#236] ; @0x00001408
0x0000131A E9C21000 STRD r1,r0,[r2,#0]
Если я располагаю этот код в одной задаче ОСРВ, а читаю допустим в другой, то ведь никаких проблем не будет т.к. переменная a меняется по последней инструкции? В чем подвох?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
andrewlekar
сообщение Aug 12 2013, 08:28
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



Я бы, для работы с АЦП, выделил отдельную задачу. Результаты бы складывал в локальный буфер: static adc_measure_t adc_results[ADC_CHANNELS]. Для обращения к полученным значениям ADC сделал бы функцию геттер: adc_task_get_adc_value(int channel). Внутри этой функции я бы делал блокировку, копирование результата в локальную переменную (если много, то memcpy) и разблокировку:
Код
lock(mutex)
int result = adc_results[channel];
unlock(mutex)
return result;


Да, задача ADC Task при складировании результатов от ацп тоже должна выполнять блокировку-разблокировку.
Go to the top of the page
 
+Quote Post



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

 


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


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