Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
21.08.2011, 16:52
|
|
Прописка
Регистрация: 27.10.2010
Сообщений: 133
Сказал спасибо: 24
Сказали Спасибо 53 раз(а) в 41 сообщении(ях)
|
Когда нужно volatile?
разъясните мне плиз на примере необходимость этой "volotile" получается в код вижине она совсем не нужна пример:
int a=0;//хоть так работает
volatile int a=0;//хоть этак работает
interrupt [EXT_INT0] void ext_int0_isr(void)
{
a++;
}
void main(void)
{
DDRB=0xff;
GICR|=0x40;
MCUCR=0x02;
GIFR=0x40;
#asm("sei")
while (1)
{
PORTB=a;//все равно работает
};
}
а в avr studio 4 volatile нужна,пример:
volatile int a=0;//так все работает
int a=0;//так не работает
SIGNAL(SIG_INTERRUPT0)
{
a++;
}
int main(void)
{
DDRB=0xff;
DDRD |= 1‹‹1;
PORTD |= _BV(PD1);
DDRD &= ~(0‹‹2);
PORTD |= _BV(PD2);
GIMSK = 1‹‹INT0;
MCUCR = 1‹‹ISC01;
asm("sei");
for (;
{
PORTB=a;
}
}
где подвох?
ведь не зря Атмельци так сделали?!
__________________
- Слово на "б" знаешь ? - ??? - "Береги себя"...
Последний раз редактировалось neox-neox; 21.08.2011 в 16:57.
|
|
|
Сказали "Спасибо" neox-neox
|
|
|
21.08.2011, 16:54
|
|
Прописка
Регистрация: 26.01.2009
Сообщений: 249
Сказал спасибо: 23
Сказали Спасибо 102 раз(а) в 61 сообщении(ях)
|
Re: когда нужно volatile?
|
|
|
Эти 2 пользователя(ей) сказали Спасибо testerplus за это сообщение:
|
|
|
21.08.2011, 17:43
|
|
Прописка
Регистрация: 27.10.2010
Сообщений: 133
Сказал спасибо: 24
Сказали Спасибо 53 раз(а) в 41 сообщении(ях)
|
Re: когда нужно volatile?
ок testerplus, кое что разъяснилось. получается что если глобальную переменную мы используем как в "main" так и в коком либо прерывание луче обозвать ее volotile.это многозадачность для одной переменной! но как быть тогда с CV получается он врет? но все ведь работает!
__________________
- Слово на "б" знаешь ? - ??? - "Береги себя"...
|
|
|
Сказали "Спасибо" neox-neox
|
|
|
21.08.2011, 17:59
|
|
Прописка
Регистрация: 26.01.2009
Сообщений: 249
Сказал спасибо: 23
Сказали Спасибо 102 раз(а) в 61 сообщении(ях)
|
Re: когда нужно volatile?
Сообщение от neox-neox
|
но как быть тогда с CV получается он врет? но все ведь работает!
|
CV, насколько я помню, не особо искушен в оптимизации. тут штука такая: чем умнее компилятор, тем больше проблем из-за отсутствия волатайл.
Поймите, что volatile сделали не атмельщики, а сишники. Это стандартный квалификатор. Если Вы заглянете в код, сгенеренный CV и WinAVR (AvrStudio), то поймете, в чем разница и откуда растут ноги.
|
|
|
Сказали "Спасибо" testerplus
|
|
|
21.08.2011, 18:07
|
|
Прописка
Регистрация: 27.10.2010
Сообщений: 133
Сказал спасибо: 24
Сказали Спасибо 53 раз(а) в 41 сообщении(ях)
|
Re: когда нужно volatile?
Сообщение от testerplus
|
volatile сделали не атмельщики, а сишники
|
сори я имел в виду другое.вы правы!
__________________
- Слово на "б" знаешь ? - ??? - "Береги себя"...
|
|
|
Сказали "Спасибо" neox-neox
|
|
|
21.08.2011, 18:10
|
|
Заблокирован
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
|
Re: когда нужно volatile?
Сообщение от neox-neox
|
но как быть тогда с CV получается он врет? но все ведь работает!
|
Некоторые недо- полу- СИ-компиляторы вполне могут позволить себе вольность не применять volatile...
Поройтесь в папках компилятора, позаглядывайте в хидеры... если порты, регистры и отдельные биты описаны с квалификатором volatile, то вероятность нарваться на неприятности в случае его неприменения высока...
|
|
|
|
21.08.2011, 18:17
|
|
Прописка
Регистрация: 27.10.2010
Сообщений: 133
Сказал спасибо: 24
Сказали Спасибо 53 раз(а) в 41 сообщении(ях)
|
Re: когда нужно volatile?
Сообщение от testerplus
|
CV, насколько я помню, не особо искушен в оптимизации
|
да и на счет этого тоже правы ![Выпьем!](images/smilies/icon_drink.gif) ,сравнил hex-ы у CV hex больше при одинаковых кодах! даже при включенной оптимизации по размеру
__________________
- Слово на "б" знаешь ? - ??? - "Береги себя"...
|
|
|
Сказали "Спасибо" neox-neox
|
|
|
21.08.2011, 18:30
|
|
Прописка
Регистрация: 27.10.2010
Сообщений: 133
Сказал спасибо: 24
Сказали Спасибо 53 раз(а) в 41 сообщении(ях)
|
Re: когда нужно volatile?
Сообщение от st_1
|
Некоторые недо- полу- СИ-компиляторы
|
но тут есть штука,CV не совсем не понимает volatile сейчас экспериментирую ![Улыбка](images/smilies/icon_smile.gif) в CV забил следующие:
void Delay (int D ){
volatile int i;
for (i = 0; i ‹ D; i++){
continue;
}
}
int main(void){
DDRD=255;
while(1){
PORTD=255;
Delay(1000);
PORTD=0;
Delay(1000);
}
return 0;
}
смотрю в протеусе осцилогрофом _|-|_ положительный перейюд меандра равен 23.00ms а без volatile в задержке 11.00ms как это объяснить?
__________________
- Слово на "б" знаешь ? - ??? - "Береги себя"...
|
|
|
Сказали "Спасибо" neox-neox
|
|
|
21.08.2011, 18:42
|
|
Прописка
Регистрация: 26.01.2009
Сообщений: 249
Сказал спасибо: 23
Сказали Спасибо 102 раз(а) в 61 сообщении(ях)
|
Re: когда нужно volatile?
Сообщение от neox-neox
|
CV не совсем не понимает volatile сейчас экспериментирую
|
Вы не с того бока подходите к проблеме. Если Вам интересно поведение конкретного компилятора в отношении его приемов оптимизации, то Вам следует смотреть генерируемый им код. Только и всего. Никакого понимания квалификатора volatile Вам это не привьет. И то, как он проявляет себя в конкретном примере, - вопрос скорее к разработчикам CV.
Штука тут в другом: если по логике какая- то переменная должна быть volatile, то ее и нужно объявлять таковой вне зависимости от того, какой компилятор используется. Пройдет год или 2 - и выйдет новая версия CV с улучшенной оптимизаций, и Ваша программа начнет падать.
Конкретно о Вашем коде: надеюсь, Вы понимаете, что и с volatile и без него рассчитывать на точную задержку, построенную таким образом, не приходится.
|
|
|
Сказали "Спасибо" testerplus
|
|
|
21.08.2011, 18:43
|
|
Заблокирован
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
|
Re: Когда нужно volatile?
neox-neox
Подозреваю, что с volatile компилятор разместил переменную в ОЗУ, а без - в регистр... С CV не работаю... сам посмотреть не могу...
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 20:21.
|
|