Микроконтролери и електроника
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 няма да изведе нищо.
Код:
void lcd_PrintNumber (unsigned int number) {
char tmp;
char start;

   tmp = number / 10000;
   number %= 10000;
   start = tmp;
   if (start) {
      lcd_putch (tmp + 48);
   }

   tmp = number / 1000;
   number %= 1000;
   start += tmp;
   if (start) {
      lcd_putch (tmp + 48);
   }

   tmp = number / 100;
   number %= 100;
   start += tmp;
   if (start) {
      lcd_putch (tmp + 48);
   }

   tmp = number / 10;
   number %= 10;
   start += tmp;
   if (start) {
      lcd_putch (tmp + 48);
   }

   lcd_putch (number + 48);
}

Автор:  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 ]
Заглавие: 

Ами утре ще си ти дам кода си...нямам нет в нас :x
А на въпроса ти за делене на 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 ]
Заглавие: 

Може да пробваш и това:
Код:
void lcd_PrintNumber (unsigned int number) {
char a [5];
char i, tmp, start;

   i = 0;
   start = 0;
   while (number) {
      tmp = number % 10;
      number /= 10;
      start += tmp;
      if (start) a [i++] = tmp + 48;
   }
   i --;
   while (i >= 0) {
      lcd_putch (a [i--]);
   }
}

Автор:  Predator_MF [ Вто Мар 08, 2005 3:44 pm ]
Заглавие: 

Във itoa() и atoi() на CCS-а забелязах, че трябва да напишеш каква ти е основата на числото - 10 или 16 (десетично или шеснайсетично). По default е 10-ично. Според мен са доста бавни.
Аз за по-бърз начин за делене на 10 не се сетих...В момента се сещам само за два начина:
1. Вадиш 10 от числото, докато получиш число по-малко от 10.
2. Ако разделиш числото на две, след това повтаряш (1.), само че вадиш по 5, няма ли да имаш почти наполовина цикли :!: :?: :idea:

Автор:  Nikola Kirov [ Вто Мар 08, 2005 4:17 pm ]
Заглавие: 

Данов това стана супер,идеята ти да се започне обратно работи. ето това е оптимизирания вариант. И нула също изписва.

Код:
void lcd_PrintNumber (unsigned int number)
{
   char i,tmp;
   char a [5];

   i = 0;
wl:
    tmp    = number % 10;
    number    = number / 10;
    a[i++]    = tmp + 48;
   if (number) goto wl;
      
wlA:
   i --;
   lcd_putch (a[i]);
   if(i) goto wlA;
}


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 ]
Заглавие: 

Nikola Kirov написа:
Пък на мен ще ми е за урок да не бързам да купувам преди да съм готов с софта :)


Недей така, нека има хляб и за програмистите :D

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/