| Микроконтролери и електроника 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 - помощ | |||||||||
Езика е С.Увеличавам с единица променлива
Изпълнява се за 5 инструкции. Същото нещо в Асемблер - 2 инструкции. Някой има ли идея откъде идава тази огромна разлика и как да я оправя? |
||||||||||
| Автор: | million [ Пон Авг 13, 2007 3:12 pm ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
с
и сега станаха 3 инструкции. Няма ли начин да се сведат до 2 |
|||||||||||||||||||
| Автор: | Yanek [ Пон Авг 13, 2007 5:37 pm ] |
| Заглавие: | |
Опитай с оптимизатора на С-то. Най-вероятно нямаш оптимизация. Не знам този компилатор дали има оптимизация и по размер и по скорост на изпълнение. Ако не става, опитай да изчислиш не инструкциите, а циклите при изпълнение. Ако и така не става ти предлагам да зарежеш всичко и да глътнеш една водка. |
|
| Автор: | 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 ] | |||||||||
| Заглавие: | ||||||||||
Зависи от честотата на контролера но за 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 ] | |||||||||
| Заглавие: | ||||||||||
Да това значи . Не знам на колко МХЗ го караш процесора но на 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/ |
|