Отговори на тема  [ 9 мнения ] 
CCS и ASM - помощ 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Сря Дек 06, 2006 9:05 pm
Мнения: 92
Местоположение: София
Мнение CCS и ASM - помощ
Езика е С.Увеличавам с единица променлива
Код:
int temp=0;
temp=temp+1;
delay_us(temp);

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


Последна промяна million на Пон Авг 13, 2007 3:34 pm, променена общо 1 път



Пон Авг 13, 2007 2:42 pm
Профил
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Сря Дек 06, 2006 9:05 pm
Мнения: 92
Местоположение: София
Мнение 
:idea: замених
Код:
delay_us(temp);

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

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


Пон Авг 13, 2007 3:12 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Пет Юни 29, 2007 10:59 pm
Мнения: 113
Мнение 
Опитай с оптимизатора на С-то. Най-вероятно нямаш оптимизация. Не знам този компилатор дали има оптимизация и по размер и по скорост на изпълнение. Ако не става, опитай да изчислиш не инструкциите, а циклите при изпълнение. Ако и така не става ти предлагам да зарежеш всичко и да глътнеш една водка. :D


Пон Авг 13, 2007 5:37 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение 
Ммм малко не виждам връзка м-у двата кода, в С кода викаш подпрограма за задръжка, в случая 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.


Пон Авг 13, 2007 8:43 pm
Профил
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Сря Дек 06, 2006 9:05 pm
Мнения: 92
Местоположение: София
Мнение 
Да Тони, мерси! decfsz в комплект с goto са 3инструкции, така че, няма начин как да стане по малко. Е сигурно има де, но аз не го знам. Примерно с променлива да се указва колко NOP да се изпълнят, но как? как се прави в С закъснение по малко от 1us?


Вто Авг 14, 2007 1:05 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 17, 2005 5:07 pm
Мнения: 813
Местоположение: Сливен
Мнение 
million написа:
в С закъснение по малко от 1us?


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


Вто Авг 14, 2007 1:12 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Сря Дек 06, 2006 9:05 pm
Мнения: 92
Местоположение: София
Мнение 
delay_cycles (count)
Parameters:
count - a constant 1-255

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


Вто Авг 14, 2007 1:34 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 17, 2005 5:07 pm
Мнения: 813
Местоположение: Сливен
Мнение 
million написа:
Значи ли това че не мога да задам променлива,


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


Вто Авг 14, 2007 1:51 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Сря Дек 06, 2006 9:05 pm
Мнения: 92
Местоположение: София
Мнение 
Благодаря :) Стана :)


Вто Авг 14, 2007 5:01 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 9 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 4 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни