| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Оптимизация на една функция http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=455 |
Страница 1 от 2 |
| Автор: | Nikola Kirov [ Пон Мар 07, 2005 3:30 pm ] |
| Заглавие: | Оптимизация на една функция |
Пиша една програмка за PIC16F627A. Ама май идват прекалено много задачи за такъв дребен процесор. И бързодеиствието почти не стига и флаша също. А си купих вече процесорите и не върви да купвам 50 броя други процесори. Така че оптимизирам. С флаша почти успях но еи с тая функция тук която изписва в десетичен вид int na LCD дисплея не успях да се преборя,ако стане с десетина двадесет цикъла по малко времето за изпълнение ще тръгне всичко както изглежда. void lcd_PrintNumber(unsigned int number) { char tmp; unsigned int delitel = 10000; static bit start; start = 0; st: tmp = number / delitel; number = number % delitel; if (tmp || start ) { lcd_putch(tmp + 48) ; start = 1; } delitel = delitel / 10; if ( delitel ) goto st; } Някои да има идея за някаква оптимизация ? lcd_putch(char inp) е оптимизирана до максимум и времената за работа с дисплея са сведени до възможния минимум с конкретния дисплеи. бит start служи за елиминиране на излишните нули пред изписваното число. |
|
| Автор: | Predator_MF [ Пон Мар 07, 2005 3:56 pm ] |
| Заглавие: | |
Това съм го писал нейде на АСМ, обаче е в нас...за колко разряда ти трябва? |
|
| Автор: | danov [ Пон Мар 07, 2005 4:02 pm ] | |||||||||
| Заглавие: | ||||||||||
Не съм сигурен, но мисля, че това ще намали броя процесорни цикли за сметка на по-дълга функция. Просто се пропуска цикъла и излишните деления на delitel. Освен това мисля, че твоята функция при подаване на number = 0 няма да изведе нищо.
|
||||||||||
| Автор: | Nikola Kirov [ Пон Мар 07, 2005 8:49 pm ] |
| Заглавие: | |
Последно ми трябват 25 или 26 цикъла по малко. Сметнах го от симулацията в протеус. Predator_MF и аз прегледах асм кода дето го дава компилатора но ако се спазва алгоритъма на C кода могат да се спестят по мое виждане 4 баита което така като гледам са или 6 или 9 цикъла по малко. Явно трябва оптимизация в алгоритъма. А става дума за unsigned int - 16бит което ще рече 5 разряда. danov Така обаче не ми стига мястото в флаша. А е възможно и да стане, деленето гълта доста ресурси. Ако няма други идеи ще пробвам да изнамеря откъде да спестя още някои баит. А показването на нула съм го ракарал съзнателно за оптимизация. Просто показанията в случая са винаги над 200. А няма ли някакъв опростен алгоритъм за делене на десет? Аз лично не успях да измисля но това не означава че няма. |
|
| Автор: | Predator_MF [ Пон Мар 07, 2005 8:53 pm ] |
| Заглавие: | |
Ами утре ще си ти дам кода си...нямам нет в нас А на въпроса ти за делене на 10, мисля че имаше някаква "бърза" функция в CCS-а, така и не и обърнах внимание...и нея ще огледам. |
|
| Автор: | bateAz [ Пон Мар 07, 2005 8:54 pm ] |
| Заглавие: | |
Колко цикъла е в момента? Мога да се опитам да направя нещо по-така, ама ми трябва база за сравнение. |
|
| Автор: | Nikola Kirov [ Вто Мар 08, 2005 3:03 am ] |
| Заглавие: | |
Бях го сметнал от симулацията но къде го записах .......... Ако някой не изнамери някаква бърза функция за делене на 10 ще го сметна пак. То маи само в това делене има някакъв хляб за оптимизация |
|
| Автор: | Реконструктор [ Вто Мар 08, 2005 10:20 am ] |
| Заглавие: | |
Разгледай ф-ята itoa(), или даже я използвай направо. |
|
| Автор: | danov [ Вто Мар 08, 2005 12:49 pm ] | |||||||||
| Заглавие: | ||||||||||
Може да пробваш и това:
|
||||||||||
| Автор: | Predator_MF [ Вто Мар 08, 2005 3:44 pm ] |
| Заглавие: | |
Във itoa() и atoi() на CCS-а забелязах, че трябва да напишеш каква ти е основата на числото - 10 или 16 (десетично или шеснайсетично). По default е 10-ично. Според мен са доста бавни. Аз за по-бърз начин за делене на 10 не се сетих...В момента се сещам само за два начина: 1. Вадиш 10 от числото, докато получиш число по-малко от 10. 2. Ако разделиш числото на две, след това повтаряш (1.), само че вадиш по 5, няма ли да имаш почти наполовина цикли |
|
| Автор: | Nikola Kirov [ Вто Мар 08, 2005 4:17 pm ] | |||||||||
| Заглавие: | ||||||||||
Данов това стана супер,идеята ти да се започне обратно работи. ето това е оптимизирания вариант. И нула също изписва.
goto съм използвал защото под Hi-Tech така винаги дава най оптималния код. Пък сигурно важи и за други компилатори като не им оставиш място за фантазии. Реконструктор. деиствително готовите функции се оказаха бавни. Predator_MF това с изваждането би било много бавно при голямо число. Явно няма начин за бързо делене на 10. Пък на мен ще ми е за урок да не бързам да купувам преди да съм готов с софта |
||||||||||
| Автор: | bateAz [ Вто Мар 08, 2005 4:36 pm ] |
| Заглавие: | |
това не е ли по-бързо: tmp1 = number; number = tmp1 / 10; tmp = tmp1 - number * 10; имаш умножение вместо деление ( остатък ) ? |
|
| Автор: | Nikola Kirov [ Вто Мар 08, 2005 5:10 pm ] |
| Заглавие: | |
долу горе същото бързодеистеие но с 9 баита по дълга и 2 баита рам повече |
|
| Автор: | bateAz [ Вто Мар 08, 2005 5:20 pm ] |
| Заглавие: | |
жалко. На PIC18 вероятно не би било така, но тук явно не се почели. |
|
| Автор: | danov [ Вто Мар 08, 2005 5:28 pm ] | |||||||||
| Заглавие: | ||||||||||
Недей така, нека има хляб и за програмистите |
||||||||||
| Страница 1 от 2 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|