Arduino - 32 bitu promenna ze 4 byte

Jaroslav Buchta jaroslav.buchta na hascomp.cz
Stųeda Prosinec 18 12:01:53 CET 2024


Mozna to chtelo unsigned long.
A misto += bych tal |= mozna by to prekladac udelal efektivneji, mozna 
ne. Pri scitani musi poocitat s prenosem.

test:
long adc_value;
volatile unsigned char d[4];

int main()
{
     adc_value += (long)d[0] << 24;
     adc_value += (long)d[1] << 16;
     adc_value += (long)d[2] << 8;
     adc_value += (long)d[3];




Me to u AVR warningy nedela a s + to dopadne strasne

     adc_value += (long)d[0] << 24;
  276:    e8 e0           ldi    r30, 0x08    ; 8
  278:    f1 e0           ldi    r31, 0x01    ; 1
  27a:    00 81           ld    r16, Z
     adc_value += (long)d[1] << 16;
  27c:    91 81           ldd    r25, Z+1    ; 0x01
     adc_value += (long)d[2] << 8;
  27e:    42 81           ldd    r20, Z+2    ; 0x02
     adc_value += (long)d[3];
  280:    e3 81           ldd    r30, Z+3    ; 0x03
  282:    10 e0           ldi    r17, 0x00    ; 0
  284:    20 e0           ldi    r18, 0x00    ; 0
  286:    30 e0           ldi    r19, 0x00    ; 0
  288:    30 2f           mov    r19, r16
  28a:    22 27           eor    r18, r18
  28c:    11 27           eor    r17, r17
  28e:    00 27           eor    r16, r16
  290:    c0 90 01 01     lds    r12, 0x0101    ; 0x800101 <adc_value>
  294:    d0 90 02 01     lds    r13, 0x0102    ; 0x800102 <adc_value+0x1>
  298:    e0 90 03 01     lds    r14, 0x0103    ; 0x800103 <adc_value+0x2>
  29c:    f0 90 04 01     lds    r15, 0x0104    ; 0x800104 <adc_value+0x3>
  2a0:    0c 0d           add    r16, r12
  2a2:    1d 1d           adc    r17, r13
  2a4:    2e 1d           adc    r18, r14
  2a6:    3f 1d           adc    r19, r15
  2a8:    89 2f           mov    r24, r25
  2aa:    90 e0           ldi    r25, 0x00    ; 0
  2ac:    a0 e0           ldi    r26, 0x00    ; 0
  2ae:    b0 e0           ldi    r27, 0x00    ; 0
  2b0:    dc 01           movw    r26, r24
  2b2:    99 27           eor    r25, r25
  2b4:    88 27           eor    r24, r24
  2b6:    80 0f           add    r24, r16
  2b8:    91 1f           adc    r25, r17
  2ba:    a2 1f           adc    r26, r18
  2bc:    b3 1f           adc    r27, r19
  2be:    50 e0           ldi    r21, 0x00    ; 0
  2c0:    60 e0           ldi    r22, 0x00    ; 0
  2c2:    70 e0           ldi    r23, 0x00    ; 0
  2c4:    76 2f           mov    r23, r22
  2c6:    65 2f           mov    r22, r21
  2c8:    54 2f           mov    r21, r20
  2ca:    44 27           eor    r20, r20
  2cc:    84 0f           add    r24, r20
  2ce:    95 1f           adc    r25, r21
  2d0:    a6 1f           adc    r26, r22
  2d2:    b7 1f           adc    r27, r23
  2d4:    8e 0f           add    r24, r30
  2d6:    91 1d           adc    r25, r1
  2d8:    a1 1d           adc    r26, r1
  2da:    b1 1d           adc    r27, r1
  2dc:    80 93 01 01     sts    0x0101, r24    ; 0x800101 <adc_value>
  2e0:    90 93 02 01     sts    0x0102, r25    ; 0x800102 <adc_value+0x1>
  2e4:    a0 93 03 01     sts    0x0103, r26    ; 0x800103 <adc_value+0x2>
  2e8:    b0 93 04 01     sts    0x0104, r27    ; 0x800104 <adc_value+0x3>

s |= pak takhle, vyrazne lepsi a asi i celkem optimalni:

     adc_value |= (long)d[0] << 24;
  276:    e8 e0           ldi    r30, 0x08    ; 8
  278:    f1 e0           ldi    r31, 0x01    ; 1
  27a:    40 81           ld    r20, Z
     adc_value |= (long)d[1] << 16;
  27c:    31 81           ldd    r19, Z+1    ; 0x01
     adc_value |= (long)d[2] << 8;
  27e:    22 81           ldd    r18, Z+2    ; 0x02
     adc_value |= (long)d[3];
  280:    53 81           ldd    r21, Z+3    ; 0x03
  282:    80 91 01 01     lds    r24, 0x0101    ; 0x800101 <adc_value>
  286:    90 91 02 01     lds    r25, 0x0102    ; 0x800102 <adc_value+0x1>
  28a:    a0 91 03 01     lds    r26, 0x0103    ; 0x800103 <adc_value+0x2>
  28e:    b0 91 04 01     lds    r27, 0x0104    ; 0x800104 <adc_value+0x3>
  292:    85 2b           or    r24, r21
  294:    b4 2b           or    r27, r20
  296:    a3 2b           or    r26, r19
  298:    92 2b           or    r25, r18
  29a:    80 93 01 01     sts    0x0101, r24    ; 0x800101 <adc_value>
  29e:    90 93 02 01     sts    0x0102, r25    ; 0x800102 <adc_value+0x1>
  2a2:    a0 93 03 01     sts    0x0103, r26    ; 0x800103 <adc_value+0x2>
  2a6:    b0 93 04 01     sts    0x0104, r27    ; 0x800104 <adc_value+0x3>

Ale musi byt zapnuta nejaka optimalizace, s ladici -Og to logicky 
rozepise po radcich

     adc_value |= (long)d[0] << 24;
  24a:    e8 e0           ldi    r30, 0x08    ; 8
  24c:    f1 e0           ldi    r31, 0x01    ; 1
  24e:    80 81           ld    r24, Z
  250:    90 e0           ldi    r25, 0x00    ; 0
  252:    a0 e0           ldi    r26, 0x00    ; 0
  254:    b0 e0           ldi    r27, 0x00    ; 0
  256:    b8 2f           mov    r27, r24
  258:    aa 27           eor    r26, r26
  25a:    99 27           eor    r25, r25
  25c:    88 27           eor    r24, r24
  25e:    40 91 01 01     lds    r20, 0x0101    ; 0x800101 <adc_value>
  262:    50 91 02 01     lds    r21, 0x0102    ; 0x800102 <adc_value+0x1>
  266:    60 91 03 01     lds    r22, 0x0103    ; 0x800103 <adc_value+0x2>
  26a:    70 91 04 01     lds    r23, 0x0104    ; 0x800104 <adc_value+0x3>
  26e:    48 2b           or    r20, r24
  270:    59 2b           or    r21, r25
  272:    6a 2b           or    r22, r26
  274:    7b 2b           or    r23, r27
  276:    40 93 01 01     sts    0x0101, r20    ; 0x800101 <adc_value>
  27a:    50 93 02 01     sts    0x0102, r21    ; 0x800102 <adc_value+0x1>
  27e:    60 93 03 01     sts    0x0103, r22    ; 0x800103 <adc_value+0x2>
  282:    70 93 04 01     sts    0x0104, r23    ; 0x800104 <adc_value+0x3>
     adc_value |= (long)d[1] << 16;
  286:    81 81           ldd    r24, Z+1    ; 0x01
  288:    90 e0           ldi    r25, 0x00    ; 0
  28a:    a0 e0           ldi    r26, 0x00    ; 0
  28c:    b0 e0           ldi    r27, 0x00    ; 0
  28e:    dc 01           movw    r26, r24
  290:    99 27           eor    r25, r25
  292:    88 27           eor    r24, r24
  294:    48 2b           or    r20, r24
  296:    59 2b           or    r21, r25
  298:    6a 2b           or    r22, r26
  29a:    7b 2b           or    r23, r27
  29c:    40 93 01 01     sts    0x0101, r20    ; 0x800101 <adc_value>
  2a0:    50 93 02 01     sts    0x0102, r21    ; 0x800102 <adc_value+0x1>
  2a4:    60 93 03 01     sts    0x0103, r22    ; 0x800103 <adc_value+0x2>
  2a8:    70 93 04 01     sts    0x0104, r23    ; 0x800104 <adc_value+0x3>
     adc_value |= (long)d[2] << 8;
  2ac:    82 81           ldd    r24, Z+2    ; 0x02
  2ae:    90 e0           ldi    r25, 0x00    ; 0
  2b0:    a0 e0           ldi    r26, 0x00    ; 0
  2b2:    b0 e0           ldi    r27, 0x00    ; 0
  2b4:    ba 2f           mov    r27, r26
  2b6:    a9 2f           mov    r26, r25
  2b8:    98 2f           mov    r25, r24
  2ba:    88 27           eor    r24, r24
  2bc:    84 2b           or    r24, r20
  2be:    95 2b           or    r25, r21
  2c0:    a6 2b           or    r26, r22
  2c2:    b7 2b           or    r27, r23
  2c4:    80 93 01 01     sts    0x0101, r24    ; 0x800101 <adc_value>
  2c8:    90 93 02 01     sts    0x0102, r25    ; 0x800102 <adc_value+0x1>
  2cc:    a0 93 03 01     sts    0x0103, r26    ; 0x800103 <adc_value+0x2>
  2d0:    b0 93 04 01     sts    0x0104, r27    ; 0x800104 <adc_value+0x3>
     adc_value |= (long)d[3];
  2d4:    23 81           ldd    r18, Z+3    ; 0x03
  2d6:    82 2b           or    r24, r18
  2d8:    80 93 01 01     sts    0x0101, r24    ; 0x800101 <adc_value>
  2dc:    90 93 02 01     sts    0x0102, r25    ; 0x800102 <adc_value+0x1>
  2e0:    a0 93 03 01     sts    0x0103, r26    ; 0x800103 <adc_value+0x2>
  2e4:    b0 93 04 01     sts    0x0104, r27    ; 0x800104 <adc_value+0x3>

Zapis na jeden radek  s -Og
     adc_value = ((long)d[0] << 24) | ((long)d[1] << 16) | ((long)d[2] 
<< 8) | ((long)d[3] << 0);
  2e8:    80 81           ld    r24, Z
  2ea:    90 e0           ldi    r25, 0x00    ; 0
  2ec:    a0 e0           ldi    r26, 0x00    ; 0
  2ee:    b0 e0           ldi    r27, 0x00    ; 0
  2f0:    78 2f           mov    r23, r24
  2f2:    66 27           eor    r22, r22
  2f4:    55 27           eor    r21, r21
  2f6:    44 27           eor    r20, r20
  2f8:    81 81           ldd    r24, Z+1    ; 0x01
  2fa:    90 e0           ldi    r25, 0x00    ; 0
  2fc:    a0 e0           ldi    r26, 0x00    ; 0
  2fe:    b0 e0           ldi    r27, 0x00    ; 0
  300:    dc 01           movw    r26, r24
  302:    99 27           eor    r25, r25
  304:    88 27           eor    r24, r24
  306:    84 2b           or    r24, r20
  308:    95 2b           or    r25, r21
  30a:    a6 2b           or    r26, r22
  30c:    b7 2b           or    r27, r23
  30e:    42 81           ldd    r20, Z+2    ; 0x02
  310:    50 e0           ldi    r21, 0x00    ; 0
  312:    60 e0           ldi    r22, 0x00    ; 0
  314:    70 e0           ldi    r23, 0x00    ; 0
  316:    76 2f           mov    r23, r22
  318:    65 2f           mov    r22, r21
  31a:    54 2f           mov    r21, r20
  31c:    44 27           eor    r20, r20
  31e:    84 2b           or    r24, r20
  320:    95 2b           or    r25, r21
  322:    a6 2b           or    r26, r22
  324:    b7 2b           or    r27, r23
  326:    23 81           ldd    r18, Z+3    ; 0x03
  328:    82 2b           or    r24, r18
  32a:    80 93 01 01     sts    0x0101, r24    ; 0x800101 <adc_value>
  32e:    90 93 02 01     sts    0x0102, r25    ; 0x800102 <adc_value+0x1>
  332:    a0 93 03 01     sts    0x0103, r26    ; 0x800103 <adc_value+0x2>
  336:    b0 93 04 01     sts    0x0104, r27    ; 0x800104 <adc_value+0x3>

A totez s -O1
     adc_value = ((long)d[0] << 24) | ((long)d[1] << 16) | ((long)d[2] 
<< 8) | ((long)d[3] << 0);
  282:    40 81           ld    r20, Z
  284:    81 81           ldd    r24, Z+1    ; 0x01
  286:    22 81           ldd    r18, Z+2    ; 0x02
  288:    33 81           ldd    r19, Z+3    ; 0x03
  28a:    90 e0           ldi    r25, 0x00    ; 0
  28c:    a0 e0           ldi    r26, 0x00    ; 0
  28e:    b0 e0           ldi    r27, 0x00    ; 0
  290:    dc 01           movw    r26, r24
  292:    99 27           eor    r25, r25
  294:    88 27           eor    r24, r24
  296:    b4 2b           or    r27, r20
  298:    83 2b           or    r24, r19
  29a:    92 2b           or    r25, r18
  29c:    80 93 01 01     sts    0x0101, r24    ; 0x800101 <adc_value>
  2a0:    90 93 02 01     sts    0x0102, r25    ; 0x800102 <adc_value+0x1>
  2a4:    a0 93 03 01     sts    0x0103, r26    ; 0x800103 <adc_value+0x2>
  2a8:    b0 93 04 01     sts    0x0104, r27    ; 0x800104 <adc_value+0x3>

Asi nejlepsi ale rezervy tam furt jsou proti tomu jak by se to napsalo v 
ASM...

Dne 18.12.2024 v 9:56 Jirka Mww napsal(a):
> Cķlovį promģnnį byla typu long int .
> Na pravou stranu vżrazu jsem zkou¹el psįt (long) i (long int) , ale 
> nepomohlo to .  Fungovalo to, ale ty warningy mģ ¹tvaly.
> Inspiroval jsem se tady :
>
> https://forum.arduino.cc/t/how-to-convert-4-bytes-into-a-long/70425/9
>
> z tohoto pųķkladu :
>  adc_value += (long)d[0] << 24;
>  adc_value += (long)d[1] << 16;  adc_value += (long)d[2] << 8;
>  adc_value += (long)d[3];
>
> ale warningy tam byly poųįd.
>
>
> Zdravi
> Jirka Sloupenskż  OK1MWW
>
>
> st 18. 12. 2024 v 9:34 odesķlatel Jindrich Fucik <FULDA na seznam.cz> napsal:
>
>     ... a vģdģlo to, ¾e mį vzniknout nģco vģt¹ķho ne¾ bajt?
>
>     ---------- Płvodnķ e-mail ----------
>     Od: Jirka Mww <jirka.mww na gmail.com>
>     Komu: HW-news <hw-list na list.hw.cz>
>     Datum: 18. 12. 2024 9:04:13
>     Pųedmģt: Re: Arduino - 32 bitu promenna ze 4 byte
>
>     Ulo¾eno to nemįm, ale psalo to nģco jako  ¾e posouvat 8 bitové
>     hodnoty o 24 nebo 16 bitł se nemį .
>
>     Zdravi
>     Jirka Sloupenskż  OK1MWW
>     _______________________________________________
>     HW-list mailing list  -  sponsored by www.HW.cz <http://www.HW.cz>
>     Hw-list na list.hw.cz
>     http://list.hw.cz/mailman/listinfo/hw-list
>
>
> _______________________________________________
> 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/449352c2/attachment.htm>


Další informace o konferenci Hw-list