Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: xdtgj 30. 12. 2017, 19:53:47
-
Zdravím, potřeboval bych si vyjasnit jednu věc, kterou se mi nedaří dohledat. U gcc, objcopy a dalších se potýkám s pojmy jako bfd, popřípadě bfdname a bfdarch. Ale nikde se mi pořádně nepodařilo najít, co přesně znamenají, ale především ani konkrétní podporované řetězce a jejich využití. V manuálových stránkách jsem toho moc nenašel a na internetu spíše info o tom, jak se obejít bez příslušných přepínačů. Využíváte to někdo? Víte, kde najít seznam podporovaných hodnot pro příslušné přepínače? Předem díky.
-
Otazka jake jsou vsechny moznosti mi prijde uplne zbytecna, chtelo by to spis opacne napsat co ma binutils/prekladac delat a na to se da odpovedet jak jej sestavit. Driv jsem prekladal crosscompiler pro ruzne embedded platformy, radove slo tak mozna o 20 gcc-cek.
-
Otazka jake jsou vsechny moznosti mi prijde uplne zbytecna, chtelo by to spis opacne napsat co ma binutils/prekladac delat a na to se da odpovedet jak jej sestavit. Driv jsem prekladal crosscompiler pro ruzne embedded platformy, radove slo tak mozna o 20 gcc-cek.
Tak to bude trošku těžší, ale zkusím to.
Nedávno jsem založil vlákno, ve kterém jsem měl problém s programem pro AVR.
https://forum.root.cz/index.php?topic=17158.msg242120#msg242120
Ve finále mi tam pár lidí pomohlo najít některé chyby, které jsem dělal při programování, ale ve výsledku jsem skončil v situaci, kdy mi vývojové prostředí Arduino IDE program překládalo, ale když jsem použil postupy, které jsem našel na internetu, tak jsem se nemohl dostat ke kloudnému výsledku. Po prohlédnutí programu jsem se rozhodl nahrát program z Arduina do pc a disasemblovat jej. Výsledek jsem moc nepobral, ale zřejmá je jedna věc. Program je celý zapsaný v oblasti pro vektory přerušení, takže když se vyvolá přerušení, tak pravděpodobně zabloudí. Bohužel to nemám jak odsimulovat, takže si nejsem jistý, jestli tam není nějaká optimalizace, kterou jsem přehlédl (v asembleru taky nejsem zrovna expert). Pokud ale program dostanu do stavu, kdy jej přeloží Arduino, které nejspíše avr-gcc spolu s dalšími utilitami používá, měl bych se být schopný dostat do stavu, kdy přinutím avr-gcc a další utility, aby mi to přeložily obdobným způsobem. Tak jsem začal zkoumat přepínače a chtěl jsem zadat buď avr-gcc nebo avr-objcopy informaci, pro jaký mikrokontrolér to má přeložit. Zadání architektury AVR totiž pravděpodobně stačit nebude, protože různé mikrokontroléry mají různě velkou oblast pro vektory přerušení (podle velikosti FLASH). Takže jsem začal hledat přepínače, kterými by to mohlo jít a zastavil jsem se na tomhle. Navíc jsem právě zjistil, že program z Arduino IDE má oblast přerušení v asembleru upravenou na jedničku. Nechtěl jsem s tím jít do diskuse teď, protože zatím nemám tuhle hypotézu úplně ověřenou, ale až se mi ručně podaří zajistit, aby příslušný soubor v intelhex formátu odpovídal tomu, co by podle mého úsudku pravděpodobně mělo být v uPC, tak bych věděl více, ale když už mám popsat konkrétní problém, tak tady je... ...prostě takový jednoduchý program v C od jednoho začátečníka. :-)
Disasemblované obrazy FLASH mikrokontroléru přikládám níže:
Předem se omlouvám za možné chyby, už jsem docela unavený...
-
Program zkompilovaný ručně pomocí gcc
Blinking_LED.hex: file format ihex
Disassembly of section .sec1:
00000000 <.sec1>:
0: cf 93 push r28
2: df 93 push r29
4: cd b7 in r28, 0x3d ; 61
6: de b7 in r29, 0x3e ; 62
8: f8 94 cli
a: 87 e2 ldi r24, 0x27 ; 39
c: 90 e0 ldi r25, 0x00 ; 0
e: 2f ef ldi r18, 0xFF ; 255
10: fc 01 movw r30, r24
12: 20 83 st Z, r18
14: 88 e2 ldi r24, 0x28 ; 40
16: 90 e0 ldi r25, 0x00 ; 0
18: fc 01 movw r30, r24
1a: 10 82 st Z, r1
1c: 84 e2 ldi r24, 0x24 ; 36
1e: 90 e0 ldi r25, 0x00 ; 0
20: 2f ef ldi r18, 0xFF ; 255
22: fc 01 movw r30, r24
24: 20 83 st Z, r18
26: 85 e2 ldi r24, 0x25 ; 37
28: 90 e0 ldi r25, 0x00 ; 0
2a: fc 01 movw r30, r24
2c: 10 82 st Z, r1
2e: 80 e8 ldi r24, 0x80 ; 128
30: 90 e0 ldi r25, 0x00 ; 0
32: fc 01 movw r30, r24
34: 10 82 st Z, r1
36: 81 e8 ldi r24, 0x81 ; 129
38: 90 e0 ldi r25, 0x00 ; 0
3a: fc 01 movw r30, r24
3c: 10 82 st Z, r1
3e: 88 e8 ldi r24, 0x88 ; 136
40: 90 e0 ldi r25, 0x00 ; 0
42: 28 e0 ldi r18, 0x08 ; 8
44: 3d e3 ldi r19, 0x3D ; 61
46: fc 01 movw r30, r24
48: 31 83 std Z+1, r19 ; 0x01
4a: 20 83 st Z, r18
4c: 81 e8 ldi r24, 0x81 ; 129
4e: 90 e0 ldi r25, 0x00 ; 0
50: 21 e8 ldi r18, 0x81 ; 129
52: 30 e0 ldi r19, 0x00 ; 0
54: f9 01 movw r30, r18
56: 20 81 ld r18, Z
58: 28 60 ori r18, 0x08 ; 8
5a: fc 01 movw r30, r24
5c: 20 83 st Z, r18
5e: 81 e8 ldi r24, 0x81 ; 129
60: 90 e0 ldi r25, 0x00 ; 0
62: 21 e8 ldi r18, 0x81 ; 129
64: 30 e0 ldi r19, 0x00 ; 0
66: f9 01 movw r30, r18
68: 20 81 ld r18, Z
6a: 21 60 ori r18, 0x01 ; 1
6c: fc 01 movw r30, r24
6e: 20 83 st Z, r18
70: 81 e8 ldi r24, 0x81 ; 129
72: 90 e0 ldi r25, 0x00 ; 0
74: 21 e8 ldi r18, 0x81 ; 129
76: 30 e0 ldi r19, 0x00 ; 0
78: f9 01 movw r30, r18
7a: 20 81 ld r18, Z
7c: 24 60 ori r18, 0x04 ; 4
7e: fc 01 movw r30, r24
80: 20 83 st Z, r18
82: 8f e6 ldi r24, 0x6F ; 111
84: 90 e0 ldi r25, 0x00 ; 0
86: 2f e6 ldi r18, 0x6F ; 111
88: 30 e0 ldi r19, 0x00 ; 0
8a: f9 01 movw r30, r18
8c: 20 81 ld r18, Z
8e: 22 60 ori r18, 0x02 ; 2
90: fc 01 movw r30, r24
92: 20 83 st Z, r18
94: 78 94 sei
96: ff cf rjmp .-2 ; 0x96
98: 1f 92 push r1
9a: 0f 92 push r0
9c: 00 90 5f 00 lds r0, 0x005F
a0: 0f 92 push r0
a2: 11 24 eor r1, r1
a4: 2f 93 push r18
a6: 3f 93 push r19
a8: 8f 93 push r24
aa: 9f 93 push r25
ac: ef 93 push r30
ae: ff 93 push r31
b0: cf 93 push r28
b2: df 93 push r29
b4: cd b7 in r28, 0x3d ; 61
b6: de b7 in r29, 0x3e ; 62
b8: 88 e2 ldi r24, 0x28 ; 40
ba: 90 e0 ldi r25, 0x00 ; 0
bc: 28 e2 ldi r18, 0x28 ; 40
be: 30 e0 ldi r19, 0x00 ; 0
c0: f9 01 movw r30, r18
c2: 30 81 ld r19, Z
c4: 24 e0 ldi r18, 0x04 ; 4
c6: 23 27 eor r18, r19
c8: fc 01 movw r30, r24
ca: 20 83 st Z, r18
cc: df 91 pop r29
ce: cf 91 pop r28
d0: ff 91 pop r31
d2: ef 91 pop r30
d4: 9f 91 pop r25
d6: 8f 91 pop r24
d8: 3f 91 pop r19
da: 2f 91 pop r18
dc: 0f 90 pop r0
de: 00 92 5f 00 sts 0x005F, r0
e2: 0f 90 pop r0
e4: 1f 90 pop r1
e6: 18 95 reti
-
Program zkompilovaný s pomocí Arduino IDE
ArduinoIDEIntelHex.hex: file format ihex
Disassembly of section .sec1:
00000000 <.sec1>:
0: 0c 94 34 00 jmp 0x68 ; 0x68
4: 0c 94 46 00 jmp 0x8c ; 0x8c
8: 0c 94 46 00 jmp 0x8c ; 0x8c
c: 0c 94 46 00 jmp 0x8c ; 0x8c
10: 0c 94 46 00 jmp 0x8c ; 0x8c
14: 0c 94 46 00 jmp 0x8c ; 0x8c
18: 0c 94 46 00 jmp 0x8c ; 0x8c
1c: 0c 94 46 00 jmp 0x8c ; 0x8c
20: 0c 94 46 00 jmp 0x8c ; 0x8c
24: 0c 94 46 00 jmp 0x8c ; 0x8c
28: 0c 94 46 00 jmp 0x8c ; 0x8c
2c: 0c 94 92 00 jmp 0x124 ; 0x124
30: 0c 94 46 00 jmp 0x8c ; 0x8c
34: 0c 94 46 00 jmp 0x8c ; 0x8c
38: 0c 94 46 00 jmp 0x8c ; 0x8c
3c: 0c 94 46 00 jmp 0x8c ; 0x8c
40: 0c 94 48 00 jmp 0x90 ; 0x90
44: 0c 94 46 00 jmp 0x8c ; 0x8c
48: 0c 94 46 00 jmp 0x8c ; 0x8c
4c: 0c 94 46 00 jmp 0x8c ; 0x8c
50: 0c 94 46 00 jmp 0x8c ; 0x8c
54: 0c 94 46 00 jmp 0x8c ; 0x8c
58: 0c 94 46 00 jmp 0x8c ; 0x8c
5c: 0c 94 46 00 jmp 0x8c ; 0x8c
60: 0c 94 46 00 jmp 0x8c ; 0x8c
64: 0c 94 46 00 jmp 0x8c ; 0x8c
68: 11 24 eor r1, r1
6a: 1f be out 0x3f, r1 ; 63
6c: cf ef ldi r28, 0xFF ; 255
6e: d8 e0 ldi r29, 0x08 ; 8
70: de bf out 0x3e, r29 ; 62
72: cd bf out 0x3d, r28 ; 61
74: 21 e0 ldi r18, 0x01 ; 1
76: a0 e0 ldi r26, 0x00 ; 0
78: b1 e0 ldi r27, 0x01 ; 1
7a: 01 c0 rjmp .+2 ; 0x7e
7c: 1d 92 st X+, r1
7e: a9 30 cpi r26, 0x09 ; 9
80: b2 07 cpc r27, r18
82: e1 f7 brne .-8 ; 0x7c
84: 0e 94 a4 00 call 0x148 ; 0x148
88: 0c 94 17 01 jmp 0x22e ; 0x22e
8c: 0c 94 00 00 jmp 0 ; 0x0
90: 1f 92 push r1
92: 0f 92 push r0
94: 0f b6 in r0, 0x3f ; 63
96: 0f 92 push r0
98: 11 24 eor r1, r1
9a: 2f 93 push r18
9c: 3f 93 push r19
9e: 8f 93 push r24
a0: 9f 93 push r25
a2: af 93 push r26
a4: bf 93 push r27
a6: 80 91 05 01 lds r24, 0x0105
aa: 90 91 06 01 lds r25, 0x0106
ae: a0 91 07 01 lds r26, 0x0107
b2: b0 91 08 01 lds r27, 0x0108
...Více kódu mě to bohužel nenechá vložit, ale obecně pro ilustraci problému by to mělo stačit...
-
Jdeš na to nějak strašně složitě.
ale ve výsledku jsem skončil v situaci, kdy mi vývojové prostředí Arduino IDE program překládalo, ale když jsem použil postupy, které jsem našel na internetu, tak jsem se nemohl dostat ke kloudnému výsledku. Po prohlédnutí programu jsem se rozhodl nahrát program z Arduina do pc a disasemblovat jej.
arduino-makefile, případně se dá v nastavení zaškrtnout, aby vypisoval, co dělá
Tak jsem začal zkoumat přepínače a chtěl jsem zadat buď avr-gcc nebo avr-objcopy informaci, pro jaký mikrokontrolér to má přeložit.
-mmcu=
Program je celý zapsaný v oblasti pro vektory přerušení, takže když se vyvolá přerušení, tak pravděpodobně zabloudí.
Právě naopak, co, co sem dáváš jako ukázku kódu z Arduina, je přesně to, co je v kapitole 16.3. manuálu k AtMega 48/88/168PA.
Nevím, posledně jsem psal pro tyhle věci bootloader a prostě jsem si vygooglil makefile.
-
Program je celý zapsaný v oblasti pro vektory přerušení, takže když se vyvolá přerušení, tak pravděpodobně zabloudí.
Právě naopak, co, co sem dáváš jako ukázku kódu z Arduina, je přesně to, co je v kapitole 16.3. manuálu k AtMega 48/88/168PA.
Nevím, posledně jsem psal pro tyhle věci bootloader a prostě jsem si vygooglil makefile.
[/quote]
Omlouvám se, špatně jsem se ráno vyjádřil. Programuji Arduino více méně s pomocí dvou způsobů. Přes avr-gcc a s pomocí arduina. Avr-gcc nefunguje, Arduino IDE bez problému. Přepínač mmcu jsem zkoušel s položkou avr5, ale beze změny. Při zadání atmega328p mi to vyhodilo warning, tak jsem ani nepokračoval, ale určitě se na to ještě jednou mrknu.
-
Tak ten přepínač s položkou atmega328p nakonec funguje. Nevím, proč to nefunguje s hodnotou avr5, obzvlášť, když musím definovat uPC v programu, ale jsem rád, že mi to v C konečně bliká.
Díky za radu!!!