ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
6 мая
137227 Топик полностью
733259 (04.11.2008 08:40, просмотров: 1) ответил leon_ на Масштабирование 16-разрядных данных АЦП в 16-разрядный результат.
ИМХО, вышеприведеный код - пример того, как делать не желательно. Я про call(4 такта!), ret(тоже 4), ldi. Зачем писать на ассемблере, если не нужно максимальное быстродействие? На си всё проще и быстрее ;-) Прошу прощения, не понял идеи округления, почему не использовать перенос из младших разрядов?
static inline uint16_t scale16uu(uint16_t,uint16_t) __attribute__ ((const));
static inline uint16_t scale16uu(uint16_t m0,uint16_t m1){

  uint8_t tmp0,tmp1;
  uint16_t ret;

  tmp1 = 0;

  asm volatile(

    "mul  %A2,%A3"	"\n\t"
    "mov  %1,r1"	"\n\t"
    "mul  %B2,%B3"	"\n\t"
    "movw %A0,r0"	"\n\t"
    "mul  %B2,%A3"	"\n\t"
    "add  %1,r0"	"\n\t"
    "adc  %A0,r1"	"\n\t"
    "adc  %B0,%4"	"\n\t"
    "mul  %A2,%B3"	"\n\t"
    "add  %1,r0"	"\n\t"
    "adc  %A0,r1"	"\n\t"
    "adc  %B0,%4"	"\n\t"

    "clr __zero_reg__"	"\n\t"

    :"=&r"(ret),"=&r"(tmp0)
    :"r"(m0),"r"(m1),"r"(tmp1)
    :"r0","r1"
  );
  return(ret);
Никаких call, ret, загрузок и выгрузок регистров, действия производятся на тем, что есть. И не нужно заморачиваться с асмом, в результате получая только якобы самый быстрый код.