Arduino - 32 bitu promenna ze 4 byte
Jirka Mww
jirka.mww na gmail.com
Středa Prosinec 18 12:53:39 CET 2024
Díky za snahu mi pomoci, ale nechám to, jak to mám, t.j. posuny o 8 bitů
postupně. Výsledek není unsigned, je to například přenos do a ze sítě ve
vztahu k měniči, to se liší znaménkem.
Zdravi
Jirka Sloupenský OK1MWW
st 18. 12. 2024 v 12:00 odesílatel Jaroslav Buchta <
jaroslav.buchta na hascomp.cz> napsal:
> 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
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>>
>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.czHw-list na list.hw.czhttp://list.hw.cz/mailman/listinfo/hw-list
>
>
> _______________________________________________
> HW-list mailing list - sponsored by www.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/bd679799/attachment-0001.htm>
Další informace o konferenci Hw-list