Hallo, Ich bin gerade dabei das AVR-Studio 5 zu testen. Ich will nun eigene Sections im Code anlegen, um statische Variablen abzulegen. Dies mache ich, indem ich in den Properties unter "Memory" eine Section anlege. Im Code selbst dann benutze ich das Keyword _attribute_ in Verbindung mit dem Namen der Section. Funktioniert auch wunderbar; nur wenn ich z.B. in main.c eine Variable in der Section anlegen und dann noch in der z.B. switch.c, dann wird nur eine der Variablen in der Section angelegt. Die andere wird unmittelbar nach dem Programmcode gespeichert. Was mach ich falsch?? Vielen Dank für eure Hilfe! mfg Andy
Die Bereitschaft zu helfen ist indirekt proportional zum Aufwand der dafür notwendig ist. Wenn du ein fertiges, kleines Beispiel zurecht machen würdest, so dass die meisten das einfach nur in ihre Entwicklungsumgebung kopieren müssen um nachzusehen was da los ist, sinkt der Aufwand für jeden potentiellen Helfer enorm. Vor allen Dingen muss er dann nicht raten, was genau du eigentlich gemacht hast.
Hallo, Ich weiß, dass es mit einem Code einfacher wäre. Ich habe noch nicht Zeit gehabt, einen zusammenzuschnippseln. Im Prinzip ist es aber ganz einfach: Ich habe in zwei c-Files globale Variabeln definiert:
1 | uint16 testVar1 __attribute__ ((section ("dataSec"))) = 0xABCD; |
"dataSec" habe ich in den Properties als Section im Flash angelegt. Nun hätte ich erwartet, dass im Flash (im Assembly) an der Stelle 0x7000 (dort habe ich die Section angelegt) zweimal hintereinander der Wert 0xABCD steht, was er aber nicht tut. Der Wert steht nur einmal dort. Der Wert der zweiten Variable wurde im Flash unmittelbar nach dem Programmcode abgelegt. Ich werde sehen, ob ich morgen ein kleines lauffähiges Programm hochladen kann. Aber vielleicht hat ja noch jemand einen Tipp. Danke! mfg Andy
Hallo, Anbei nun ein Testprojekt (in AVR Studio 5). In "SectionTest.c" wird die Variable "testVar1" in die Section "dataSection" abgelegt (Wert 0xABCD). Das passiert auch ordnungsgemäß (Wert 0xABCD an der Adresse 0x6a00). In "testRoutines.c" wird die Variable "testVar2" angelegt. Diese wird aber nicht - wie gewünscht - in der Section "dataSection", sondern unmittelbar nach dem Programmcode angelegt (Adresse 0x013A). Auch ein Auslesen über "pgm_read_word" funktioniert nicht. Ich hoffe, mir kann wer helfen... mfg Andy
Versuch mal die zweite Variable mit einem anderen Wert (z.B. 0xDCBA) zu initialisieren und schau dann was passiert.
Hallo, Danke, aber nichts passiert.... ist genau dasselbe Verhalten. Wie kommst du auf diese Maßnahme?? mfg Andy
Andreas P. schrieb: > Hat noch wer einen Tipp?? Nö. Nur die Frage, was das Ganze soll. Das, was du im Flash anlegst, ist keine Variable sondern eine Konstante. Was interessiert dich die Adresse dieser Konstante? Diese bekommt einen mehr oder weniger sinnvollen Namen und wenn sie in eine Variable geladen werden soll, sorgt der Compiler dafür, daß das auch so passiert. mfg.
Sorry, ich meinte natürlich eine Konstante. Was das für einen Sinn hat?? Wenn ich zum Beispiel weiß, wo all meine Konstanten liegen und ich deren Adressen kenne, kann ich einfach im hex-File Dinge ein- und ausschalten bzw. Werte verändern ohne den Code kompilieren zu müssen... Ich sehe das als sehr praktisch an... :) lg Andy
Andreas P. schrieb: > Wenn ich zum Beispiel weiß, wo all meine > Konstanten liegen und ich deren Adressen kenne, kann ich einfach im > hex-File Dinge ein- und ausschalten bzw. Werte verändern ohne den Code > kompilieren zu müssen... ist ja auch extrem aufwendig einfach ein make aufzurufen. Die konstanten einfach in eine Datei zu packen und sie per include zu laden. Dann kannst du sogar je Kontante eine Datei anlegen und musst überhaupt nicht wissen wo die variable steht.
Hi > kann ich einfach im >hex-File Dinge ein- und ausschalten bzw. Werte verändern ohne den Code >kompilieren zu müssen... Ich sehe das als sehr praktisch an... :) Inclusive CRC-Neuberechnung ist es dann nicht mehr ganz so praktisch. MfG Spess
Andreas P. schrieb: > Dies mache > ich, indem ich in den Properties unter "Memory" eine Section anlege. Im > Code selbst dann benutze ich das Keyword attribute in Verbindung mit > dem Namen der Section. Funktioniert auch wunderbar; nur wenn ich z.B. in > main.c eine Variable in der Section anlegen und dann noch in der z.B. > switch.c, dann wird nur eine der Variablen in der Section angelegt. Wenn du die gleiche Section in mehreren Übersetzungseinheiten benutzen willst, funktioniert dieser einfache Weg nicht mehr. Der Linker macht daraus nämlich individuelle Sections, indem er bei erneutem Auftauchen der gleichen Section dieser einen nummerierten Suffix anhängt. In einem solchen Fall musst du die Sections dann per Linker-Skript zusammenführen.
Andreas P. schrieb: > kann ich einfach im > hex-File Dinge ein- und ausschalten bzw. Werte verändern ohne den Code > kompilieren zu müssen... Ich sehe das als sehr praktisch an... :) Ja. Ist genauso praktisch, wie Daten bei einer PC-Anwendung durch Verbiegen der *.exe Datei zu speichern, anstatt sie in einem Config-File oder der Registry abzulegen. Dein Vorhaben ist fehleranfällig bis zum Geht-nicht-mehr. Überlass' sowas dem Compiler, der kann das besser als du. mfg.
Thomas Eckmann schrieb: > Was interessiert dich die Adresse dieser Konstante? Probleme zu verdrängen oder zu ignorieren, statt sie zu lösen, ist eine Strategie, die nicht immer zielführend ist. ;) @andreas_p71: Dem Linker ld muss per Linker Script mitgeteilt werden, welche Sections es gibt. Andernfalls werden für jede Quelldatei getrennte Sections angelegt, selbst dann, wenn sie namensgleich sind. Ich nehme an, dass AVR-Studio einfach die Default-Scripts verwendet und Deine Section deswegen nicht funktioniert. In dem Fall musst Du selbst Hand anlegen. Die Linker-Scripts haben die Dateiendung .x und es gibt für jeden AVR-Typ eine eigene. Du musst also die passende für Deine MCU finden und entsprechend modifizieren.
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.