Hallo, Habe ein Programm (geschrieben in Assembler für AT90CAN32) im AVR Studio 4, im AVR Simulator laufen lassen. Habe dann im Laufe irgendwann mehrere Fehlermeldungen bekommen: AVR Simulator: Invalid opcode 0x0064 at address 0x0001e1 AVR Simulator: Invalid opcode 0x006e at address 0x0001eb . . . Möchte jetzt herausfinden wo er denn ein Problem hat im Programm. Dazu habe ich das Disassembler Fenster geöffnet. Definiere mehrere Daten im Rom mit .db ..... siehe unten. Ich verwende es um Strings an einem LCD auszugeben. Service_not_active1: .db "Service inaktiv",0 Im Dissasembler steht am Schluss dann folgendes: ??? Data or unknown opcode. Warum macht er das, bzw. was soll ich tun damit es weggeht oder kann ich es ignorieren? Weiß es nicht besser ;). Disassembler: @00000276: Service_not_active1 1103: .db "Service inaktiv",0 +00000276: 6553 ORI R21,0x53 Logical OR with immediate +00000277: 7672 ANDI R23,0x62 Logical AND with immediate 1103: .db "Service inaktiv",0 +00000278: 6369 ORI R22,0x39 Logical OR with immediate +00000279: 2065 AND R6,R5 Logical AND 1103: .db "Service inaktiv",0 +0000027A: 6E69 ORI R22,0xE9 Logical OR with immediate +0000027B: 6B61 ORI R22,0xB1 Logical OR with immediate 1103: .db "Service inaktiv",0 +0000027C: 6974 ORI R23,0x94 Logical OR with immediate +0000027D: 0076 ??? Data or unknown opcode Danke für eure Hilfe. LG PS: Mein Programm läuft ohne Probleme, außer im Debug Mode bekomme ich oft nach unbestimmter Zeit IDR Event 0xFF.
Dom schrieb: > Im Dissasembler steht am Schluss dann folgendes: ??? Data or unknown > opcode. Warum macht er das, bzw. was soll ich tun damit es weggeht oder > kann ich es ignorieren? Die kannst du ignorieren, die sind nicht dein Problem. Der Disassembler weiß ja nicht, wo du im Flash Texte angeordnet hat. Er versucht aus den dort abgelegten ASCII Codes irgendwas zu machen und da kommt dann Blödsinn raus. > AVR Simulator: Invalid opcode 0x0064 at address 0x0001e1 richte dich nach der angegegenen Adresse. Im Disassembler Listing ist die Stelle interessant, die an der Adresse 0x0001E1 liegt. Dort liegt in erster Linie mal eines deiner Problem.
Karl Heinz schrieb: >> AVR Simulator: Invalid opcode 0x0064 at address 0x0001e1 Die ganzen Invalid Opcodes sind nach den .db direktiven. @000001DC: ladezustand 995: .db "Ladezustand",0 +000001DC: 614C ORI R20,0x1C Logical OR with immediate +000001DD: 6564 ORI R22,0x54 Logical OR with immediate 995: .db "Ladezustand",0 +000001DE: 757A ANDI R23,0x5A Logical AND with immediate +000001DF: 7473 ANDI R23,0x43 Logical AND with immediate 995: .db "Ladezustand",0 +000001E0: 6E61 ORI R22,0xE1 Logical OR with immediate +000001E1: 0064 ??? Data or unknown opcode Sonst gibt es keine Invalid Opcodes im Programm. Danke für deine Antwort!
Dom schrieb: > Karl Heinz schrieb: >>> AVR Simulator: Invalid opcode 0x0064 at address 0x0001e1 > > Die ganzen Invalid Opcodes sind nach den .db direktiven. ok. jetzt musst du noch rausfinden, warum deine Programmausführung an diesen Punkt kommt. Ich schätze mal, das wird ein RET sein, der irgendwie letzten Endes dort landet. Jetzt ist es natürlich schwierig, mit einem Breakpoint zu verfolgen, wie der Prozessor an diese Stelle kam. Prphyliaktisch kann man jetzt erst mal alle PUSH/POP Pärchen durchsehen, ob da irgendwo einer vergessen wurde. Mit viel Glück findest du einen. Wenn nicht, dann wirds aufwändig.
Karl Heinz schrieb: > ok. jetzt musst du noch rausfinden, warum deine Programmausführung an > diesen Punkt kommt. > Ich schätze mal, das wird ein RET sein, der irgendwie letzten Endes dort > landet. Jetzt ist es natürlich schwierig, mit einem Breakpoint zu > verfolgen, wie der Prozessor an diese Stelle kam. > > Prphyliaktisch kann man jetzt erst mal alle PUSH/POP Pärchen durchsehen, > ob da irgendwo einer vergessen wurde. Mit viel Glück findest du einen. > Wenn nicht, dann wirds aufwändig. Du meinst weil meine Programmausführung im Debug Mode an den Punkt IDR event 0xFF gelangt? Ja das mit den ret und push/pop durchschauen müsste ich machen, was leider bei der Programmgröße länger dauert. Aber im normalen Programmablauf wenn kein JTAG im Debug modus dran hängt merke ich überhaupt nichts --> heißt es hängt sich nicht auf restartet sich nicht und dergleichen. Die .db direktiven rufe ich im Programm auf lade es in den Z Pointer und gebe es dann über eine Routine an das LCD aus.
Wenn du im Programmlauf auf Daten als Code landest, ist in den meisten (99%) Fällen dein Stack korrupt. Also ein Push ohne Pop oder umgekehrt, eine Subroutine ohne Return oder ähnliches. Dass es im "Normalbetrieb" nicht auffällt, kann schon sein. Das fällt dann unter "Schlauheit des Materials" oder "Murphy". Schon dein gelegentlicher ungültiger Interrupt sollte dir zu denken geben. Suchen ist angesagt. Das ist langwierig und langweilig. Aber es muss sein.
Dom schrieb: > Die .db direktiven rufe ich im Programm auf lade es in den Z Pointer und > gebe es dann über eine Routine an das LCD aus. Vergiss bitte die .db Die sind NICHT das Problem. Die sind das Symptom. Dein Programm macht irgendwo das Äquivalent zu
1 | rjmp Service_not_active1 + 5 |
Natürlich hast du das so nicht hingeschrieben, das ist schon klar. Das entsteht auf Umwegen, zb durch einen RET der auf eine falsche Adresse zurückspringt, weil du dir den Stack zerschossen hast. Aber genau darauf läuft es hinaus. Wenn du nicht weiter kommst, dann poste mal das komplette Programm.
:
Bearbeitet durch User
Georg G. schrieb: > Wenn du im Programmlauf auf Daten als Code landest, ist in den meisten > (99%) Fällen dein Stack korrupt. Ich lande ja nicht im Programmlauf auf Daten. Ich verstehe jetzt nicht ganz warum die .db ein Symptom sein sollen. Der Code vom Disassembler oben ist ja nur ein Ausschnitt vom Anfang des Programmes, da ich wissen wollte warum Invalid Opcode steht und ob ich das beachten muss. Karl Heinz schrieb: > Dein Programm macht irgendwo das Äquivalent zu > rjmp Service_not_active1 + 5 Warum? Woher ist das bekannt? Ich habe euch den Afangscode vom Disassembler mitgeschickt. Nach der Interruptstruktur speicher ich dann mit .db die Daten ins Rom. Habe ich grad einen Denkfehler oder hab ich es euch falsch übermittelt?
1 | ---- AT90CAN.asm ---------------------------------------------------------------------------------- |
2 | 418: rjmp init |
3 | +00000000: C10C RJMP PC+0x010D Relative jump |
4 | ---- No Source ------------------------------------------------------------------------------------ |
5 | +00000001: FFFF ??? Data or unknown opcode |
6 | ---- AT90CAN.asm ---------------------------------------------------------------------------------- |
7 | 429: jmp int0_interrupt |
8 | +00000002: 940C2CEC JMP 0x00002CEC Jump |
9 | 432: jmp int1_interrupt |
10 | +00000004: 940C2CED JMP 0x00002CED Jump |
11 | 435: jmp int2_interrupt |
12 | +00000006: 940C2CEE JMP 0x00002CEE Jump |
13 | 438: jmp int3_interrupt |
14 | +00000008: 940C2CEF JMP 0x00002CEF Jump |
15 | 441: jmp int4_interrupt |
16 | +0000000A: 940C2CF0 JMP 0x00002CF0 Jump |
17 | 444: jmp int5_interrupt |
18 | +0000000C: 940C2CF1 JMP 0x00002CF1 Jump |
19 | 447: jmp int6_interrupt |
20 | +0000000E: 940C2CF2 JMP 0x00002CF2 Jump |
21 | 450: jmp int7_interrupt |
22 | +00000010: 940C2CF3 JMP 0x00002CF3 Jump |
23 | 453: jmp timer2_compare |
24 | +00000012: 940C2CF4 JMP 0x00002CF4 Jump |
25 | 456: jmp timer2_overflow |
26 | +00000014: 940C2CF5 JMP 0x00002CF5 Jump |
27 | 459: jmp timer1_capture |
28 | +00000016: 940C2CF6 JMP 0x00002CF6 Jump |
29 | 462: jmp timer1_compareA |
30 | +00000018: 940C2CF7 JMP 0x00002CF7 Jump |
31 | 465: jmp timer1_compareB |
32 | +0000001A: 940C2CF8 JMP 0x00002CF8 Jump |
33 | 468: jmp timer1_compareC |
34 | +0000001C: 940C2CF9 JMP 0x00002CF9 Jump |
35 | 471: jmp timer1_overflow ;INTERRUPT |
36 | +0000001E: 940C1A0B JMP 0x00001A0B Jump |
37 | 474: jmp timer0_compare |
38 | +00000020: 940C2CFA JMP 0x00002CFA Jump |
39 | 477: jmp timer0_overflow |
40 | +00000022: 940C1B1D JMP 0x00001B1D Jump |
41 | 480: jmp CAN_TCOE ; CAN Transfer Complete or Error |
42 | +00000024: 940C29E2 JMP 0x000029E2 Jump |
43 | 483: jmp CAN_TIMOVR ; CAN Timer Overrun |
44 | +00000026: 940C2A72 JMP 0x00002A72 Jump |
45 | 486: jmp SPI_STC |
46 | +00000028: 940C2CFB JMP 0x00002CFB Jump |
47 | 489: jmp USART0_RX0 |
48 | +0000002A: 940C2CFC JMP 0x00002CFC Jump |
49 | 492: jmp USART0_UDRE |
50 | +0000002C: 940C2CFD JMP 0x00002CFD Jump |
51 | 495: jmp USART0_TX |
52 | +0000002E: 940C2CFE JMP 0x00002CFE Jump |
53 | 498: jmp ANALOG_COMP |
54 | +00000030: 940C2CFF JMP 0x00002CFF Jump |
55 | 501: jmp ADC_Interrupt |
56 | +00000032: 940C2D00 JMP 0x00002D00 Jump |
57 | 504: jmp EE_READY_Interrupt |
58 | +00000034: 940C2D01 JMP 0x00002D01 Jump |
59 | 507: jmp TIMER3_CAPTURE |
60 | +00000036: 940C2D02 JMP 0x00002D02 Jump |
61 | 510: jmp TIMER3_COMPARE_A |
62 | +00000038: 940C2D03 JMP 0x00002D03 Jump |
63 | 513: jmp TIMER3_COMPARE_B |
64 | +0000003A: 940C2D04 JMP 0x00002D04 Jump |
65 | 516: jmp TIMER3_COMPARE_C |
66 | +0000003C: 940C2D05 JMP 0x00002D05 Jump |
67 | 519: jmp TIMER3_OVERFLOW |
68 | +0000003E: 940C2D06 JMP 0x00002D06 Jump |
69 | 522: jmp USART1_RX |
70 | +00000040: 940C2D07 JMP 0x00002D07 Jump |
71 | 525: jmp USART1_UDRE |
72 | +00000042: 940C2D08 JMP 0x00002D08 Jump |
73 | 528: jmp USART1_TX |
74 | +00000044: 940C2D09 JMP 0x00002D09 Jump |
75 | 531: jmp TWI_Interrupt |
76 | +00000046: 940C2D0A JMP 0x00002D0A Jump |
77 | 534: jmp SPM_READY |
78 | +00000048: 940C2D0B JMP 0x00002D0B Jump |
79 | @0000004A: akkutron |
80 | 541: .db "Akkutron",0 |
81 | +0000004A: 6B41 ORI R20,0xB1 Logical OR with immediate |
82 | +0000004B: 756B ANDI R22,0x5B Logical AND with immediate |
83 | 541: .db "Akkutron",0 |
84 | +0000004C: 7274 ANDI R23,0x24 Logical AND with immediate |
85 | +0000004D: 6E6F ORI R22,0xEF Logical OR with immediate |
86 | 541: .db "Akkutron",0 |
87 | +0000004E: 0000 NOP No operation |
88 | @0000004F: text |
89 | 544: .db "U:",0 ; Stringkonstante, durch eine 0 |
90 | +0000004F: 3A55 CPI R21,0xA5 Compare with immediate |
91 | +00000050: 0000 NOP No operation |
92 | @00000051: text2 |
93 | 548: .db "I:",0 |
94 | +00000051: 3A49 CPI R20,0xA9 Compare with immediate |
95 | +00000052: 0000 NOP No operation |
96 | @00000053: rsoc |
97 | 552: .db "RSOC",0 |
98 | +00000053: 5352 SUBI R21,0x32 Subtract immediate |
99 | +00000054: 434F SBCI R20,0x3F Subtract immediate with carry |
100 | 552: .db "RSOC",0 |
101 | +00000055: 0000 NOP No operation |
102 | @00000056: ladezustand |
103 | 556: .db "Ladezustand",0 |
104 | +00000056: 614C ORI R20,0x1C Logical OR with immediate |
105 | +00000057: 6564 ORI R22,0x54 Logical OR with immediate |
106 | 556: .db "Ladezustand",0 |
107 | +00000058: 757A ANDI R23,0x5A Logical AND with immediate |
108 | +00000059: 7473 ANDI R23,0x43 Logical AND with immediate |
109 | 556: .db "Ladezustand",0 |
110 | +0000005A: 6E61 ORI R22,0xE1 Logical OR with immediate |
111 | +0000005B: 0064 ??? Data or unknown opcode |
112 | @0000005C: solar |
113 | 560: .db "HOME",0 |
114 | +0000005C: 4F48 SBCI R20,0xF8 Subtract immediate with carry |
115 | +0000005D: 454D SBCI R20,0x5D Subtract immediate with carry |
116 | 560: .db "HOME",0 |
117 | +0000005E: 0000 NOP No operation |
118 | @0000005F: einstellung |
119 | 564: .db "Einstellungen",0 |
120 | +0000005F: 6945 ORI R20,0x95 Logical OR with immediate |
121 | +00000060: 736E ANDI R22,0x3E Logical AND with immediate |
122 | 564: .db "Einstellungen",0 |
123 | +00000061: 6574 ORI R23,0x54 Logical OR with immediate |
124 | +00000062: 6C6C ORI R22,0xCC Logical OR with immediate |
125 | 564: .db "Einstellungen",0 |
126 | +00000063: 6E75 ORI R23,0xE5 Logical OR with immediate |
127 | +00000064: 6567 ORI R22,0x57 Logical OR with immediate |
128 | 564: .db "Einstellungen",0 |
129 | +00000065: 006E ??? Data or unknown opcode |
130 | @00000066: exit |
131 | 568: .db "Exit",0 |
132 | +00000066: 7845 ANDI R20,0x85 Logical AND with immediate |
133 | +00000067: 7469 ANDI R22,0x49 Logical AND with immediate |
134 | 568: .db "Exit",0 |
135 | +00000068: 0000 NOP No operation |
136 | @00000069: blei |
137 | 571: .db "Pb-Akku",0 |
138 | +00000069: 6250 ORI R21,0x20 Logical OR with immediate |
139 | +0000006A: 412D SBCI R18,0x1D Subtract immediate with carry |
140 | 571: .db "Pb-Akku",0 |
141 | +0000006B: 6B6B ORI R22,0xBB Logical OR with immediate |
142 | +0000006C: 0075 ??? Data or unknown opcode |
143 | @0000006D: LiFePo4 |
144 | 575: .db "LiFePo4",0 |
145 | +0000006D: 694C ORI R20,0x9C Logical OR with immediate |
146 | +0000006E: 6546 ORI R20,0x56 Logical OR with immediate |
147 | 575: .db "LiFePo4",0 |
148 | +0000006F: 6F50 ORI R21,0xF0 Logical OR with immediate |
149 | +00000070: 0034 ??? Data or unknown opcode |
150 | @00000071: System_Ok |
151 | 579: .db "System:OK",0 |
152 | +00000071: 7953 ANDI R21,0x93 Logical AND with immediate |
153 | +00000072: 7473 ANDI R23,0x43 Logical AND with immediate |
154 | 579: .db "System:OK",0 |
155 | +00000073: 6D65 ORI R22,0xD5 Logical OR with immediate |
156 | +00000074: 4F3A SBCI R19,0xFA Subtract immediate with carry |
157 | 579: .db "System:OK",0 |
158 | +00000075: 004B ??? Data or unknown opcode |
159 | @00000076: System_Fail |
160 | 583: .db "System:Fail",0 |
161 | +00000076: 7953 ANDI R21,0x93 Logical AND with immediate |
162 | +00000077: 7473 ANDI R23,0x43 Logical AND with immediate |
163 | 583: .db "System:Fail",0 |
164 | +00000078: 6D65 ORI R22,0xD5 Logical OR with immediate |
165 | +00000079: 463A SBCI R19,0x6A Subtract immediate with carry |
166 | 583: .db "System:Fail",0 |
167 | +0000007A: 6961 ORI R22,0x91 Logical OR with immediate |
168 | +0000007B: 006C ??? Data or unknown opcode |
169 | @0000007C: measure_data |
170 | 587: .db "Messdaten",0 |
171 | +0000007C: 654D ORI R20,0x5D Logical OR with immediate |
172 | +0000007D: 7373 ANDI R23,0x33 Logical AND with immediate |
173 | 587: .db "Messdaten",0 |
174 | +0000007E: 6164 ORI R22,0x14 Logical OR with immediate |
175 | +0000007F: 6574 ORI R23,0x54 Logical OR with immediate |
176 | 587: .db "Messdaten",0 |
177 | +00000080: 006E ??? Data or unknown opcode |
178 | @00000081: Status |
179 | 591: .db "Status",0 |
180 | +00000081: 7453 ANDI R21,0x43 Logical AND with immediate |
181 | +00000082: 7461 ANDI R22,0x41 Logical AND with immediate |
182 | 591: .db "Status",0 |
183 | +00000083: 7375 ANDI R23,0x35 Logical AND with immediate |
184 | +00000084: 0000 NOP No operation |
185 | @00000085: Adjustment |
186 | 595: .db "Einstellungen",0 |
187 | +00000085: 6945 ORI R20,0x95 Logical OR with immediate |
188 | +00000086: 736E ANDI R22,0x3E Logical AND with immediate |
189 | 595: .db "Einstellungen",0 |
190 | +00000087: 6574 ORI R23,0x54 Logical OR with immediate |
191 | +00000088: 6C6C ORI R22,0xCC Logical OR with immediate |
192 | 595: .db "Einstellungen",0 |
193 | +00000089: 6E75 ORI R23,0xE5 Logical OR with immediate |
194 | +0000008A: 6567 ORI R22,0x57 Logical OR with immediate |
195 | 595: .db "Einstellungen",0 |
196 | +0000008B: 006E ??? Data or unknown opcode |
197 | @0000008C: submenudesign |
198 | 599: .db "Untermen",0 |
199 | +0000008C: 6E55 ORI R21,0xE5 Logical OR with immediate |
200 | +0000008D: 6574 ORI R23,0x54 Logical OR with immediate |
201 | 599: .db "Untermen",0 |
202 | +0000008E: 6D72 ORI R23,0xD2 Logical OR with immediate |
203 | +0000008F: 6E65 ORI R22,0xE5 Logical OR with immediate |
204 | 599: .db "Untermen",0 |
205 | +00000090: 0000 NOP No operation |
206 | @00000091: General |
207 | 603: .db "Allgemein",0 |
208 | +00000091: 6C41 ORI R20,0xC1 Logical OR with immediate |
209 | +00000092: 676C ORI R22,0x7C Logical OR with immediate |
210 | 603: .db "Allgemein",0 |
211 | +00000093: 6D65 ORI R22,0xD5 Logical OR with immediate |
212 | +00000094: 6965 ORI R22,0x95 Logical OR with immediate |
213 | 603: .db "Allgemein",0 |
214 | +00000095: 006E ??? Data or unknown opcode |
215 | @00000096: Modul_LFP1 |
216 | 607: .db "Modul LFP1",0 |
217 | +00000096: 6F4D ORI R20,0xFD Logical OR with immediate |
218 | +00000097: 7564 ANDI R22,0x54 Logical AND with immediate |
219 | 607: .db "Modul LFP1",0 |
220 | +00000098: 206C AND R6,R12 Logical AND |
221 | +00000099: 464C SBCI R20,0x6C Subtract immediate with carry |
222 | 607: .db "Modul LFP1",0 |
223 | +0000009A: 3150 CPI R21,0x10 Compare with immediate |
224 | +0000009B: 0000 NOP No operation |
225 | @0000009C: Bleibattery |
226 | 611: .db "Bleibatterie Pb",0 |
227 | +0000009C: 6C42 ORI R20,0xC2 Logical OR with immediate |
228 | +0000009D: 6965 ORI R22,0x95 Logical OR with immediate |
229 | 611: .db "Bleibatterie Pb",0 |
230 | +0000009E: 6162 ORI R22,0x12 Logical OR with immediate |
231 | +0000009F: 7474 ANDI R23,0x44 Logical AND with immediate |
232 | 611: .db "Bleibatterie Pb",0 |
233 | +000000A0: 7265 ANDI R22,0x25 Logical AND with immediate |
234 | +000000A1: 6569 ORI R22,0x59 Logical OR with immediate |
235 | 611: .db "Bleibatterie Pb",0 |
236 | +000000A2: 5020 SUBI R18,0x00 Subtract immediate |
237 | +000000A3: 0062 ??? Data or unknown opcode |
238 | @000000A4: temperature |
239 | 615: .db "T:",0 |
240 | +000000A4: 3A54 CPI R21,0xA4 Compare with immediate |
241 | +000000A5: 0000 NOP No operation |
242 | @000000A6: modulrequest |
243 | 619: .db "Modulabfrage",0 |
244 | +000000A6: 6F4D ORI R20,0xFD Logical OR with immediate |
245 | +000000A7: 7564 ANDI R22,0x54 Logical AND with immediate |
246 | 619: .db "Modulabfrage",0 |
247 | +000000A8: 616C ORI R22,0x1C Logical OR with immediate |
248 | +000000A9: 6662 ORI R22,0x62 Logical OR with immediate |
249 | 619: .db "Modulabfrage",0 |
250 | +000000AA: 6172 ORI R23,0x12 Logical OR with immediate |
251 | +000000AB: 6567 ORI R22,0x57 Logical OR with immediate |
252 | 619: .db "Modulabfrage",0 |
253 | +000000AC: 0000 NOP No operation |
254 | @000000AD: modulfound |
255 | 623: .db "Module gefunden",0 |
256 | +000000AD: 6F4D ORI R20,0xFD Logical OR with immediate |
257 | +000000AE: 7564 ANDI R22,0x54 Logical AND with immediate |
258 | 623: .db "Module gefunden",0 |
259 | +000000AF: 656C ORI R22,0x5C Logical OR with immediate |
260 | +000000B0: 6720 ORI R18,0x70 Logical OR with immediate |
261 | 623: .db "Module gefunden",0 |
262 | +000000B1: 6665 ORI R22,0x65 Logical OR with immediate |
263 | +000000B2: 6E75 ORI R23,0xE5 Logical OR with immediate |
264 | 623: .db "Module gefunden",0 |
265 | +000000B3: 6564 ORI R22,0x54 Logical OR with immediate |
266 | +000000B4: 006E ??? Data or unknown opcode |
267 | @000000B5: module_0 |
268 | 627: .db "Module",0 |
269 | +000000B5: 6F4D ORI R20,0xFD Logical OR with immediate |
270 | +000000B6: 7564 ANDI R22,0x54 Logical AND with immediate |
271 | 627: .db "Module",0 |
272 | +000000B7: 656C ORI R22,0x5C Logical OR with immediate |
273 | +000000B8: 0000 NOP No operation |
274 | @000000B9: Dat_Uhr |
275 | 630: .db "Datum",0 |
276 | +000000B9: 6144 ORI R20,0x14 Logical OR with immediate |
277 | +000000BA: 7574 ANDI R23,0x54 Logical AND with immediate |
278 | 630: .db "Datum",0 |
279 | +000000BB: 006D ??? Data or unknown opcode |
280 | @000000BC: Uhrzeit |
281 | 633: .db "Aktuell",0 |
282 | +000000BC: 6B41 ORI R20,0xB1 Logical OR with immediate |
283 | +000000BD: 7574 ANDI R23,0x54 Logical AND with immediate |
284 | 633: .db "Aktuell",0 |
285 | +000000BE: 6C65 ORI R22,0xC5 Logical OR with immediate |
286 | +000000BF: 006C ??? Data or unknown opcode |
287 | @000000C0: Kapanzeige |
288 | 636: .db "C:",0 |
289 | +000000C0: 3A43 CPI R20,0xA3 Compare with immediate |
290 | +000000C1: 0000 NOP No operation |
291 | @000000C2: Kapazitaet |
292 | 639: .db "Kapazität:",0 |
293 | +000000C2: 614B ORI R20,0x1B Logical OR with immediate |
294 | +000000C3: 6170 ORI R23,0x10 Logical OR with immediate |
295 | 639: .db "Kapazität:",0 |
296 | +000000C4: 697A ORI R23,0x9A Logical OR with immediate |
297 | +000000C5: E474 LDI R23,0x44 Load immediate |
298 | 639: .db "Kapazität:",0 |
299 | +000000C6: 3A74 CPI R23,0xA4 Compare with immediate |
300 | +000000C7: 0000 NOP No operation |
301 | @000000C8: SOC_Entladetiefe |
302 | 643: .db "SOC Sommer Winter",0 |
303 | +000000C8: 4F53 SBCI R21,0xF3 Subtract immediate with carry |
304 | +000000C9: 2043 AND R4,R3 Logical AND |
305 | 643: .db "SOC Sommer Winter",0 |
306 | +000000CA: 6F53 ORI R21,0xF3 Logical OR with immediate |
307 | +000000CB: 6D6D ORI R22,0xDD Logical OR with immediate |
308 | 643: .db "SOC Sommer Winter",0 |
309 | +000000CC: 7265 ANDI R22,0x25 Logical AND with immediate |
310 | +000000CD: 5720 SUBI R18,0x70 Subtract immediate |
311 | 643: .db "SOC Sommer Winter",0 |
312 | +000000CE: 6E69 ORI R22,0xE9 Logical OR with immediate |
313 | +000000CF: 6574 ORI R23,0x54 Logical OR with immediate |
314 | 643: .db "SOC Sommer Winter",0 |
315 | +000000D0: 0072 ??? Data or unknown opcode |
316 | @000000D1: Winter_SOC |
317 | 647: .db "Winter SOC:",0 |
318 | +000000D1: 6957 ORI R21,0x97 Logical OR with immediate |
319 | +000000D2: 746E ANDI R22,0x4E Logical AND with immediate |
320 | 647: .db "Winter SOC:",0 |
321 | +000000D3: 7265 ANDI R22,0x25 Logical AND with immediate |
322 | +000000D4: 2020 AND R2,R0 Logical AND |
323 | 647: .db "Winter SOC:",0 |
324 | +000000D5: 2020 AND R2,R0 Logical AND |
325 | +000000D6: 4F53 SBCI R21,0xF3 Subtract immediate with carry |
326 | 647: .db "Winter SOC:",0 |
327 | +000000D7: 3A43 CPI R20,0xA3 Compare with immediate |
328 | +000000D8: 0000 NOP No operation |
329 | @000000D9: Sommer_SOC |
330 | 651: .db "Sommer SOC:",0 |
331 | +000000D9: 6F53 ORI R21,0xF3 Logical OR with immediate |
332 | +000000DA: 6D6D ORI R22,0xDD Logical OR with immediate |
333 | 651: .db "Sommer SOC:",0 |
334 | +000000DB: 7265 ANDI R22,0x25 Logical AND with immediate |
335 | +000000DC: 2020 AND R2,R0 Logical AND |
336 | 651: .db "Sommer SOC:",0 |
337 | +000000DD: 2020 AND R2,R0 Logical AND |
338 | +000000DE: 4F53 SBCI R21,0xF3 Subtract immediate with carry |
339 | 651: .db "Sommer SOC:",0 |
340 | +000000DF: 3A43 CPI R20,0xA3 Compare with immediate |
341 | +000000E0: 0000 NOP No operation |
342 | @000000E1: Uebergang_SOC |
343 | 655: .db "Uebergang SOC:",0 |
344 | +000000E1: 6555 ORI R21,0x55 Logical OR with immediate |
345 | +000000E2: 6562 ORI R22,0x52 Logical OR with immediate |
346 | 655: .db "Uebergang SOC:",0 |
347 | +000000E3: 6772 ORI R23,0x72 Logical OR with immediate |
348 | +000000E4: 6E61 ORI R22,0xE1 Logical OR with immediate |
349 | 655: .db "Uebergang SOC:",0 |
350 | +000000E5: 2067 AND R6,R7 Logical AND |
351 | +000000E6: 4F53 SBCI R21,0xF3 Subtract immediate with carry |
352 | 655: .db "Uebergang SOC:",0 |
353 | +000000E7: 3A43 CPI R20,0xA3 Compare with immediate |
354 | +000000E8: 0000 NOP No operation |
355 | @000000E9: Service_active1 |
356 | 660: .db "Service aktiv",0 |
357 | +000000E9: 6553 ORI R21,0x53 Logical OR with immediate |
358 | +000000EA: 7672 ANDI R23,0x62 Logical AND with immediate |
359 | 660: .db "Service aktiv",0 |
360 | +000000EB: 6369 ORI R22,0x39 Logical OR with immediate |
361 | +000000EC: 2065 AND R6,R5 Logical AND |
362 | 660: .db "Service aktiv",0 |
363 | +000000ED: 6B61 ORI R22,0xB1 Logical OR with immediate |
364 | +000000EE: 6974 ORI R23,0x94 Logical OR with immediate |
365 | 660: .db "Service aktiv",0 |
366 | +000000EF: 0076 ??? Data or unknown opcode |
367 | @000000F0: Service_not_active1 |
368 | 664: .db "Service inaktiv",0 |
369 | +000000F0: 6553 ORI R21,0x53 Logical OR with immediate |
370 | +000000F1: 7672 ANDI R23,0x62 Logical AND with immediate |
371 | 664: .db "Service inaktiv",0 |
372 | +000000F2: 6369 ORI R22,0x39 Logical OR with immediate |
373 | +000000F3: 2065 AND R6,R5 Logical AND |
374 | 664: .db "Service inaktiv",0 |
375 | +000000F4: 6E69 ORI R22,0xE9 Logical OR with immediate |
376 | +000000F5: 6B61 ORI R22,0xB1 Logical OR with immediate |
377 | 664: .db "Service inaktiv",0 |
378 | +000000F6: 6974 ORI R23,0x94 Logical OR with immediate |
379 | +000000F7: 0076 ??? Data or unknown opcode |
380 | @000000F8: LOGS |
381 | 668: .db "LOGS",0 |
382 | +000000F8: 4F4C SBCI R20,0xFC Subtract immediate with carry |
383 | +000000F9: 5347 SUBI R20,0x37 Subtract immediate |
384 | 668: .db "LOGS",0 |
385 | +000000FA: 0000 NOP No operation |
386 | @000000FB: SOC_BSS |
387 | 671: .db "BSS-SOC:",0 |
388 | +000000FB: 5342 SUBI R20,0x32 Subtract immediate |
389 | +000000FC: 2D53 MOV R21,R3 Copy register |
390 | 671: .db "BSS-SOC:",0 |
391 | +000000FD: 4F53 SBCI R21,0xF3 Subtract immediate with carry |
392 | +000000FE: 3A43 CPI R20,0xA3 Compare with immediate |
393 | 671: .db "BSS-SOC:",0 |
394 | +000000FF: 0000 NOP No operation |
395 | @00000100: LFP_Failure |
396 | 674: .db "LFP Failure",0 |
397 | +00000100: 464C SBCI R20,0x6C Subtract immediate with carry |
398 | +00000101: 2050 AND R5,R0 Logical AND |
399 | 674: .db "LFP Failure",0 |
400 | +00000102: 6146 ORI R20,0x16 Logical OR with immediate |
401 | +00000103: 6C69 ORI R22,0xC9 Logical OR with immediate |
402 | 674: .db "LFP Failure",0 |
403 | +00000104: 7275 ANDI R23,0x25 Logical AND with immediate |
404 | +00000105: 0065 ??? Data or unknown opcode |
405 | @00000106: LFP_Failure_COM |
406 | 677: .db "LFP COM. Fail",0 |
407 | +00000106: 464C SBCI R20,0x6C Subtract immediate with carry |
408 | +00000107: 2050 AND R5,R0 Logical AND |
409 | 677: .db "LFP COM. Fail",0 |
410 | +00000108: 4F43 SBCI R20,0xF3 Subtract immediate with carry |
411 | +00000109: 2E4D MOV R4,R29 Copy register |
412 | 677: .db "LFP COM. Fail",0 |
413 | +0000010A: 4620 SBCI R18,0x60 Subtract immediate with carry |
414 | +0000010B: 6961 ORI R22,0x91 Logical OR with immediate |
415 | 677: .db "LFP COM. Fail",0 |
416 | +0000010C: 006C ??? Data or unknown opcode |
417 | |
418 | |
419 | |
420 | |
421 | |
422 | @0000010D: init |
423 | 684: ldi temp, HIGH(RAMEND) ; HIGH-Byte der obersten RAM-Adresse |
424 | +0000010D: E058 LDI R21,0x08 Load immediate |
425 | 685: out SPH, temp |
426 | +0000010E: BF5E OUT 0x3E,R21 Out to I/O location |
427 | 686: ldi temp, LOW(RAMEND) ; LOW-Byte der obersten RAM-Adresse |
428 | +0000010F: EF5F SER R21 Set Register |
429 | 687: out SPL, temp |
430 | +00000110: BF5D OUT 0x3D,R21 Out to I/O location |
431 | . |
432 | . |
433 | . |
434 | . |
435 | . |
:
Bearbeitet durch User
Dom schrieb: > Georg G. schrieb: >> Wenn du im Programmlauf auf Daten als Code landest, ist in den meisten >> (99%) Fällen dein Stack korrupt. > > Ich lande ja nicht im Programmlauf auf Daten. Der Simulator sagt aber etwas anderes. Den interessiert doch nicht, was da alles im Flash steht. Der SImulator geht einfach her und simuliert die CPU: Befehl aus der Stelle im Speicher holen, dessen Adresse im Programm Counter steht. Programm Counter erhöhen und Befehl dekodieren. Und im letzten Schritt ist er auf einen Befehl gestossen, den es im AVR nicht gibt und den er von der Adresse 0x0001e1 geladen hat um ihn auszuführen. Das ist die Bedeutung von > AVR Simulator: Invalid opcode 0x0064 at address 0x0001e1 Das es andere Stellen in deinem Flash gibt, welche keine gültigen Befehle kodieren, das ist dem Simulator solange völlig wurscht, solange er sie nicht dekodieren braucht, was im Normalfall nur dann der Fall ist, wenn der Simulator aufgrund des Programmablaufs genau diese Bytes aus dem Flash laden muss um sie als Befehl auszuführen. > Ich verstehe jetzt nicht > ganz warum die .db ein Symptom sein sollen. Weil, wenn alles in deinem Programm glatt geht, der Simulator in erster Linie überhaupt nicht in die Verlegenheit kommt, diese Bytes als Befehl auffassen zu müssen. Das er es tut zeigt, dass dein Programmlauf ihn auf diese Stelle geführt hat. > Der Code vom Disassembler Der Dissassembler interessiert eigentlich nicht. Das der nicht alles korrekt disassemblieren kann, ist nichts neues. Was interessiert ist, warum der Programmlauf genau an diese Bytes gelangt und diese Bytes als nächsten Befehl interpretieren muss. Eben der RJMP mitten in die Text-Bytes hinein. Das ist die entscheidende Fragestellung, wie es dazu kommt, dass der Programm-Counter die Adresse dieser Bytes bekommt. > Warum? Woher ist das bekannt? Ich denke, so recht hast du nicht wirklich verstanden was da los ist. Anderes Beispiel:
1 | func:
|
2 | LDI R16, 0x05 |
3 | PUSH R16 |
4 | LDI R16, 0x01 |
5 | PUSH R16 |
6 | RET
|
Was macht die Sequenz?
Sie legt nacheinander die Bytes 0x05 und 0x01 auf den Stack. Was macht
daher der RET? Er holt sich genau diese beiden Bytes vom Stack und macht
den Sprung zur Adresse 0x0501. Und zwar ohne dass es im ganzen Programm
einen dezidierten RJMP zu dieser Adresse gäbe. Man kann das auch noch
verkomplizieren. Lass einen PUSH weg (oder mach 1 POP dazu) und die
Rücksprung Adresse des RET besteht aus einem Byte, das du selber auf den
Stack gelegt hast und einem Byte, welches schon am Stack war. Wo dieser
Spring hingeht, das alles ist nicht mehr wirklich vorherbestimmbar. In
deinem Fall landest du (wie auch immer das tatsächlich passiert bzw.
entsteht) dann eben mitten in den Text-Byte. Bytes die nie dazu gedacht
waren, jemals als Befehl ausgeführt zu werden. Das ist aber relativ
wurscht, denn das Problem sind nicht die Text-Bytes an einem .DB. Das
Problem besteht darin, dass der Sprung an die völlig falsche Stelle
geht.
Du bellst zur Zeit den falschen Baum an indem du dich auf die Meldung
mit dem invalid opcode versteifst. Diese Meldung ist nur das Symptom.
Die eigentliche Frage lautet: wie kommt es dazu, dass diese Bytes
überhaupt als Befehl ausgeführt werden wollen? Auf welch dubiosen Wegen
ist der Programmcounter überhaupt an diese Stelle gekommen.
> Ich habe euch den Afangscode vom Disassembler mitgeschickt.
Interessiert keinen.
Poste deinen Original-Code oder lass es.
Das eigentliche Problem zu finden ist schon schwer genug. Da brauchen
wir nicht auch noch Prügel zwischen die Beine in Form von Dissassembler
Output, der logischerweise nicht vollständig korrekt sein kann, weil der
Disassembler nun mal keine Ahnung davon hat, welche Bytes jetzt
eigentlich wirklich Code sind und welche Daten. Entscheidend ist, dass
der Simulator zur Laufzeit in die Verlegenheit kommt, diese Bytes als
Befehl auffasen zu müssen, weil er den Befehl abarbeiten soll. Die
spannende Frage lautet: warum ist das so? Die Antwort darauf findest du
aber nicht im Disassembler.
:
Bearbeitet durch User
Hi, Versuche es doch bitte mal mit den Direktiven .dseg und .cseg um zwischen Daten und Code zu unterscheiden. viel Erfolg,Uwe
Uwe schrieb: > Hi, > Versuche es doch bitte mal mit den Direktiven .dseg und .cseg um > zwischen Daten und Code zu unterscheiden. Ist auch kein Allheilmittel, weil die Zugriffe anders sind. Er hat offenbar fixe Texte im Flash, die dann mit entsprechenden Ausgabefunktionen ausgegeben werden. Das alles ist schon in Ordnung. Aber er hat noch ein Problem im Code, das erst mal gefunden werden will. Und dieses Problem hat ganz sicher nichts mit den Texten an sich zu tun. Hilft nichts. Da muss man Codestudium betreiben und rausfinden, auf welchem Weg er sich (möglicherweise) seinen Stack zerschiesst. Meistens ist es ein Stack-Problem, wenn man so ein Symptom hat. @Dom Kennst du den Hallervorden Sketch von der 'Kuh Elsa'? Genau in der Situation bist du. Der Simulator sagt dir, dass die Kuh Elsa gestorben ist. Das eigentliche Problem ist aber, dass die Frau des Grafen verstorben ist. Du versuchst gerade panisch heraus zu finden, ob die Kuh Elsa krank war, weil sie doch gestorben ist. http://de.wikipedia.org/wiki/Die_Kuh_Elsa http://www.didipage.de/service/sketche/diekuhelsa/index.html
:
Bearbeitet durch User
Karl Heinz schrieb: > Und im letzten Schritt ist er auf einen Befehl gestossen, den es im AVR > nicht gibt und den er von der Adresse 0x0001e1 geladen hat um ihn > auszuführen. Das heißt aber nur dass er einen falschen Befehl bzw. einen Befehl den es nicht gibt ausführt der an der Adresse 0x0001e1 steht, macht aber dann normal im Programm weiter wo er den Befehl geladen hat? Das heißt dass er zb. statt einem normalen ret was er machen und aus der Routine zurück springen sollte, den Sprung auf die Adresse 0x0001e1 macht und dort versucht das als Befehl abzuwicklen was aber eben ein INVALID OPCODE IST. Und wo macht das Programm dann weiter nachdem er den Befehl 0x0001e1 geladen hat? Unter dem Befehl ret, den es normal hätte ausführen sollen? Stimmt das so?
Hi, >+000001DC: 614C ORI R20,0x1C Logical OR with >immediate >+000001DD: 6564 ORI R22,0x54 Logical OR with >immediate >995: .db "Ladezustand",0 >+000001DE: 757A ANDI R23,0x5A Logical AND with >immediate >+000001DF: 7473 ANDI R23,0x43 Logical AND with >immediate >995: .db "Ladezustand",0 >+000001E0: 6E61 ORI R22,0xE1 Logical OR with >immediate >+000001E1: 0064 ??? Data or unknown opcode Wenn ich mal übersetzen darf: L=$4C a=$61 d=$64 e=$65 z=$7A u=$75 s=$73 t=$74 a=$61 n=$6E d=$64 0=$00 Der Disassembler weiss nur leider nichts von Text(.dseg) und versucht den Text als Code zu deuten, Das muss schiefgehen. Die Frage ist eigentlich: >Habe dann im Laufe irgendwann mehrere >Fehlermeldungen bekommen: >AVR Simulator: Invalid opcode 0x0064 at address 0x0001e1 Wann, bei welcher Gelegenheit ist denn der Fehler aufgetreten? Beim Assemblieren? Da hilft .dseg Beim Stepbetrieb? Dann hast du einen Programmfehler oder nicht alle Daten(zb.EEProm)geladen. Viel Erfolg, Uwe
> Und wo macht das Programm dann weiter nachdem er den Befehl 0x0001e1 > geladen hat? Unter dem Befehl ret, den es normal hätte ausführen sollen? Nein. Was danach passiert, hängt von diesem falschen Befehl ab...
Svenska schrieb: > Nein. Was danach passiert, hängt von diesem falschen Befehl ab... Das ist klar nur, wenn er den Befehl nicht versteht, also Invalid opcode schreibt, was macht er dann.
Dom schrieb: > Svenska schrieb: >> Nein. Was danach passiert, hängt von diesem falschen Befehl ab... > > > Das ist klar nur, wenn er den Befehl nicht versteht, also Invalid opcode > schreibt, was macht er dann. Das wissen nur die Entwickler bei Atmel, was die CPU dann macht. Da kann alles mögliche passieren, je nachdem was die Befehlsdekodierung im Chip tatsächlich mit dieser Bitkombination anstellt. Aber: DIe Frage ist irrelevant. Das ist kein definierter offizieller Befehl. Du darfst es nie dazu kommen lassen, dass die CPU diesen 'Befehl' (der keiner ist) ausführt. Egal wie oft du noch mit dem Fuss aufstampfst und 'Ich will aber nicht den Fehler suchen' rufst. Wenn du dich mit solchen Problemen nicht rumschlagen willst, dann programmier in einer Hochsprache oder leg dir mehr Sorgfalt in der Assemblerprogrammierung zu. Jetzt aber hast du ein Problem in deinem Code, das behoben werden muss. Da führt kein Weg drann vorbei. > wenn er den Befehl nicht versteht, also Invalid opcode schreibt, > was macht er dann. Das ist ein Service des Simulators, dass er dieses mitteilt. Was die echte CPU damit macht .... irgendwo in der Instruction Set Doku könnte darüber etwas stehen. Ich würde davon ausgehen, dass es undefiniert ist, was dann tatsächlich passiert. Es spielt auch keine wirkliche Rolle. Du versuchst gerade (bildlich gesprochen) eine Division durch 0 zu legitimieren, indem du dich davor drückst rauszufinden, wie es dazu kommen konnte, dass der Divisor 0 ist. Wie können stundenlang darüber diskutieren, ob das Ergebnis der Division 5 oder 12 sein sollte. Fakt ist, dass du nicht durch 0 dividieren darfst und daher rückverfolgen musst, wie es zu dieser 0 gekommen ist.
:
Bearbeitet durch User
Karl Heinz schrieb: > Aber: DIe Frage ist irrelevant. Das ist kein definierter offizieller > Befehl. Du darfst es nie dazu kommen lassen, dass die CPU diesen > 'Befehl' (der keiner ist) ausführt. Egal wie oft du noch mit dem Fuss > aufstampfst und 'Ich will aber nicht den Fehler suchen' rufst. > > Wenn du dich mit solchen Problemen nicht rumschlagen willst, dann > programmier in einer Hochsprache oder leg dir mehr Sorgfalt in der > Assemblerprogrammierung zu. Jetzt aber hast du ein Problem in deinem > Code, das behoben werden muss. Da führt kein Weg drann vorbei. Ja es ist klar dass ich es nie dazu kommen lassen darf. Es war jetzt nur zum Verständnis. Ich hoffe ich finden den Übeltäter. Danke für eure Antworten vor allem an kbuchegg!
> AVR Simulator: Invalid opcode 0x0064 at address 0x0001e1
Für genau solche (und ein paar andere) Problemchen wurden doch nun
Debugger erfunden.
Setzt halt eine Breakpoint auf die fragliche Adresse, schau dir den call
stack an, schau dir an, was da noch so auf dem Stack steht, und arbeite
dich dann rückwärts zum Problem durch.
So schwierig ist das doch nun wirklich nicht.
Falls das 4er Studio keine breakpoints auf beliebige Adressen setzen
kann (ich hab damit lange nichts mehr gemacht), nimm halt das aktuelle
6.1
Oliver
Oliver S. schrieb: > Setzt halt eine Breakpoint auf die fragliche Adresse, schau dir den call > stack an, schau dir an, was da noch so auf dem Stack steht, und arbeite > dich dann rückwärts zum Problem durch. Für solche Fälle hätte ich mir schon oft gewünscht, dass die Simulatoren einen Trace der letzten 50 (oder so) ausgeführten Befehle samt ihren Adressen hätten, so dass man wenigstens rückverfolgen kann, wie und von wo man zur fraglichen Stelle gekommen ist.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.