Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


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

ЗЫ. Ответ утром утром посмотрю
olc0267 вне форума   Ответить с цитированием
Непрочитано 01.02.2014, 23:34   #223
tempora
Почётный гражданин KAZUS.RU
 
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 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   #224
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
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=msii--) _delay_ms(1);

вот ещё пример:
PHP код:
int main(void)
{
unsigned char a,b,c;
255;
2;
begin:
PORTA |= 1;
b;
TCNT0 с;
PORTA &= ~1;
goto 
begin;

Умный компилятор сразу занесёт в TCNT0 число 127 (посчитанное на этапе компиляции).
Godzilla82 вне форума   Ответить с цитированием
Непрочитано 02.02.2014, 13:01   #225
olc0267
Почётный гражданин KAZUS.RU
 
Регистрация: 06.08.2008
Адрес: Ярославль
Сообщений: 1,505
Сказал спасибо: 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   #226
olc0267
Почётный гражданин KAZUS.RU
 
Регистрация: 06.08.2008
Адрес: Ярославль
Сообщений: 1,505
Сказал спасибо: 115
Сказали Спасибо 1,314 раз(а) в 548 сообщении(ях)
olc0267 на пути к лучшему
По умолчанию Re: CodeVisionAVR 2.60

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

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

Последний раз редактировалось olc0267; 02.02.2014 в 13:21.
olc0267 вне форума   Ответить с цитированием
Непрочитано 02.02.2014, 13:32   #227
SasaVitebsk
Гражданин KAZUS.RU
 
Регистрация: 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   #228
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: CodeVisionAVR 2.60

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

Сообщение от olc0267 Посмотреть сообщение
занёс в один из них число 50 (почему 50? откуда оно взялось?), и на этом закончил.
Полистайте наконец даташит на МК.
Возможно поймёте разницу между LD и IN.
Также возможно поймёте, почему именно 50.
omercury вне форума   Ответить с цитированием
Непрочитано 02.02.2014, 15:14   #229
olc0267
Почётный гражданин KAZUS.RU
 
Регистрация: 06.08.2008
Адрес: Ярославль
Сообщений: 1,505
Сказал спасибо: 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   #230
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
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, время: 02:14.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot