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

 
 
> volatile указатель
skyv
сообщение Jan 16 2014, 09:16
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 181
Регистрация: 26-07-10
Пользователь №: 58 606



Добрый день.
Вопрос по использованию квалификатора volatile вроде обсуждался, но для себя хочу уточнить.
Имеем регистр аппаратуры, который объявлен в h файле как:
extern volatile unsigned int PORTB.
Как правильно определить аргумент функции в который передается адрес регистра аппаратуры:
- как указатель на переменную типа volatile - unsigned int * volatile ptr;
- как volatile указатель - volatile unsigned int *ptr;
- как volatile указатель на volatile переменную - volatile unsigned int * volatile ptr;
Спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Tarbal
сообщение Jan 17 2014, 00:06
Сообщение #2


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

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



volatile это инструкция для оптимизатора.

Один из вариантов:
Если переменная не изменяется посредством присваивания, допустим мы в нее что-то один раз записали, а потом только читаем. Можно сделать эквивалентную оптимизацию. Выиграть на чтении и записи в переменную, заменив все чтения подстановкой константы. И все будет прекрасно работать если это переменная в памяти. Однако если это регистр, то такая оптимизация недопустима. Слово volatile предотвращает оптимизацию для переменной, оставляя ее переменной.

Поскольку параметры функции не будут оптимизироваться подобным образом, то писать volatile для параметра не обязательно.

Сообщение отредактировал Tarbal - Jan 17 2014, 00:13
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 17 2014, 10:45
Сообщение #3


Гуру
******

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



Цитата(Tarbal @ Jan 17 2014, 02:06) *
Поскольку параметры функции не будут оптимизироваться подобным образом, то писать volatile для параметра не обязательно.
Сам параметр (в этой дискуссии - указатель на переменную) меняться не будет, безусловно. И поэтому не "необязательно", а "не нужно совсем" - чтобы не плодить большие медленные программы. А вот та переменная, на которую указатель указывает (в этой дискуссии - регистр специального назначения, SFR), измениться может. И об этом компилятору надо сообщить. Поэтому такой параметр должен быть указателем на volatile-переменную.


Цитата(Rst7 @ Jan 17 2014, 12:09) *
Например регистр, содержащий адрес пересылки DMA, и есть такой volatile-указатель.
Но в Си такой регистр нельзя передать как параметр в функцию. Можно или передать его значение на момент вызова функции, либо указатель на него. При этом такой указатель будет все время указывать на регистр адреса пересылки DMA, т.е. не изменится. В Си с плюсами регистр можно передать в функцию в виде ссылки и вот тут да, это будет чистый и честный volatile-указатель. Однако в плюсах компилятор не даст потерять volatile при объявлении ссылки, то есть предмет споров пропадает.


--------------------
На любой вопрос даю любой ответ
"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



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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 05:10
Рейтинг@Mail.ru


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