| Автор |
Съобщение |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
 Оптимизация на една функция
Пиша една програмка за 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 служи за елиминиране на излишните нули пред изписваното число.
|
| Пон Мар 07, 2005 3:30 pm |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Това съм го писал нейде на АСМ, обаче е в нас...за колко разряда ти трябва?
|
| Пон Мар 07, 2005 3:56 pm |
|
 |
|
danov
Ранг: Минаващ
Регистриран на: Вто Ное 16, 2004 4:43 pm Мнения: 85 Местоположение: София
|
Не съм сигурен, но мисля, че това ще намали броя процесорни цикли за сметка на по-дълга функция. Просто се пропуска цикъла и излишните деления на delitel. Освен това мисля, че твоята функция при подаване на number = 0 няма да изведе нищо.
|
| Пон Мар 07, 2005 4:02 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
Последно ми трябват 25 или 26 цикъла по малко. Сметнах го от симулацията в протеус.
Predator_MF и аз прегледах асм кода дето го дава компилатора но ако се спазва алгоритъма на C кода могат да се спестят по мое виждане 4 баита
което така като гледам са или 6 или 9 цикъла по малко. Явно трябва оптимизация в алгоритъма. А става дума за unsigned int - 16бит което ще рече 5 разряда.
danov Така обаче не ми стига мястото в флаша. А е възможно и да стане, деленето гълта доста ресурси. Ако няма други идеи ще пробвам да изнамеря откъде да спестя още някои баит. А показването на нула съм го ракарал съзнателно за оптимизация. Просто показанията в случая са винаги над 200.
А няма ли някакъв опростен алгоритъм за делене на десет? Аз лично не успях да измисля но това не означава че няма.
|
| Пон Мар 07, 2005 8:49 pm |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Ами утре ще си ти дам кода си...нямам нет в нас
А на въпроса ти за делене на 10, мисля че имаше някаква "бърза" функция в CCS-а, така и не и обърнах внимание...и нея ще огледам.
|
| Пон Мар 07, 2005 8:53 pm |
|
 |
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 4:11 pm Мнения: 3750 Местоположение: София
|
Колко цикъла е в момента? Мога да се опитам да направя нещо по-така, ама ми трябва база за сравнение.
|
| Пон Мар 07, 2005 8:54 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
Бях го сметнал от симулацията но къде го записах ..........
Ако някой не изнамери някаква бърза функция за делене на 10 ще го сметна пак.
То маи само в това делене има някакъв хляб за оптимизация
|
| Вто Мар 08, 2005 3:03 am |
|
 |
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 12:32 pm Мнения: 8382 Местоположение: София
|
Разгледай ф-ята itoa(), или даже я използвай направо.
|
| Вто Мар 08, 2005 10:20 am |
|
 |
|
danov
Ранг: Минаващ
Регистриран на: Вто Ное 16, 2004 4:43 pm Мнения: 85 Местоположение: София
|
|
| Вто Мар 08, 2005 12:49 pm |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Във itoa() и atoi() на CCS-а забелязах, че трябва да напишеш каква ти е основата на числото - 10 или 16 (десетично или шеснайсетично). По default е 10-ично. Според мен са доста бавни.
Аз за по-бърз начин за делене на 10 не се сетих...В момента се сещам само за два начина:
1. Вадиш 10 от числото, докато получиш число по-малко от 10.
2. Ако разделиш числото на две, след това повтаряш (1.), само че вадиш по 5, няма ли да имаш почти наполовина цикли 
|
| Вто Мар 08, 2005 3:44 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
Данов това стана супер,идеята ти да се започне обратно работи. ето това е оптимизирания вариант. И нула също изписва.
goto съм използвал защото под Hi-Tech така винаги дава най оптималния код. Пък сигурно важи и за други компилатори като не им оставиш място за фантазии.
Реконструктор. деиствително готовите функции се оказаха бавни.
Predator_MF това с изваждането би било много бавно при голямо число. Явно няма начин за бързо делене на 10.
Пък на мен ще ми е за урок да не бързам да купувам преди да съм готов с софта 
|
| Вто Мар 08, 2005 4:17 pm |
|
 |
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 4:11 pm Мнения: 3750 Местоположение: София
|
това не е ли по-бързо:
tmp1 = number;
number = tmp1 / 10;
tmp = tmp1 - number * 10;
имаш умножение вместо деление ( остатък ) ?
|
| Вто Мар 08, 2005 4:36 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
долу горе същото бързодеистеие но с 9 баита по дълга и 2 баита рам повече
|
| Вто Мар 08, 2005 5:10 pm |
|
 |
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 4:11 pm Мнения: 3750 Местоположение: София
|
жалко. На PIC18 вероятно не би било така, но тук явно не се почели.
|
| Вто Мар 08, 2005 5:20 pm |
|
 |
|
danov
Ранг: Минаващ
Регистриран на: Вто Ное 16, 2004 4:43 pm Мнения: 85 Местоположение: София
|
Недей така, нека има хляб и за програмистите 
|
| Вто Мар 08, 2005 5:28 pm |
|
|