Forum: Compiler & IDEs Memory Sections im AVR Studio


von Dummy (Gast)


Lesenswert?

Hallo,

also ich bekomm es einfach nicht hin ... wahrscheinlich bin ich 
schlichtweg zu blöd dafür.

Ich will im Flash ein Bereich für Konstanten reservieren, der an einer 
ganz bestimmten Stelle steht. Habs nun in erster Linie mit den Memory 
Settings im AVR-Studio versucht, aber meine Angaben werden ganz munter 
ignoriert. ... nachschauen tue ich mit dem Debugger AVR-Studio 4.13 
Build 528.

Ich versteh die Welt nicht mehr ...

MfG

von Sven P. (Gast)


Lesenswert?

1
; Flash-Segment:
2
.cseg
3
4
; Start-Adresse des Blocks:
5
.org 0x123
6
7
; Datenbytes:
8
.db 1, 2, 3, 4, 5
9
; Worte:
10
.dw 123, 456, 789

von Stefan E. (sternst)


Lesenswert?

Dummy wrote:

> Habs nun in erster Linie mit den Memory
> Settings im AVR-Studio versucht, aber meine Angaben werden ganz munter
> ignoriert. ... nachschauen tue ich mit dem Debugger AVR-Studio 4.13
> Build 528.

Was genau bedeutet denn "ignoriert"?
Bei 4.14 werden aus den Angaben unter "Memory Settings" jedenfalls 
korrekte Linker-Options erzeugt. Man muss nur beachten, dass bei "Memory 
Type" Flash Wort-Adressen einzutragen sind.

von Dummy (Gast)


Lesenswert?

Oh, entschuldigung ... ich versuch das Problem in C zu lösen.

das ganze müsste dann über _attribute_ ((section (".MySection"))) 
funktionieren. Nur wie gesagt, ich kann unter den Memory Settings 
MySection definieren wie ich will, die Ignoranz seitens des Compilers 
bleibt.

MfG

von Stefan E. (sternst)


Lesenswert?

Nochmal, was genau bedeutet "ignoriert"?
Poste doch mal die ausgeführte Linker-Kommandozeile.

von Dummy (Gast)


Lesenswert?

In dem Debugger des AVR-Studios kann man sich doch den Inhalt des 
Programmspeichers, des RAMs, usw. anzeigen lassen. Dort lässt sich die 
Variable, die in meine Section lege aber nicht finden.

Was meinst Du mit Linker-Kommandozeile? Wo finde ich die? Meinst Du das 
Map-File?

von Stefan E. (sternst)


Lesenswert?

Dummy wrote:
> In dem Debugger des AVR-Studios kann man sich doch den Inhalt des
> Programmspeichers, des RAMs, usw. anzeigen lassen. Dort lässt sich die
> Variable, die in meine Section lege aber nicht finden.

Das kann aber mehrere Ursachen haben, z.B. auch ein simpler 
Schreibfehler bei dem, was du unter "Memory Settings" eingetragen hast.

> Was meinst Du mit Linker-Kommandozeile? Wo finde ich die? Meinst Du das
> Map-File?

Im Build-Window gibt es mehrere Zeilen, die mit "avr-gcc.exe" beginnen. 
Poste die letzte von diesen.

von Dummy (Gast)


Lesenswert?

die letzte zeile heisst

avr-gcc.exe -mmcu=attiny2313  -Wl,-section-start=TestSec=0x200 main.o 
-o tiny2313.elf

Word-Adresse hab ich 0x0100 ... folglich ist die ByteAdresse 0x200. Das 
sitmmt also.

Das programm schaut so aus
1
#include <avr/io.h>
2
#include <avr/boot.h>
3
#include <avr/pgmspace.h>
4
5
6
7
8
  const char PROGMEM str0[4] = "1234";
9
  const char __attribute__ ((section (".TestSec"))) str1[4] = "5678";
10
11
12
int main(void)
13
{
14
  DDRB = 0xFF;
15
  unsigned char cnt;
16
17
18
  while(1)
19
  {
20
    cnt = 10;
21
    PORTB = pgm_read_byte(&str0[3]);
22
23
    while(cnt != 0)
24
      cnt--;
25
26
27
    cnt = 10;
28
    PORTB = pgm_read_byte(&str1[3]);
29
30
    while(cnt != 0)
31
      cnt--;
32
  }
33
}


Ich hab es jetzt mal durchlaufen lassen, und er gibt über PortB die 
richtigen Wert aus. Nur sehe ich nicht ob es an der richtigen Adresse 
steht.

von Dummy (Gast)


Lesenswert?

ahhh, die str1 steht unmittelbar hinter dem Programmcode an Word-Adresse 
0x6A

von Stefan E. (sternst)


Lesenswert?

> ... -Wl,-section-start=TestSec=0x200 ...

Siehst du, deine Einträge werden nicht ignoriert. ;-)

Aber laut Sourcecode heißt die Section ".TestSec", dann musst du sie 
auch so bei den "Memory Settings" eintragen.

von Dummy (Gast)


Lesenswert?

Muff, der Punkt war das Problem ... ich dacht, das gehört zu irgendeinem 
KeyWord oder soetwas. Wer denkt denn daran ... muff.

Hab vielen dank, jetzt klappt es.

MfG

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.