21

Re: Алгоритм підвищення точності позиціонування

Знайшов дуже старий код для вивода цифр на індикатор. Такий код швидше працює ніж через операції ділення, та ділення з залишком. Хоча розмір кода тут більший. І пам'яті ОЗП більше займає.

void indication_func(uint16_t temp)
  {
           uint16_t  temp1 = temp;
           uint16_t  temp_lcd1=temp_lcd2=temp_lcd3=0;
          while (temp1>99)
          {
            temp1-=100;
            temp_lcd3++;
          }

          while (temp1>9)
          {
            temp1-=10;
            temp_lcd2++;
          }

          while (temp1<10 && temp1!=0)
          {
            temp1--;
            temp_lcd1++;
          }
      if(menu<255)
      {
       if(temp<10)
       {
          led_buff[1]=led_table[temp_lcd1];
          led_buff[2]=led_table[10];
          led_buff[3]=led_table[10];
       }
       else if(temp<100)
       {
          led_buff[2]=led_table[temp_lcd1];
          led_buff[1]=led_table[temp_lcd2];
          led_buff[3]=led_table[10];
       }
       else if(temp<1000)
       {
          led_buff[3]=led_table[temp_lcd1];
          led_buff[2]=led_table[temp_lcd2];
          led_buff[1]=led_table[temp_lcd3];
       }
      }
 }

22

Re: Алгоритм підвищення точності позиціонування

те саме, але ділення та ділення з залишком. Працює дуже повільно на МК з відсутнім апаратним діленням:

          
uint16_t min_ = min;
   
             if(min_ < 10)
             {   
                  led_buff[0]=led_table[13];   // 
                  led_buff[1]=led_table[min_];
                  led_buff[2]=led_table[10];
             }    
             else if(min_ < 100)
             {
                  led_buff[2]=led_table[min_%10];   //
                   min_ /=10; 
                  led_buff[1]=led_table[min_%10];
                  led_buff[0]=led_table[13];
             } 
             else if(min_ < 1000)
             {
                  led_buff[2]=led_table[min_%10];   //
                   min_ /=10; 
                  led_buff[1]=led_table[min_%10];
                   min_ /=10;
                  led_buff[0]=led_table[min_%10];
             }

23

Re: Алгоритм підвищення точності позиціонування

https://ww1.microchip.com/downloads/en/ … 01974B.pdf каже, що операції множення виконуються за 2 такти (а додавання - 1).
Якщо ви зберете цей код у сучасному компіляторі (на тому ж godbolt-і), то min_%10 виглядатиме приблизно як

imul    eax, eax, 52429

що, вочевидь, значно швидше, ніж цикл по 1 такту на порівняння, на віднімання і на умовний перехід. Ділення на константу може бути замінене на множення на спеціально підібране число (треба буде на вихідних на Вікіпедії статтю зробити, ось оригінал: https://gmplib.org/~tege/divcnst-pldi94.pdf).

Є базове правило: читаність важливіша за швидкість, бо читаний код потім можна оптимізувати, якщо буде потреба, а от "оптимізований" потім не вийде прочитати (і ще краще оптимізувати).

24

Re: Алгоритм підвищення точності позиціонування

Для індикатора робилося на основі цього МК:
https://ww1.microchip.com/downloads/en/ … 41262a.pdf

Він повільний доволі і інструкції мінімум за 4 такти виконуються.
Треба було витягнути максимум продуктивності. Тому виконувалось замість ділення , віднімання з циклом.

Подякували: leofun01, koala2