Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс. e-mail:jobsmp@pochta.ru |
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 - то же самое, из них читается не то, что в них писалось. Есть и более тонкие моменты.