Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум


 
Опции темы

CodeVisionAVR 2.60

Непрочитано 01.02.2014, 23:21  
olc0267
Почётный гражданин KAZUS.RUN
 
Регистрация: 06.08.2008
Адрес: Ярославль
Сообщений: 1,504
Сказал спасибо: 115
Сказали Спасибо 1,314 раз(а) в 548 сообщении(ях)
olc0267 на пути к лучшему
По умолчанию 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
Реклама:
olc0267 вне форума  
Непрочитано 01.02.2014, 23:28  
olc0267
Почётный гражданин KAZUS.RUN
 
Регистрация: 06.08.2008
Адрес: Ярославль
Сообщений: 1,504
Сказал спасибо: 115
Сказали Спасибо 1,314 раз(а) в 548 сообщении(ях)
olc0267 на пути к лучшему
По умолчанию Re: CodeVisionAVR 2.60

ЗЫ. Ответ утром утром посмотрю
olc0267 вне форума  
Непрочитано 01.02.2014, 23:34  
tempora
Почётный гражданин KAZUS.RUN
 
Регистрация: 10.01.2007
Сообщений: 3,411
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
tempora на пути к лучшему
По умолчанию Re: CodeVisionAVR 2.60

Сообщение от olc0267 Посмотреть сообщение
Причём тут девайс?
То есть как это "при чём"?! Вы это серьёзно?
Сообщение от olc0267 Посмотреть сообщение
объясните мне - что это?
Это кусок листинга.
__________________
There's always more than one way to skin a cat.
tempora вне форума  
Непрочитано 02.02.2014, 03:53  
Godzilla82
Почётный гражданин KAZUS.RUN
 
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение 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 (посчитанное на этапе компиляции).
Godzilla82 вне форума  
Непрочитано 02.02.2014, 13:01  
olc0267
Почётный гражданин KAZUS.RUN
 
Регистрация: 06.08.2008
Адрес: Ярославль
Сообщений: 1,504
Сказал спасибо: 115
Сказали Спасибо 1,314 раз(а) в 548 сообщении(ях)
olc0267 на пути к лучшему
По умолчанию 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.
olc0267 вне форума  
Непрочитано 02.02.2014, 13:06  
olc0267
Почётный гражданин KAZUS.RUN
 
Регистрация: 06.08.2008
Адрес: Ярославль
Сообщений: 1,504
Сказал спасибо: 115
Сказали Спасибо 1,314 раз(а) в 548 сообщении(ях)
olc0267 на пути к лучшему
По умолчанию Re: CodeVisionAVR 2.60

Сообщение от Godzilla82 Посмотреть сообщение
Почему компилятор так делает - понятно. TCNT0 - это регистр счётчика, который может быть изменён извне, он обязан его прочитать.
Обязан, но не стал читать. См. мой предыдущий пост.

-Что это хлюпает в моём ботинке, Бэрримор?
-Овсянка, сэр.
-А что она там делает?
-Хлюпает, сэр.

Последний раз редактировалось olc0267; 02.02.2014 в 13:21.
olc0267 вне форума  
Непрочитано 02.02.2014, 13:32  
SasaVitebsk
Гражданин KAZUS.RUN
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: CodeVisionAVR 2.60

Сообщение от Godzilla82 Посмотреть сообщение
Почему компилятор так делает - понятно. TCNT0 - это регистр счётчика, который может быть изменён извне, он обязан его прочитать.
А вот на вопрос - зачем так выёживаться программисту - ответа нет.
TCNT0 объявлена как volatile в хидере на конкретный процессор. Прикольно правда? И именно поэтому компилятор обязан её прочитать.
На вопрос зачем так выёживаться программисту, приведу пример:
Возьмите свою программную задержку. И выполните (даже с volatile) на нескольких компах. Подсказываю: размер задержки будет зависеть от производительности проца и, что ещё более печально от размера конвеера, кэша и так далее. Время моей задержки будет меняться в меньшей степени и будет примерно 1мкс на одно обращение к периферии. На старших моделях ARM и на некоторых процах размер задержки второго типа будет более предсказуем. Код генерируемый компилятором тоже будет более предсказуем. С IBM компов как-то и понеслось ...
====
Суть в другом. Когда вы поймёте смысл работы компилятора более глубинно, то вы не будете "догадываться" что и как делать, а будете чётко "понимать".

Вот например olc0267. У вас полная чехарда в голове. Вы "думаете", что что-то понимаете, но это не так. Не обижайтесь. Того что написано, вполне достаточно. Без эмоций и обид ещё раз перечитайте посты, вдумайтесь, пропустите через себя. И в какой-то момент, всё встанет на место у вас в голове.
Буду на работе я скину варианты как компилит IAR. А то у вас какое-то непонятное убеждение, что компилятор должен в точности выполнять пооператорно то, что вы пишете. Это не так. И так никогда не было. Даже начиная с какого-нибудь фортрана, я помню как меня ставил в тупик компилятор. Я ему помню пишу что-нибудь типа for(i=0;i‹15;i++) а он реально Инициализирует переменную 15 и делает декремент. Это меня убивало. Кстати думаю на x51 такое нормальный компилятор будет вытворять. Так как DJNZ команда эффективнее.
SasaVitebsk вне форума  
Непрочитано 02.02.2014, 14:33  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: CodeVisionAVR 2.60

Сообщение от olc0267 Посмотреть сообщение
Но вместо этого компилятор сделал побитовое "или" двух регистров (причём, в одном из регистров - заведомо 0х0, т.е. на выходе операции то же самое, что и на входе)
Т.е. проверил число на "ноль" (а ЧТО он ещё должен был сделать? КАК сделать, возможны варианты.)

Сообщение от olc0267 Посмотреть сообщение
занёс в один из них число 50 (почему 50? откуда оно взялось?), и на этом закончил.
Полистайте наконец даташит на МК.
Возможно поймёте разницу между LD и IN.
Также возможно поймёте, почему именно 50.
omercury вне форума  
Непрочитано 02.02.2014, 15:14  
olc0267
Почётный гражданин KAZUS.RUN
 
Регистрация: 06.08.2008
Адрес: Ярославль
Сообщений: 1,504
Сказал спасибо: 115
Сказали Спасибо 1,314 раз(а) в 548 сообщении(ях)
olc0267 на пути к лучшему
По умолчанию 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.
olc0267 вне форума  
Непрочитано 02.02.2014, 15:39  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: CodeVisionAVR 2.60

Сообщение от olc0267 Посмотреть сообщение
то нормальный человек должен предположить, что в r24 грузится младший байт, а в r25 - старший от числа 0х0064. Ведь аргумент функции del объявлен как int. Но зачем передавать ноль через регистр, и тратить на это время и память? Почему не сделать ORI с константой?
Потому, что сравнение старшего и младшего даст "0" только в одном случае - если оба байта равны нулю. Это самое короткое по размеру и времени представление.

Сообщение от olc0267 Посмотреть сообщение
Но где же цикл с декрементом?
Код:
for(; a==0; --a) TCNT0;
Откуда ж ему взяться-то?
omercury вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
CodeVisionAVR selevo Embedd С 11 26.02.2016 22:16
SD и CodeVisionAvr 2.04.4a sersne Микроконтроллеры, АЦП, память и т.д 29 24.03.2010 18:39
CodeVisionAVR V2.03.2 dimonbest Микроконтроллеры, АЦП, память и т.д 253 29.09.2009 22:37
New CodeVisionAVR 1.25.8 dimonbest Микроконтроллеры, АЦП, память и т.д 15 07.02.2008 12:56
Help CodeVisionAVR Serg79 Микроконтроллеры, АЦП, память и т.д 3 15.12.2005 23:32


Часовой пояс GMT +4, время: 23:08.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.