Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

CCS и ASM - помощ
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=4630
Страница 1 от 1

Автор:  million [ Пон Авг 13, 2007 2:42 pm ]
Заглавие:  CCS и ASM - помощ

Езика е С.Увеличавам с единица променлива
Код:
int temp=0;
temp=temp+1;
delay_us(temp);

Изпълнява се за 5 инструкции.
Същото нещо в Асемблер - 2 инструкции.
Някой има ли идея откъде идава тази огромна разлика и как да я оправя?

Автор:  million [ Пон Авг 13, 2007 3:12 pm ]
Заглавие: 

:idea: замених
Код:
delay_us(temp);

с
Код:
#asm
                      movlw   temp
                      movwf   oldtemp
   time_a:       decfsz   temp
                     goto   time_a
                     movlw         oldtemp
                     movwf   temp
#endasm

и сега станаха 3 инструкции. Няма ли начин да се сведат до 2 :(

Автор:  Yanek [ Пон Авг 13, 2007 5:37 pm ]
Заглавие: 

Опитай с оптимизатора на С-то. Най-вероятно нямаш оптимизация. Не знам този компилатор дали има оптимизация и по размер и по скорост на изпълнение. Ако не става, опитай да изчислиш не инструкциите, а циклите при изпълнение. Ако и така не става ти предлагам да зарежеш всичко и да глътнеш една водка. :D

Автор:  ToHu [ Пон Авг 13, 2007 8:43 pm ]
Заглавие: 

Ммм малко не виждам връзка м-у двата кода, в С кода викаш подпрограма за задръжка, в случая 1 uS, всъщност да правиш temp=temp+1 е напълно безсмислено при условие че преди това го правиш 0, т.е винаги викаш с темп=1, но това няма е друг въпрос. delay_us прави задръжка от 1 uS, а това което си написал като асемблер няма мнго общо, то задържа определен брой цикли.
Освен това кода е некоректен, temp не е литерал, а е променлива, в случая коректно е да се запише movfw temp. После не е написано никак икономично. Защо присвояваш temp на old_temp а после пък от old_temp го връщаш в temp ? Така само изразходваш процесоро време.

#asm
movfw temp
movwf old_temp
decfsz old_temp
goto $-1
#endasm

и обърни внимание колк оинструкции са нужни за изпълнение на decfsz в комплект с goto.

Автор:  million [ Вто Авг 14, 2007 1:05 pm ]
Заглавие: 

Да Тони, мерси! decfsz в комплект с goto са 3инструкции, така че, няма начин как да стане по малко. Е сигурно има де, но аз не го знам. Примерно с променлива да се указва колко NOP да се изпълнят, но как? как се прави в С закъснение по малко от 1us?

Автор:  valioman [ Вто Авг 14, 2007 1:12 pm ]
Заглавие: 

million написа:
в С закъснение по малко от 1us?


Зависи от честотата на контролера но за CCS ползвай Delay_cycles(i)
като" i" ti e броя на исканите от теб NOP ове

Автор:  million [ Вто Авг 14, 2007 1:34 pm ]
Заглавие: 

delay_cycles (count)
Parameters:
count - a constant 1-255

Значи ли това че не мога да задам променлива, защото на мен ми трябва NOP-овете да са променливата TEMP?

Автор:  valioman [ Вто Авг 14, 2007 1:51 pm ]
Заглавие: 

million написа:
Значи ли това че не мога да задам променлива,


Да това значи .
Не знам на колко МХЗ го караш процесора но на 20 МХЗ 5 NOP-a са 1 микросекунда ЗАтова направи си 5 процедури
примерно delay1 в която викаш delay_cycles(1) ; delay2 ->delay_cycles(2) i t.n. до 5
и после си оперирай със delay_us() в комбинация със някоя от горните 5 .
Не че не може и с for цикъл но нали знеш че е бавен .

Автор:  million [ Вто Авг 14, 2007 5:01 pm ]
Заглавие: 

Благодаря :) Стана :)

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/