Re: Jak to v C++ napsat líp?

Martin Záruba swz na volny.cz
Čtvrtek Srpen 31 12:06:59 CEST 2023


To je pěkné. Já byl kdysi (no před 40ti lety) zvyklý programovat v 
Assembleru sálového počítače a o 20let později v Assembleru AT89C2051, 
takže i když jsou tyto instrukce jiné, snadno jsou mi pochopitelné, ale 
jak získat ten výpis? Pro mě je to Arduino značně okrajová záležitost, 
spíš hračka, která mě zajímá. Jde nějak donutit ArduinoIde k tomuto 
výpisu? nebo lze jej někde najít po překladu?

Martin Záruba

Dne 31.8.2023 v 11:25 Jan Waclawek napsal(a):
> Ved pisem, zavisi od rocnika gcc a optimalizacie. Pouzil som avr-gcc 8.0 z
> roku 2017 a -Os a prelozilo mi to podla ocakavania, bez FLASH a bez nul:
>
>    16 0000 81E4      		ldi r24,lo8(65)
>    17 0002 92E4      		ldi r25,lo8(66)
>    18 0004 9093 0000 		sts A+1,r25
>    19 0008 8093 0000 		sts A,r24
>    20 000c 83E4      		ldi r24,lo8(67)
>    21 000e 94E4      		ldi r25,lo8(68)
>    22 0010 9093 0000 		sts A+2+1,r25
>    23 0014 8093 0000 		sts A+2,r24
>
> Akurat ze to mam zle, lebo je opacne endian... :-)
> Takze by to muselo byt
>
>   A[0] = *(int*)"BA";
>   A[1] = *(int*)"DC";
>
>
>> nenasype normalne do pole char/uint8_t pomoci memcpy...
> memcpy() tiez stoji a pada na stupni optimalizacie, pokojne moze prekladac
> vygenerovat inicializovane pole do RAM (t.j. je tam aj nula, a je
> zapratana nielen FLASH ale aj RAM) a zavolat memcpy(). Konkretne
> horeuvedeny prekladac vygeneroval "len" string vo FLASH a odoptimalizoval
> memcpy():
>
>     8               		.section	.rodata.str1.1,"aMS", na progbits,1 9 .LC0: 10 0000 4241 4443 .string "BADC"
>    10      00
>    11               		.section	.text.startup,"ax", na progbits 12 .global main 14 main: 15 /* prologue: function */ 16 /* 
> frame size = 0 */ 17 /* stack size = 0 */ 18 .L__stack_usage = 0 19 
> 0000 8091 0000 lds r24,.LC0 20 0004 9091 0000 lds r25,.LC0+1 21 0008 
> A091 0000 lds r26,.LC0+2 22 000c B091 0000 lds r27,.LC0+3 23 0010 8093 
> 0000 sts A,r24 24 0014 9093 0000 sts A+1,r25 25 0018 A093 0000 sts 
> A+2,r26 26 001c B093 0000 sts A+3,r27 27 .L2: 28 0020 00C0 rjmp .L2 
> Vsimnite si, ze znova kvoli endianite bolo treba pouzit 
> memcpy((unsigned char *)A, "BADC", 4);
>
> co znova je otazne, ci je lepsie alebo citatelnejsie nez original.
>
> wek
>
>
> ----- Original Message ---------------
>
>> A jako bonus bude mit flash zabranou zbytecnymi nulami...
>> Stejne uplne nechapu, k cemu je takova konstrukce dobra a proc se to
>> nenasype normalne do pole char/uint8_t pomoci memcpy...
>>
>> Dne 31.08.2023 v 11:12 Jan Waclawek napsal(a):
>>> "Lepsie" a "zrozumitelne" je relativne.
>>>
>>> Je
>>>
>>> A[0] = *(int*)"AB";
>>> A[1] = *(int*)"CD";
>>>
>>> lepsie ci zrozumitelnejsie?
>>>
>>> A tiez je otazne, aky rocnik gcc pouzivate v tom arduine a s akymi
>>> optimalizaciami, od toho zavisi, aky paskvil z toho prelozi.
>>>
>>> wek
>>>
>>> ----- Original Message ---------------
>>>
>>>
>>>> Mám pole
>>>>
>>>> int A[2];
>>>>
>>>> potřebuji do něj ale vloµit  čtyři znaky ABCD. Vymyslel jsem
>>>>
>>>> A[0] = ('A' << 8) | 'B';
>>>> A[1] = ('C' << 8) | 'D';
>>>>
>>>> nejde to nějak líp? Toto funguje, ale je to docela nesrozumitelné.
>>>>
>>>> -- 
>>>>
>>>> Martin Záruba
>>>>
>>> _______________________________________________
>>> HW-list mailing list  -  sponsored bywww.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
> _______________________________________________
> 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/20230831/aa6ed3b4/attachment.htm>


Další informace o konferenci Hw-list