23.05.2009, 21:29
|
#581
|
Частый гость
Регистрация: 05.05.2009
Сообщений: 29
Сказал спасибо: 3
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Мда ... четыре книги перекопал, нашел один пример и тот работать отказался ... а до Кернигана и Ричи руки не дошли!
Всё, ушел читать книгу .
|
|
|
|
23.05.2009, 23:54
|
#582
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,268 раз(а) в 1,563 сообщении(ях)
|
Приведите оба листинга асма .
С одним и тем же количеством разрядов .
Не может такого быть чтобы функция с делением была короче.
И причем здесь Паша Гайдук ?
Код пишете то вы а не он.И на счет ника это было последнее предупреждение.
Лучше уж КОШМАР .
__________________
Осторожно , злой кот
|
|
|
|
24.05.2009, 00:09
|
#583
|
Частый гость
Регистрация: 05.05.2009
Сообщений: 29
Сказал спасибо: 3
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
У меня не ассемблер ... я на С пытаюсь писать.
void Display_init()
{
//первый вариант
// Num1=Num2=0;
// while (Number ›= 100)
// {
// Number -= 100;
// Num1++;
// }
// while (Number ›= 10)
// {
// Number -= 10;
// Num2++;
// }
// Num3 = Number;
// Disp5 = Dig[Num1];
// Disp6 = Dig[Num2];
// Disp7 = Dig[Num3];
// 2 вариант
// Disp5[(Number/100)%10]; //сотни
// Disp6[(Number/10)%10]; //десятки
// Disp7[Number%10]; //единицы
}
Соответственно значки коментариев убрать по желанию
|
|
|
|
24.05.2009, 03:15
|
#584
|
Почётный гражданин KAZUS.RU
Регистрация: 07.05.2008
Адрес: Мурманск
Сообщений: 1,300
Сказал спасибо: 461
Сказали Спасибо 526 раз(а) в 273 сообщении(ях)
|
Код:
|
void display(void)
{
lcd_gotoxy(0,1);
lcd_putchar (Set_Hour/10%10+0x30);
lcd_putchar (Set_Hour%10+0x30);
lcd_putchar (delim[Set_Sec%2]);
lcd_putchar (Set_Mins/10%10+0x30);
lcd_putchar (Set_Mins%10+0x30);
lcd_putsf (" ");
lcd_putchar ((Set_Day/10)%10+0x30);
lcd_putchar (Set_Day%10+0x30);
lcd_putsf ("/");
lcd_putchar ((Set_Mon/10)%10+0x30);
lcd_putchar (Set_Mon%10+0x30);
lcd_putsf ("/");
lcd_putchar ((Set_Year/1000)%10+0x30);
lcd_putchar ((Set_Year/100)%10+0x30);
lcd_putchar ((Set_Year/10)%10+0x30);
lcd_putchar (Set_Year%10+0x30);
} |
Program size: 6392 words (12784 bytes), 78,0% of FLASH
Код:
|
void display(void)
{
lcd_gotoxy(0,1);
itoa2(Set_Hour);
lcd_putchar (asc[2]);
lcd_putchar (asc[3]);
lcd_putchar (delim[Set_Sec%2]);
itoa2(Set_Mins);
lcd_putchar (asc[2]);
lcd_putchar (asc[3]);
lcd_putsf (" ");
itoa2(Set_Day);
lcd_putchar (asc[2]);
lcd_putchar (asc[3]);
lcd_putsf ("/");
itoa2(Set_Mon);
lcd_putchar (asc[2]);
lcd_putchar (asc[3]);
lcd_putsf ("/");
itoa2(Set_Year);
lcd_putchar (asc[0]);
lcd_putchar (asc[1]);
lcd_putchar (asc[2]);
lcd_putchar (asc[3]);
} |
Program size: 6404 words (12808 bytes), 78,2% of FLASH
P.S. Не пойму, что с ником. Хотелось на русском Юра, т.к. yuriy, yurij, yuri - весь интернет переполнен и с цифровыми хвостами тоже, а тут печатными буквами ЮРА или IOPA и я уже с этим ником лет 5-6, если не больше. Никаких проблем не было.
|
|
|
|
24.05.2009, 03:26
|
#585
|
Почётный гражданин KAZUS.RU
Регистрация: 07.05.2008
Адрес: Мурманск
Сообщений: 1,300
Сказал спасибо: 461
Сказали Спасибо 526 раз(а) в 273 сообщении(ях)
|
Код:
|
_itoa2:
; 0000 0073 int step[]={1000,100,10,1};
; 0000 0074 unsigned int temp,val;
; 0000 0075 unsigned char i,atemp;
; 0000 0076 val=binval;
SBIW R28,8
LDI R30,LOW(232)
ST Y,R30
LDI R30,LOW(3)
STD Y+1,R30
LDI R30,LOW(100)
STD Y+2,R30
LDI R30,LOW(0)
STD Y+3,R30
LDI R30,LOW(10)
STD Y+4,R30
LDI R30,LOW(0)
STD Y+5,R30
LDI R30,LOW(1)
STD Y+6,R30
LDI R30,LOW(0)
STD Y+7,R30
CALL __SAVELOCR6
; binval -› Y+14
; step -› Y+6
; temp -› R16,R17
; val -› R18,R19
; i -› R21
; atemp -› R20
__GETWRS 18,19,14
; 0000 0077 for (i=0; i‹4; i++)
LDI R21,LOW(0)
_0x39:
CPI R21,4
BRSH _0x3A
; 0000 0078 {
; 0000 0079 temp=step[i];
MOV R30,R21
LDI R31,0
MOVW R26,R28
ADIW R26,6
LSL R30
ROL R31
ADD R26,R30
ADC R27,R31
LD R16,X+
LD R17,X
; 0000 007A atemp='0';
LDI R20,LOW(48)
; 0000 007B while(val ›= temp)
_0x3B:
__CPWRR 18,19,16,17
BRLO _0x3D
; 0000 007C {
; 0000 007D atemp++;
SUBI R20,-1
; 0000 007E val-=temp;
__SUBWRR 18,19,16,17
; 0000 007F }
RJMP _0x3B
_0x3D:
; 0000 0080 asc[i]=atemp;
MOV R30,R21
LDI R31,0
SUBI R30,LOW(-_asc)
SBCI R31,HIGH(-_asc)
ST Z,R20
; 0000 0081 }
SUBI R21,-1
RJMP _0x39
_0x3A:
; 0000 0082 }
CALL __LOADLOCR6
ADIW R28,16
RET
; |
|
|
|
|
24.05.2009, 09:53
|
#586
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,268 раз(а) в 1,563 сообщении(ях)
|
Надо выкладывать асм процедур . Ваша статистика всей программы ни о чем не говорит.
Компилируйте свое :
Код:
|
Disp5[(Number/100)%10]; //сотни
Disp6[(Number/10)%10]; //десятки
Disp7[Number%10]; //единицы |
и
Код:
|
unsigned char asc[3];
void itoa2(unsigned int binval)
{
int step[]={100,10,1};
unsigned int temp,val;
unsigned char i,atemp;
val=binval;
for (i=0; i‹3; i++)
{
temp=step[i];
atemp='0';
while(val ›= temp)
{
atemp++;
val-=temp;
}
asc[i]=atemp;
}
} |
Уберите свою программу и сделайте вывод на экран одного 3х значного числа.
__________________
Осторожно , злой кот
|
|
|
|
24.05.2009, 12:41
|
#587
|
Почётный гражданин KAZUS.RU
Регистрация: 07.05.2008
Адрес: Мурманск
Сообщений: 1,300
Сказал спасибо: 461
Сказали Спасибо 526 раз(а) в 273 сообщении(ях)
|
Почему, говорит: листинг программы один и тот же, но с введением новой функции itoa2 код увеличился, значит процессору нужно больше тактов на выполнение программы. К стати, на том форуме есть сноска на статью "Умножение без умножения", так автор ясно пишет, что современный компилятор самостоятельно находит слабые места при оптимизации и производит нужные действия. Например деление на 2, 4 и т.д., а бездумная борьба за "скорость" может привести не к понимаемости кода другими программистами.
И вообще, человек хотел написать вольтметр на атмеге32 - вывести на экран 3 циферки, 2-3% обьема памяти МК. Только начал программировать. Зачем так глубоко сразу лезть в дебри и биться об стенку над оптимизацией кода? Обнаружит слабое место - например: цифры будут помигивать, догадается оптимизировать код, не догадается - спросит.
|
|
|
|
24.05.2009, 16:11
|
#588
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Сообщение от IOPA4
|
И вообще, человек хотел написать вольтметр на атмеге32 - вывести на экран 3 циферки, 2-3% обьема памяти МК. Только начал программировать. Зачем так глубоко сразу лезть в дебри и биться об стенку над оптимизацией кода? Обнаружит слабое место - например: цифры будут помигивать, догадается оптимизировать код, не догадается - спросит.
|
А тут сложно советовать.. ведь каждый подходит со своей точки зрения...
Всё зависит от подхода прграммиста, и от того что хочет получить программист...
Если просто поигратся.. поучится...получить просто рабочий код то можно писать КАК УГОДНО.. ЛИШЬ БЫ РАБОТАЛО...
А если подходить серьёзно, писать функцию которая потом будет неоднократно применятся в дальнейшем.. то лучше потратить время и вылизать её по скорости и размеру, что бы в дальнейшем к ней не возрвщаться... а быть увереным что в ней уже нечего делать...
|
|
|
|
24.05.2009, 23:01
|
#589
|
Почётный гражданин KAZUS.RU
Регистрация: 07.05.2008
Адрес: Мурманск
Сообщений: 1,300
Сказал спасибо: 461
Сказали Спасибо 526 раз(а) в 273 сообщении(ях)
|
Сообщение от picavr
|
А тут сложно советовать.. ведь каждый подходит со своей точки зрения...
Всё зависит от подхода прграммиста, и от того что хочет получить программист...
Если просто поигратся.. поучится...получить просто рабочий код то можно писать КАК УГОДНО.. ЛИШЬ БЫ РАБОТАЛО...
А если подходить серьёзно, писать функцию которая потом будет неоднократно применятся в дальнейшем.. то лучше потратить время и вылизать её по скорости и размеру, что бы в дальнейшем к ней не возрвщаться... а быть увереным что в ней уже нечего делать...
|
1. С первым согласен на все 100
2. Здесь конкретный случай, человек впервые прикоснулся к МК и СИ.... и начал вылизывать функции до совершенства, даже не получив первого результата из примера с учебника. М-да. Я люблю тоже совершенство. Если на плате есть хоть одна не запланированная перемычка - я плату переделываю. И так до ... Со своим проектом "Астротаймер" я тоже вожусь уже не первый месяц. Просил на форуме знатоков помочь оптимизировать код - одни упреки: "Ты куда прешь", "Не суй свое рыло в то, что не знаешь". Перепробовал все варианты. Узнал, что МК не поддерживает команды деления. Попытался перевести всю матемматику к умножению - код вырос. Заменял деление сдвигом - опять вырос. Видно программисты CVAVR уже до меня все вылизали до совершенства. Да и как бы тогда выполнялось деление? Не делят же они втупую. Так, что вывод:
1. Человек убил 3 дня своего времени, не получив никакого результата, вылизывая то, что даже еще не "родил".
2. Мы убили три дня в бесполезных дискуссиях и тоже без результата.
А всего лишь нужна была помощь... обидно. Я ее тоже просил, но это был глас вопиющего... Чувствуется, что ребята волокут, но выбрана роль критиков. Жаль. И еще нерушимое братство, чуть пытаешься высунуться, сразу травят сворой.
|
|
|
|
24.05.2009, 23:29
|
#590
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,268 раз(а) в 1,563 сообщении(ях)
|
Ну если желаете натыкатся на пройденые нами грабли , всегда пожалуйста ...
Никогда не пойму тех кому помогают а они в ответ еше и огрызаются .
И насчет ника ,лучше сменить пока не поздно.
__________________
Осторожно , злой кот
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 12:28.
|
|