Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Если с этой ave_volt больше работает прерывание, чем основной код (осн. код только иногда читает, а прерывание ещё и пишет) (+)

Отправлено ReAl 15 мая 2007 г. 10:15
В ответ на: Вот ещё, издержкм "volatile"? отправлено <font color=gray>Неофит</font> 15 мая 2007 г. 07:40

то может оказаться удобнее не через временную переменную в прерывании, а так:

static uint16_t ave_volt;
uint16_t get_ave_volt(void)
{
uint16_t temp;
cli();
temp = ave_volt;
sei();
return temp;
}

ISR(ADC_vect)
{
// тут спокойно работать с ave_volt, она не volatile,
// доп. переменная не нужна
}

Любой соответствующий стандарту компилятор обязан был бы записать ave_volt на место и прочесть перед проверкой в том if(), если он этого не делает - выбросить нафиг даже если он очень нравится.
"переменная", квалифицированная как volatile, вообще может на чтение выдавать не то, что в неё записали. Примеры - какой-нибудь регистр сопроцессора (пишешь данные, в другой пишешь команду, из первого читаешь результат - ну как тут "экономить" и использовать то, что записывали). Не нравится сопроцессор - посмотри на регистры SPDR, UDR - то же самое, из них читается не то, что в них писалось. Есть и более тонкие моменты.


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 69:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru