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

 
 
> Ключевое слово "Volatile"
RollForRepair
сообщение Nov 16 2015, 08:25
Сообщение #1





Группа: Новичок
Сообщений: 4
Регистрация: 13-11-15
Из: Санкт-Петербург
Пользователь №: 89 305



Доброго времени суток.

Написал программу в CodeVisionAVR, смотрю изменение значений переменных в Протеусе. Переменные, за которыми я слежу, являлись типом "long int". В какой-то момент я решил сделать их просто int, т.к. значения в проге вполне вписываются и без приставки long. Внезапно в протеусе появляется такая надпись на месте значения переменной - Item (2 bytes at 0xFFFF0504) not within memory block (0x00000460 bytes), и изменилась запись адреса - R-64252:R64251 . При этом программа работает нормально, просто не получается следить за значениями переменных. Вот скриншот.

http://i.imgur.com/0WM63lR.jpg ([img] почему-то не работает, приходится оставлять в виде ссылки)

Погуглив, я нашёл решение данной проблемы - добавить ключевое слово Volatile перед int. Это помогло, но мне хотелось бы разобраться до конца :
  • Что означает запись на месте значения переменной?
  • Почему этой проблемы не было с long int?
  • Что делает слово Volatile в данном случае?
  • Ну и как бонусный вопрос, есть ли способ выводить значения переменных типа float? (у меня это D, U, Uprop ...)


Буду благодарен за помощь.

Сообщение отредактировал RollForRepair - Nov 16 2015, 08:26
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Nov 16 2015, 09:28
Сообщение #2


Гуру
******

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



Цитата(RollForRepair @ Nov 16 2015, 11:25) *
Погуглив, я нашёл решение данной проблемы - добавить ключевое слово Volatile перед int.
Это лечение симптомов, а не причины. volatile существует для другого. В данном случае оно сделало вашу маленькую быструю программу больше и медленнее.
Цитата(RollForRepair @ Nov 16 2015, 11:25) *
Что означает запись на месте значения переменной?
Никогда не работал с вашим компилятором, но смею предположить, что это означает, что ваша переменная хранится в регистрах, а не в ОЗУ. Поэтому отладчик не может ее отобразить. Убедиться в этом можно, рассмотрев внимательно дизасемблерный код в местах обращения к этой переменной.
Цитата(RollForRepair @ Nov 16 2015, 11:25) *
Почему этой проблемы не было с long int?
Если первое предположение верно, то раньше эта переменная в регистры не помещалась и компилятор был вынужден разместить ее в ОЗУ.
Цитата(RollForRepair @ Nov 16 2015, 11:25) *
Что делает слово Volatile в данном случае?
То же, что и в любом другом случае - говорит компилятору, что значение переменной может измениться в любой момент неизвестным ему образом и что любая запись в эту переменную влияет на "наблюдаемое поведение" программы. Это запрещает оптимизацию обращений к переменной. С этим ключевым словом компилятор обязан выполнить любое действие с этой перемееной именно так и в том порядке, в котором оно описано в программе. Если вы написали a = 1; a++; то компилятор обязан сначала записать в переменную 1, потом прочитать из этой переменной ее содержимое, увеличить его на 1 и записать результат обратно. Он уже не имеет права соптимизировать эти действия и записать в переменную a сразу значение 2, потому что volatile говорит, что во-первых между a=1 и a++ значение a могло измениться (например, если это отраженный на память регистр ввода или между этими действиями произошло прерывание, обработчик которого изменил переменную) и что обе записи могли на что-то влиять (опять же, если это отраженный на память регистр вывода или же между этими выражениями произошло прерывание, которое должно было считать из a первое значение)
Цитата(RollForRepair @ Nov 16 2015, 11:25) *
Ну и как бонусный вопрос, есть ли способ выводить значения переменных типа float?
Это надо искать в документации или спрашивать у службы техподдержки вашего компилятора и отладчика. Вы ведь их честно купили?


--------------------
На любой вопрос даю любой ответ
"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
RollForRepair
сообщение Nov 16 2015, 10:34
Сообщение #3





Группа: Новичок
Сообщений: 4
Регистрация: 13-11-15
Из: Санкт-Петербург
Пользователь №: 89 305



Цитата(Сергей Борщ @ Nov 16 2015, 12:28) *
...

Большое спасибо за подробный ответ!

Цитата(slavokhire5 @ Nov 16 2015, 12:27) *
...100 раз подумайте, перед тем, как использовать в AVR переменные типа float - огромное потребление ресурсов.

А какой тип данных мне использовать, если целочисленным не обойтись? (Мне надо умножить разность целочисленных переменных на коэффициент от 0 до 1, то есть результат будет нецелочисленный)
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Nov 16 2015, 10:52
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502



Цитата(RollForRepair @ Nov 16 2015, 10:34) *
А какой тип данных мне использовать, если целочисленным не обойтись? (Мне надо умножить разность целочисленных переменных на коэффициент от 0 до 1, то есть результат будет нецелочисленный)


Fixed point ?
Go to the top of the page
 
+Quote Post



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

 


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


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