Arduino - 32 bitu promenna ze 4 byte

Pavel Hudeček edizon na seznam.cz
Středa Prosinec 18 21:05:13 CET 2024


Je to trochu složitější:-)

int main(void) {

     uint64_t u64;
     while (1) {

         //u64=0ULL;
         //u64 <<= 8; u64 |= SIGROW.SERNUM5;
         u64 <<= 8; u64 = SIGROW.SERNUM5;

         u64 <<= 8; u64 |= SIGROW.SERNUM4;
         u64 <<= 8; u64 |= SIGROW.SERNUM3;
         u64 <<= 8; u64 |= SIGROW.SERNUM2;
         u64 <<= 8; u64 |= SIGROW.SERNUM1;
         u64 <<= 8; u64 |= SIGROW.SERNUM0;

          // aby byla jistota, že to celý neodoptimalizuje
         u64++;
         for (uint8_t n=0; n<8; n++) {
             PORTA.OUT = *(((uint8_t *)&u64)+1);
         }
     }
}

Zakomentovaná varianta 444 B, vylepšená 478.

Až po odmazání prvního u64 <<= 8; se to zlepší na 442 a původní zůstane 
na 444.

Takže nakonec je to o 2 B lepší. Ale zas ta původní varianta má snadno 
modifikovatelné pořadí, což byla základní myšlenka proč jsem to tak napsal.

PH


Dne 18.12.2024 v 16:53 Petr Labaj napsal(a):
> Je zajímavé, že jste oba použili podobnou konstrukci, která je podle 
> mě suboptimální.
> Když už jste teda zvolili ty shifty místo nějakých rychlejších možností.
>
> První řádek by měl být podle mě dosazovací.
>
> Tedy nějak takto:
> adc_value = (long)d[0] << 24;
> adc_value += (long)d[1] << 16; ...
>
> A u pana Hudečka ještě bez toho úvodního nulování:
>  u64 <<= 8; u64 = SIGROW.SERNUM5;
>  u64 <<= 8; u64 |= SIGROW.SERNUM4;
> ...
>
> PL
>
> ******************
>
> Dne 18.12.2024 v 9:56 Jirka Mww napsal(a):
>>
>>  adc_value += (long)d[0] << 24;
>>  adc_value += (long)d[1] << 16;  adc_value += (long)d[2] << 8;
>>  adc_value += (long)d[3];
>>
>
> Dne 18.12.2024 v 13:26 Pavel Hudeček napsal(a):
>> u64=0ULL;
>>                 u64 <<= 8; u64 |= SIGROW.SERNUM5;
>>                 u64 <<= 8; u64 |= SIGROW.SERNUM4;
>>                 u64 <<= 8; u64 |= SIGROW.SERNUM3;
>>                 u64 <<= 8; u64 |= SIGROW.SERNUM2;
>>                 u64 <<= 8; u64 |= SIGROW.SERNUM1;
>>                 u64 <<= 8; u64 |= SIGROW.SERNUM0;
>
> _______________________________________________
> HW-list mailing list  -  sponsored bywww.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20241218/a84a6644/attachment.htm>


Další informace o konferenci Hw-list