CodeVisionAVR 2.60
01.02.2014, 23:21
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 06.08.2008
Адрес: Ярославль
Сообщений: 1,504
Сказал спасибо: 115
Сказали Спасибо 1,314 раз(а) в 548 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от tempora
|
Смешной вопрос. Неужто никогда не встречались с девайсами, чтение из регистра которых сопровождается некоторыми действиями в них?
|
Причём тут девайс? Я попросил процессор покурить немного.
Кстати, раз Вы здесь, объясните мне - что это?
|
Код:
|
for(; a==0; --a) TCNT0;
6c: 89 2b or r24, r25
6e: 09 f4 brne .+2 ; 0x72 ‹del+0x6›
70: 82 b7 in r24, 0x32 ; 50
72: 08 95 ret |
|
|
|
|
01.02.2014, 23:28
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 06.08.2008
Адрес: Ярославль
Сообщений: 1,504
Сказал спасибо: 115
Сказали Спасибо 1,314 раз(а) в 548 сообщении(ях)
|
Re: CodeVisionAVR 2.60
ЗЫ. Ответ утром утром посмотрю
|
|
|
|
01.02.2014, 23:34
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 10.01.2007
Сообщений: 3,411
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от olc0267
|
|
Причём тут девайс?
|
То есть как это "при чём"?! Вы это серьёзно?
Сообщение от olc0267
|
|
объясните мне - что это?
|
Это кусок листинга.
__________________
There's always more than one way to skin a cat.
|
|
|
|
02.02.2014, 03:53
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от olc0267
|
сделано.
Если добавлю ещё команду
|
Код:
|
for(; a==0; --a) TCNT0; |
( с точки зрения здравой логики - нахрена я обязан это делать?)
то получается
|
Почему компилятор так делает - понятно. TCNT0 - это регистр счётчика, который может быть изменён извне, он обязан его прочитать.
А вот на вопрос - зачем так выёживаться программисту - ответа нет.
Этим мне тоже CV нравится. Послушный и предсказуемый. К сожалению, код не особо оптимальный.
С другой стороны, можно написать по другому (для GCC):
|
PHP код:
|
void delay_ms(unsigned int ms)
{
unsigned int i;
for(i=ms; i; i--) _delay_ms(1);
}
|
вот ещё пример:
|
PHP код:
|
int main(void)
{
unsigned char a,b,c;
a = 255;
b = 2;
begin:
PORTA |= 1;
c = a / b;
TCNT0 = с;
PORTA &= ~1;
goto begin;
}
|
Умный компилятор сразу занесёт в TCNT0 число 127 (посчитанное на этапе компиляции).
|
|
|
|
02.02.2014, 13:01
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 06.08.2008
Адрес: Ярославль
Сообщений: 1,504
Сказал спасибо: 115
Сказали Спасибо 1,314 раз(а) в 548 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от tempora
|
|
То есть как это "при чём"?! Вы это серьёзно?
|
Аболютно серьёзно. Под девайсом я понимаю периферийное устройство. Зачем мне опрашивать счётчик, если я прошу центральный процессор сделать несколько холостых циклов?
Сообщение от tempora
|
|
Это кусок листинга.
|
-Что это, Бэрримор?
-Овсянка, сэр.
Я вижу. Но я просил сделать вот это
|
Код:
|
for(; a==0; --a) TCNT0; |
Но вместо этого компилятор сделал побитовое "или" двух регистров (причём, в одном из регистров - заведомо 0х0, т.е. на выходе операции то же самое, что и на входе), занёс в один из них число 50 (почему 50? откуда оно взялось?), и на этом закончил.
Я ещё могу понять, когда компилятор решит сумничать, и выкинет кусок неэффективной с его точки зрения программы. Но чтобы вот так... Если это не глюк, то что это? Ведь с точки зрения стандарта языка - опять всё верно.
|
Цитата:
|
|
Последний релиз был выпущен 20 января 2010 года, после чего разработка была заморожена. Прекращение разработки было объяснено разработчиком тем, что он в настоящее время занят в разработке Atmel Studio[4], практически идентичный по набору входящих в него программ и включивший в себя большинство наработок WinAVR
|
http://ru.wikipedia.org/wiki/WinAVR
Последний раз редактировалось olc0267; 02.02.2014 в 13:17.
|
|
|
|
02.02.2014, 13:06
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 06.08.2008
Адрес: Ярославль
Сообщений: 1,504
Сказал спасибо: 115
Сказали Спасибо 1,314 раз(а) в 548 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от Godzilla82
|
Почему компилятор так делает - понятно. TCNT0 - это регистр счётчика, который может быть изменён извне, он обязан его прочитать.
|
Обязан, но не стал читать. См. мой предыдущий пост.
-Что это хлюпает в моём ботинке, Бэрримор?
-Овсянка, сэр.
-А что она там делает?
-Хлюпает, сэр.
Последний раз редактировалось olc0267; 02.02.2014 в 13:21.
|
|
|
|
02.02.2014, 13:32
|
|
|
Гражданин KAZUS.RUN
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от Godzilla82
|
Почему компилятор так делает - понятно. TCNT0 - это регистр счётчика, который может быть изменён извне, он обязан его прочитать.
А вот на вопрос - зачем так выёживаться программисту - ответа нет.
|
TCNT0 объявлена как volatile в хидере на конкретный процессор. Прикольно правда? И именно поэтому компилятор обязан её прочитать.
На вопрос зачем так выёживаться программисту, приведу пример:
Возьмите свою программную задержку. И выполните (даже с volatile) на нескольких компах. Подсказываю: размер задержки будет зависеть от производительности проца и, что ещё более печально от размера конвеера, кэша и так далее. Время моей задержки будет меняться в меньшей степени и будет примерно 1мкс на одно обращение к периферии. На старших моделях ARM и на некоторых процах размер задержки второго типа будет более предсказуем. Код генерируемый компилятором тоже будет более предсказуем. С IBM компов как-то и понеслось ...
====
Суть в другом. Когда вы поймёте смысл работы компилятора более глубинно, то вы не будете "догадываться" что и как делать, а будете чётко "понимать".
Вот например olc0267. У вас полная чехарда в голове. Вы "думаете", что что-то понимаете, но это не так. Не обижайтесь. Того что написано, вполне достаточно. Без эмоций и обид ещё раз перечитайте посты, вдумайтесь, пропустите через себя. И в какой-то момент, всё встанет на место у вас в голове.
Буду на работе я скину варианты как компилит IAR. А то у вас какое-то непонятное убеждение, что компилятор должен в точности выполнять пооператорно то, что вы пишете. Это не так. И так никогда не было. Даже начиная с какого-нибудь фортрана, я помню как меня ставил в тупик компилятор. Я ему помню пишу что-нибудь типа for(i=0;i‹15;i++) а он реально Инициализирует переменную 15 и делает декремент. Это меня убивало. Кстати думаю на x51 такое нормальный компилятор будет вытворять. Так как DJNZ команда эффективнее.
|
|
|
|
02.02.2014, 14:33
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от olc0267
|
|
Но вместо этого компилятор сделал побитовое "или" двух регистров (причём, в одном из регистров - заведомо 0х0, т.е. на выходе операции то же самое, что и на входе)
|
Т.е. проверил число на "ноль" (а ЧТО он ещё должен был сделать? КАК сделать, возможны варианты.)
Сообщение от olc0267
|
|
занёс в один из них число 50 (почему 50? откуда оно взялось?), и на этом закончил.
|
Полистайте наконец даташит на МК.
Возможно поймёте разницу между LD и IN.
Также возможно поймёте, почему именно 50.
|
|
|
|
02.02.2014, 15:14
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 06.08.2008
Адрес: Ярославль
Сообщений: 1,504
Сказал спасибо: 115
Сказали Спасибо 1,314 раз(а) в 548 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от omercury
|
|
Т.е. проверил число на "ноль"
|
OK. С этим могу, поморщившись, согласиться. Но согласитесь - как-то странно он делает это. Когда в функции main выполняется это
|
Код:
|
74: 84 e6 ldi r24, 0x64 ; 100
76: 90 e0 ldi r25, 0x00 ; 0 |
то нормальный человек должен предположить, что в r24 грузится младший байт, а в r25 - старший от числа 0х0064. Ведь аргумент функции del объявлен как int. Но зачем передавать ноль через регистр, и тратить на это время и память? Почему не сделать ORI с константой?
Сообщение от omercury
|
Полистайте наконец даташит на МК.
Возможно поймёте разницу между LD и IN.
Также возможно поймёте, почему именно 50.
|
С этим согласен. Тут я маху дал. Это и есть чтение TCNT0. Но где же цикл с декрементом?
Последний раз редактировалось olc0267; 02.02.2014 в 15:27.
|
|
|
|
02.02.2014, 15:39
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от olc0267
|
|
то нормальный человек должен предположить, что в r24 грузится младший байт, а в r25 - старший от числа 0х0064. Ведь аргумент функции del объявлен как int. Но зачем передавать ноль через регистр, и тратить на это время и память? Почему не сделать ORI с константой?
|
Потому, что сравнение старшего и младшего даст "0" только в одном случае - если оба байта равны нулю. Это самое короткое по размеру и времени представление.
Сообщение от olc0267
|
|
Но где же цикл с декрементом?
|
|
Код:
|
for(; a==0; --a) TCNT0; |
Откуда ж ему взяться-то?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 03:09.
|
|