| Автор |
Съобщение |
|
million
Ранг: Минаващ
Регистриран на: Сря Дек 06, 2006 9:05 pm Мнения: 92 Местоположение: София
|
 CCS и ASM - помощ
Езика е С.Увеличавам с единица променлива
Изпълнява се за 5 инструкции.
Същото нещо в Асемблер - 2 инструкции.
Някой има ли идея откъде идава тази огромна разлика и как да я оправя?
Последна промяна million на Пон Авг 13, 2007 3:34 pm, променена общо 1 път
|
| Пон Авг 13, 2007 2:42 pm |
|
 |
|
million
Ранг: Минаващ
Регистриран на: Сря Дек 06, 2006 9:05 pm Мнения: 92 Местоположение: София
|
 замених
с
и сега станаха 3 инструкции. Няма ли начин да се сведат до 2 
|
| Пон Авг 13, 2007 3:12 pm |
|
 |
|
Yanek
Ранг: Новодошъл
Регистриран на: Пет Юни 29, 2007 10:59 pm Мнения: 113
|
Опитай с оптимизатора на С-то. Най-вероятно нямаш оптимизация. Не знам този компилатор дали има оптимизация и по размер и по скорост на изпълнение. Ако не става, опитай да изчислиш не инструкциите, а циклите при изпълнение. Ако и така не става ти предлагам да зарежеш всичко и да глътнеш една водка. 
|
| Пон Авг 13, 2007 5:37 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 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 |
|
 |
|
million
Ранг: Минаващ
Регистриран на: Сря Дек 06, 2006 9:05 pm Мнения: 92 Местоположение: София
|
Да Тони, мерси! decfsz в комплект с goto са 3инструкции, така че, няма начин как да стане по малко. Е сигурно има де, но аз не го знам. Примерно с променлива да се указва колко NOP да се изпълнят, но как? как се прави в С закъснение по малко от 1us?
|
| Вто Авг 14, 2007 1:05 pm |
|
 |
|
valioman
Ранг: Почетен член
Регистриран на: Съб Сеп 17, 2005 5:07 pm Мнения: 813 Местоположение: Сливен
|
Зависи от честотата на контролера но за CCS ползвай Delay_cycles(i)
като" i" ti e броя на исканите от теб NOP ове
|
| Вто Авг 14, 2007 1:12 pm |
|
 |
|
million
Ранг: Минаващ
Регистриран на: Сря Дек 06, 2006 9:05 pm Мнения: 92 Местоположение: София
|
delay_cycles (count)
Parameters:
count - a constant 1-255
Значи ли това че не мога да задам променлива, защото на мен ми трябва NOP-овете да са променливата TEMP?
|
| Вто Авг 14, 2007 1:34 pm |
|
 |
|
valioman
Ранг: Почетен член
Регистриран на: Съб Сеп 17, 2005 5:07 pm Мнения: 813 Местоположение: Сливен
|
Да това значи .
Не знам на колко МХЗ го караш процесора но на 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 |
|
 |
|
million
Ранг: Минаващ
Регистриран на: Сря Дек 06, 2006 9:05 pm Мнения: 92 Местоположение: София
|
Благодаря  Стана 
|
| Вто Авг 14, 2007 5:01 pm |
|
|