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

 
 
> 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
Ответов
msalov
сообщение Jan 16 2014, 09:44
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Вы немного перепутали:
- указатель на переменную типа volatile - volatile unsigned int *ptr;
- volatile указатель - unsigned int * volatile ptr;

Что у вас изменяется вне программы? Указатель на регистр или значение регистра?

Полезное чтиво по чтению объявлений переменных -> http://www.unixwiz.net/techtips/reading-cdecl.html
Go to the top of the page
 
+Quote Post
skyv
сообщение Jan 16 2014, 11:33
Сообщение #3


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

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



Цитата(msalov @ Jan 16 2014, 12:44) *
Вы немного перепутали:
...


Да, согласен.
По Вашей ссылке посмотрю описание.
Я читал вот эту статью - volatile_for_chainiks.pdf.
И, если я правильно понял, автор советует всегда
использовать в качестве аргумента функции указатель на volatile переменную.
При этом сама переменная представляет собой регистр аппаратуры, который
объявлен как volatile.

Функция должна сделать некоторые действия над содержимым аппаратного
регистра (почитать, модифицировать, записать), может вернуть его значение.
Для того, что бы все действия функции над содержимым аппаратного регистра
не оптимизировались компилятором мы и должны использовать в качестве аргумента
указатель на volatile переменную.
При вызове функции просто передается адрес и никаких действий над ним
в других модулях программы не предполагается.
Например делаем конфигурацию различных каналов UART.


Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 16 2014, 11:58
Сообщение #4


Гуру
******

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



Цитата(skyv @ Jan 16 2014, 13:33) *
И, если я правильно понял, автор советует всегда
использовать в качестве аргумента функции указатель на volatile переменную.
"всегда" тут неуместно. Или вы не поняли, или мы вас. Если вы хотите передавать указатель на переменную, которая является volatile - вы должны параметр функции объявить как "указатель на volatile-переменную" (volatile int * param или int volatile * param, что одно и то же).
Если же вы хотите передавать указатель на обычную переменную - вы должны передавать указатель на обычную переменную. Не нужно считать компилятор дурнее себя - в подавляющем большинстве случаев оказыается наоборот.

Цитата(skyv @ Jan 16 2014, 13:33) *
Функция должна сделать некоторые действия над содержимым аппаратного
регистра (почитать, модифицировать, записать), может вернуть его значение.
В этом случае да. Но! Обычно в подобную функцию передается указатель на структуру, описывающую все регистры модуля периферии. И каждый из регитров описан как volatile. Вот в этом случае указатель на структуру не нужно объявлять как 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
skyv
сообщение Jan 16 2014, 13:48
Сообщение #5


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

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



Цитата(Сергей Борщ @ Jan 16 2014, 14:58) *
"всегда" тут неуместно. ...


Применительно к моему исходному вопросу я однозначно указал, что рассматриваю
работу функции с регистром аппаратуры, который объявлен как volatile.
По крайней хотел рассмотреть только этот вариант.

По поводу применения указателей на структуру это, на мой взгляд, однозначно
зависит от того как объявлены регистры аппаратуры в h файле на CPU.
Так, к примеру, для различных ARMов регистры той или иной аппаратуры контроллера
упакованы в соответствующие структуры, а вот если посмотреть на объявления
для dsPIC, то там такого добра нет. В этом случае и приходится работать
не через указатели на структуры, а через указатели на регистры.



Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 23rd August 2025 - 15:29
Рейтинг@Mail.ru


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