Hallo Es geht um die erste Zeile im deassemblierten Code der angegebenen C-Anweisung: Das L-Byte der Variable uint16_t gbc_pcnt soll also an Adresse 0x0000 stehen? Kann das sein?!? 484: if(gbc_pcnt < gbc.transmission_length){ +000005CD: 91200000 LDS R18,0x0000 Load direct from data space +000005CF: 913007FF LDS R19,0x07FF Load direct from data space +000005D1: 91800061 LDS R24,0x0061 Load direct from data space +000005D3: 91900062 LDS R25,0x0062 Load direct from data space +000005D5: 1782 CP R24,R18 Compare +000005D6: 0793 CPC R25,R19 Compare with carry +000005D7: F498 BRCC PC+0x14 Branch if carry cleared Gruss Michael
LDS R18,0x0000 Ja, das kann sein: An Adresse 0x0000 liegt bei einem AVR gerade R0. Auf die nächste Anweisung LDS R19,0x07FF kann ich allerdings ohne Angabe des Controllers nicht interpretieren.
> LDS R19,0x07FF > kann ich allerdings ohne Angabe des Controllers nicht interpretieren. Jepp, das fiel mir soeben auch auf. Da nämlich die Adresse 0x07FF ganz zuoberst in meinem Mega32 ist (der hat 2048 Bytes RAM, oberste Adresse = 0x07FF). Keine Ahnung, wie der Compiler auf die hirnrissige Idee kommt, die Variable ganz nach oben zu setzen. Das RAM ist zwar gut gefüllt, aber kaum über 1500 Bytes. Allerdings: Wenn ich ein grosses Array auskommentiere bzw. nur die Schreibzugriffe darauf, dann funktioniert mein Programm. Die fragliche Variable bleibt aber an gleicher Position 0x07FF.
Ohrfeigen sollte man mich! Ich habe schlicht und einfach vergessen, ein fast 2kB grosses Array aus einem früheren Testlauf zu entfernen. Kein Wunder, ist da das RAM irgendann überfüllt.
Nein, 0x7FF ist nicht das Ende des RAMs, das liegt bei einem Mega32 erst bei 0x85F, da er ja erst bei 0x60 anfängt. 0x7FF kann also gut ein Teil des Stacks sein. Das lowbyte holt er sich dann aus dem tmp-Register, das highbyte aus dem ram. Die zweite geladene Variable liegt hingegen ganz am Anfang des RAM, ich würde also schätzen, es handelt sich hierbei um eine am Anfang initialisierte Variable, die fest im Ram liegt und nicht auf dem Stack.
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.