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

Jan Waclawek konfera na efton.sk
Čtvrtek Srpen 31 13:21:22 CEST 2023


Ja neviem, nepouzivam Arduino ani jeho IDE. Kedysi som sa snazil pochopit,
co presne pocas prekladu robi, ale bolo to davno a nepochopil som to...

V principe su dve cesty. 

1.
To, co som ukazal tu, je ta horsia a pravdepodobne s Arduinom aj tazsie
realizovatelna (ledazeby na to bolo niekde schovane nejake klikadlo alebo
riadok do ktoreho sa daju napisat dodatocne "elementy" ktore sa pridaju do
prikazoveho riadku, ktorym sa vola avr-gcc resp. avr-g++). Ide o to, ze z
C/C++ sa podstate preklada do presne takeho isteho assembleru ako na tych
salovych pocitacoch, takze potom sa spusti assembler (ako program co z
textu urobi ciselka) a ten ma moznost ako vedlajsi produkt vypisat takyto
listing. Je to na trochu dlhsie rozpravanie, ale radsej ukazem, ako to
robim: taketo jednoduche testovacie programy prekladam takymto prikazovym
riadkom:

> d:\PROGRA~1\Atmel\AVRTools\Wavr-gcc-8.0_2017-07-19_mingw32\bin\avr-gcc -Os -DF_CPU=14745600UL -mmcu=atmega2561 -Wa,-adhlns=espp2.lst -Wl,-Map=espp2.map,--cref -o espp2.elf espp2.cpp

to prve je len volanie programu avr-gcc s explicitne uvedenou celou cestou;
potom nasleduje prepinac pre nastavenie optimalizacie (-Os).

Prepinac -DF_CPU=14745600UL je uplne ekvivalentny tomu, ako ked sa na
zaciatku kazdeho prekladaneho suboru napise
#define F_CPU 14745600UL
je to treba napr. pre <delay.h>. 

-mmcu=atmega2561 je na prvy pohlad jasne, je to nastavenie cieloveho mcu;
ale v skutocnosti sa pod tymto schovava viacero veci a rozpravanie o nich
by zabralo velmi vela casu
[reklama] (trosicka z toho rozpravania je aj v tej mojej knihe, ale straca
sa to medzi ostatnymi vecami) [/reklama].

Potom nasleduje presne to, o com hovorim, -Wa - co nasleduje za ciarkou je
jednoducho odovzdane pri volani assembleru, a -a je pre assembler prepinac
"vytvor listing", popis je https://sourceware.org/binutils/docs/as.html#a .

Za tym nasleduje -Wl, to sa zase odovzdava linkeru, a konkretne tieto
prepinace znamenaju -Map - vytvor mapfile, --cref - do mapfile uloz
krizove referencie (ak by ste si ten mapfile vytvorili s a bez --cref, tak
by ste videli rozdiel - toto moze byt uzitocne pri nejakom nahanani
problemu typu "odkial sa mi tu zobrala tato funkcia, a preco sa nepouzije
moja", ked sa linkuju rozne kniznice).

-o je prepinac, za ktorym nasleduje meno vystupneho suboru prekladu, tu je
to espp2.elf

Napokon nasleduje zoznam zdrojovych textov, tu je len jeden, espp2.cpp.

Problem s tym listingom z assembleru je ten, ze to je vysledok suroveho
prekladu pred linkovanim, t.j. nie su v nom vidiet skutocne adresy - tie
su nahradzovane nulami. Ale pre niekoho je ten listing citatelnejsi resp.
lahsie sa v nom mozu nachadzat niektore veci.

2. Druha cesta, ktora je asi v pripade Arduina priechodnejsia, je po
preklade na vysledny xxx.elf pustit nieco taketo:

> d:\PROGRA~1\Atmel\AVRTools\Wavr-gcc-8.0_2017-07-19_mingw32\bin\avr-objdump -d -h -S espp2.elf >espp2.lss

co zdisasembluje uz zlinkovany binar (espp2.elf). Navod tu
https://sourceware.org/binutils/docs/binutils.html#objdump

Aby fungovalo -S (t.j. ze sa vkladaju riadky zo zdrojaku do disasm), je pri
preklade potrebne pouzit prepinac typu -g3 (neviem presne ktory, ale -g3
by mal fungovat). Potom ten xxx.lss obsahuje (okrem inych veci) toto:

int main(void) {
  A[0] = ('A' << 8) | 'B';
 112:	82 e4       	ldi	r24, 0x42	; 66
 114:	91 e4       	ldi	r25, 0x41	; 65
 116:	90 93 01 02 	sts	0x0201, r25
 11a:	80 93 00 02 	sts	0x0200, r24
  A[1] = ('C' << 8) | 'D';
 11e:	84 e4       	ldi	r24, 0x44	; 68
 120:	93 e4       	ldi	r25, 0x43	; 67
 122:	90 93 03 02 	sts	0x0203, r25
 126:	80 93 02 02 	sts	0x0202, r24
 12a:	ff cf       	rjmp	.-2      	; 0x12a <main+0x18>


wek




----- Original Message ---------------

>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
>>


Další informace o konferenci Hw-list