Forum: Mikrocontroller und Digitale Elektronik Frage zu Sections


von Andreas P. (andreas_p71)


Lesenswert?

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
von Andreas P. (andreas_p71)


Lesenswert?

Hat keiner eine Idee??

lg
Andy
von Karl H. (kbuchegg)


Lesenswert?

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.
von Andreas P. (andreas_p71)


Lesenswert?

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
von Andreas P. (andreas_p71)


Angehängte Dateien:

Lesenswert?

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
von Rainer S. (rsonline)


Lesenswert?

Versuch mal die zweite Variable mit einem anderen Wert (z.B. 0xDCBA) zu 
initialisieren und schau dann was passiert.
von Andreas P. (andreas_p71)


Lesenswert?

Hallo,
Danke, aber nichts passiert.... ist genau dasselbe Verhalten. Wie kommst 
du auf diese Maßnahme??

mfg
Andy
von Andreas P. (andreas_p71)


Lesenswert?

Hat noch wer einen Tipp??

lg
Andy
von Thomas E. (thomase)


Lesenswert?

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.
von Andreas P. (andreas_p71)


Lesenswert?

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
von Peter II (Gast)


Lesenswert?

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.
von spess53 (Gast)


Lesenswert?

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
von Stefan E. (sternst)


Lesenswert?

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.
von Thomas E. (thomase)


Lesenswert?

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.
von Andreas (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.