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

 
 
> Только начинаю
anaconda
сообщение Jan 18 2010, 20:13
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 18-11-07
Пользователь №: 32 418



Добрый вечер!
Только начинаю пользоваться IAR v5.30 для AVR. Сделал простенькую программку для вывода байта в USART0(контроллер Atmega162). Проверяю в Proteus и вижу, что в USART выводится не то, что должно. Частота кварца 7,372800 MHz baud rate=9600, 8data,1stop,no parity. В чем может быть ошибка?
Прикрепленные файлы
Прикрепленный файл  Test.rar ( 10.49 килобайт ) Кол-во скачиваний: 24
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Mark71
сообщение Jan 21 2010, 09:46
Сообщение #2





Группа: Участник
Сообщений: 9
Регистрация: 31-03-08
Пользователь №: 36 358



Слово volatile в переводе означает "изменчивый, непостоянный". В Си к описанию переменной следует добавлять слово volatile, если ее значение может изменяться не в результате выполнения программы, а из-за каких-либо внешних событий. Например, переменная может измениться при выполнении программы-обработчика аппаратного прерывания (см. раздел 2.5). Другой причиной "внезапного" изменения значения переменной может быть переключение между нитями при параллельном программировании (см. 2.6.2) и модификация переменной в параллельной нити.

Необходимо обязательно сообщать компилятору о таких изменчивых переменных. Дело в том, что процессор выполняет все действия с регистрами, а не с элементами памяти. Оптимизирующий компилятор держит значения большинства переменных в регистрах, сводя к минимуму обращения к памяти. Непостоянная переменная может изменить свое значение в памяти, но программа будет по-прежнему использовать значение в регистре, которое осталось прежним. Из-за этого выполнение программы нарушится. Модификатор volatile запрещает даже временно помещать переменную в регистр процессора.

Пример описания переменной:
volatile int inputPort;

Здесь мы описываем целочисленную переменную inputPort и сообщаем компилятору, что ее значение может внезапно меняться в результате каких-либо внешних событий. Этим мы запрещаем компилятору помещать переменную в регистр процессора в целях оптимизации программы.
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 21 2010, 11:07
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Mark71 @ Jan 21 2010, 14:46) *
Модификатор volatile запрещает даже временно помещать переменную в регистр процессора.
Не совсем так. Это зависит от особенностей компилятора и архитектуры МК. Есть архитектуры, которые не позволяют производить некоторые операции напрямую с содержимым памяти. Или, например, volatile-переменная имеет разрядность выше, чем нативная разрядность микроконтроллера. В этих случаях volatile-переменная может быть считана в регистры, но копирование ее значения будет предварять каждую операцию с ней.
Go to the top of the page
 
+Quote Post



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

 


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


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