02.02.2014, 15:42
|
#231
|
Почётный гражданин KAZUS.RU
Регистрация: 06.08.2008
Адрес: Ярославль
Сообщений: 1,505
Сказал спасибо: 115
Сказали Спасибо 1,314 раз(а) в 548 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от SasaVitebsk
|
Я ему помню пишу что-нибудь типа for(i=0;i‹15;i++) а он реально Инициализирует переменную 15 и делает декремент. Это меня убивало. Кстати думаю на x51 такое нормальный компилятор будет вытворять. Так как DJNZ команда эффективнее.
|
Такую оптимизацию можно понять. Компилятор может делать всё что угодно, если код остаётся работоспособным. Но глумиться над программистом как в примере, который я привёл выше - кто ему дал такое право?
|
|
|
|
02.02.2014, 15:46
|
#232
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,443
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от SasaVitebsk
|
TCNT0 объявлена как volatile в хидере на конкретный процессор. Прикольно правда?
|
Обычное явление. Это же не CV, поэтому volatile - стандартный приём.
Сообщение от SasaVitebsk
|
На вопрос зачем так выёживаться программисту, приведу пример:
Возьмите свою программную задержку. И выполните (даже с volatile) на нескольких компах. Подсказываю: размер задержки будет зависеть от производительности проца и ...
|
Какая разница - сколько тактов. Я просил процессор выполнить пустой цикл столько-то раз. Я не просил процессор курить ровно "столько-то".
Когда мне нужна будет чёткая задержка во столько-то мс, я буду думать как это реализовать учитывая среду, в которой выполняется программа.
Например на PC все приёмы, реализованные для AVR не прокатят (речь идёт о реализации задержки, скажем на 2 мкс). Даже если откомпилируются. Зачем об этом говорить?
|
|
|
|
02.02.2014, 15:48
|
#233
|
Почётный гражданин KAZUS.RU
Регистрация: 06.08.2008
Адрес: Ярославль
Сообщений: 1,505
Сказал спасибо: 115
Сказали Спасибо 1,314 раз(а) в 548 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от omercury
|
Код:
|
for(; a==0; --a) TCNT0; |
Откуда ж ему взяться-то?
|
А что, в новом стандарте Си for - уже не цикл? Извиняйте, не знал.
CV, наверное, тоже не знает, если сделал это
Код:
|
_del:
; 0000 001C for(; a==0; --a) TCNT0;
; a -› Y+0
_0x4:
000048 81e8 LD R30,Y
000049 81f9 LDD R31,Y+1
00004a 9730 SBIW R30,0
00004b f439 BRNE _0x5
00004c b7e2 IN R30,0x32
00004d 81e8 LD R30,Y
00004e 81f9 LDD R31,Y+1
00004f 9731 SBIW R30,1
000050 83e8 ST Y,R30
000051 83f9 STD Y+1,R31
000052 cff5 RJMP _0x4
_0x5:
; 0000 001D }
000053 9622 ADIW R28,2
000054 9508 RET |
Последний раз редактировалось olc0267; 02.02.2014 в 15:51.
|
|
|
|
02.02.2014, 16:03
|
#234
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,443
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от olc0267
|
Такую оптимизацию можно понять. Компилятор может делать всё что угодно, если код остаётся работоспособным.
|
Есть много случаев, в которых важно, с 15 или с 0 начинается выполнение цикла. Думаю, что GCC далеко не всегда так поступает.
Приведите исходный текст программы целиком.
PHP код:
|
for(; a==0; --a) TCNT0;
|
PHP код:
|
#include ‹avr\io.h›
int main(void)
{
unsigned char a;
a = 255;
for(; a!=0; --a) TCNT0;
begin:
goto begin;
}
|
Код:
|
int main(void)
{
84: 8f ef ldi r24, 0xFF ; 255
unsigned char a;
a = 255;
for(; a!=0; --a) TCNT0;
86: 92 b7 in r25, 0x32 ; 50
88: 81 50 subi r24, 0x01 ; 1
8a: e9 f7 brne .-6 ; 0x86 ‹main+0x2›
8c: ff cf rjmp .-2 ; 0x8c ‹main+0x8› |
|
|
|
|
02.02.2014, 16:10
|
#235
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,443
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от olc0267
|
А что, в новом стандарте Си for - уже не цикл?
|
Ну если мыслить очень широко, то у вас простое сравнение, которое в случае изначального равенства переменной a нулю выполнится 1 раз.
|
|
|
|
02.02.2014, 16:35
|
#236
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от olc0267
|
Такую оптимизацию можно понять. Компилятор может делать всё что угодно, если код остаётся работоспособным. Но глумиться над программистом как в примере, который я привёл выше - кто ему дал такое право?
|
Вы полностью переворачиваете истину с ног на голову. Когда компилятор выкинул пустой цикл, то программа осталась работоспособной. В пустом цикле НИЧЕГО не делалось! И дальнейший ход программы не зависел от результатов работы цикла. Вы пишете, что если бы хотели сделать задержку то сделали бы её. Так сделайте. Вот и весь вам ответ.
Если я прочитаю данные в какую-то переменную, а дальше эту переменную использовать не буду, то компилятор это выкинет. И правильно сделает. Если я размещу в какой-то переменной значение, а потом использую эту переменную 1 раз (к примеру), то он выкинет переменную, а значение подставит прямо по тексту программы и так далее ...
Не надо ругать компилятор, коли вы не смогли донести до него алгоритм. Это не его вина а ваша. Вы привязываетесь к конкретной реализации но не понимаете глобальных вещей.
Например сейчас молодых программистов обучают правильному написанию что-нибудь типа того:
uint8_t GetTCNT0(void) {return(TCNT0);}
Откройте любой учебник объектно ориентированного программирования и посмотрите.. Так вот исходя из вашей логики, компилятор должен создать п/п в ней разместить чтение TCNT0 и в нужном месте обеспечить вызов. Но грамотный компилятор просто в месте вызова GetTCNT0 просто вставит чтение TCNT0. Вам кажется это глупость?
Поймите, все ч/з это проходили. Сначала пишешь на асме, потом на макро. И ругаешь компиляторы за неэффективность. Потом анализируешь и начинаешь понимать, что не так уж и неэффективно, но зато удобнее. Потом до тебя доходит, что ты можешь компилятору более точно детализировать задачу и код становится значительно эффективнее. Потом понимаешь, что детализация с привязкой к конкретному решению (например к типу компилятора, типу процессора), приводит к кривым результатам, если условия поменялись. Далее выбираешь чем жертвовать.
Чем выше уровень программирования тем ниже результирующая эффективность, но зато прозрачнее проект. Прога на си менее эффективна чем на асме. А применение ОС снижает производительность и съедает дополнительные ресурсы. С++ менее эффективен чем С. И так далее.
|
|
|
|
02.02.2014, 17:34
|
#237
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,443
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от SasaVitebsk
|
Например сейчас молодых программистов обучают правильному написанию что-нибудь типа того:
uint8_t GetTCNT0(void) {return(TCNT0);}
Откройте любой учебник объектно ориентированного программирования и посмотрите..
|
Вот это ужасно. Программистов учат красиво (честно говоря, не вижу никакой красоты) писать на си, совершенно не задумываяь об эффективности кода.
По сути, всё ложиться на плечи компилятора. Хорошо, если компилятор в нужном месте подставит, а если нет?
Кстати, Borland C++ для PC не выкидывает пустой цикл.
Программист должен знать, что означает вызов процедуры, примерный расход тактов процессора и стека при этом. И писать оптимально, не полагаясь на компилятор.
А то получается, что раньше влезало в 48 к памяти синклера, сейчас на DVD с трудом помещается.
|
|
|
|
02.02.2014, 19:23
|
#238
|
Почётный гражданин KAZUS.RU
Регистрация: 06.08.2008
Адрес: Ярославль
Сообщений: 1,505
Сказал спасибо: 115
Сказали Спасибо 1,314 раз(а) в 548 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Цитата:
|
Например сейчас молодых программистов обучают правильному написанию что-нибудь типа того:
uint8_t GetTCNT0(void) {return(TCNT0);}
|
И правильно делают.
|
|
|
|
02.02.2014, 20:06
|
#239
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от olc0267
|
в одном из регистров - заведомо 0х0
|
Откуда это следует? Укажите в приведённом листинге инструкцию, обнуляющую хотя бы один регистр.
Сообщение от olc0267
|
занёс в один из них число 50
|
Нихрена себе, вы спутали - он прочитал из порта с адресом 50 (0x32), как ему было сказано.
Сообщение от olc0267
|
Обязан, но не стал читать. См. мой предыдущий пост.
|
А это что - "in r24, 0x32 " - не чтение разве?!
Сообщение от olc0267
|
Я ещё могу понять, когда компилятор решит сумничать,
|
Ошибаетесь. Не можете.
Сообщение от olc0267
|
Аболютно серьёзно.
|
Ясно. " Больше вопросов не имею." ©
_____________________
Какие великие люди стоят на страже "репутации" CV! ![Смешно](images/smilies/icon_lol.gif)
И это неспроста.
__________________
There's always more than one way to skin a cat.
|
|
|
|
02.02.2014, 21:13
|
#240
|
Гражданин KAZUS.RU
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от SasaVitebsk
|
Прога на си менее эффективна чем на асме. А применение ОС снижает производительность и съедает дополнительные ресурсы. С++ менее эффективен чем С. И так далее.
|
Весьма спорные утверждения - всё зависит от ситуации и критерия эффективности.
››на си менее эффективна чем на асме
Если не учитывать расходы на поддержку и модификацию(не говоря уже о переносе на другую архитектуру).
››применение ОС снижает производительность
SuperLoop эффективнее? И прграмма такая же простая при этом?
››С++ менее эффективен чем С
C чего бы это? вовсе не факт...
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 17:20.
|
|