Hallo zusammen! Ich hab schon ein paar Stunden mit der Suche im Internet zu meinem Problem verbacht, hab aber nix gescheites gefunden! Vielleicht könnt ihr mir ja weiterhelfen! Ich habe einen AT90CAN128 an dessen Speicherbus ein externes RAM ist! Wenn ich das richtig verstanden habe, lässt sich dieses dann über die Adressen 0x1100 bis 0xFFFF ansprechen. Ich würde nun gern den .data Bereich oder zumindest einige recht große Arrays in den externen Speicher verschieben! Wenn ich beim AVRStudio eine Section anlege, die .exram heisst, als SRAM konfiguriert ist und an der Adresse 0x1100 beginnt und dann hinter mein Array _attribute_ ((section (".exram"))) schreibe, kann ich das erzeugte HEX-File nicht mehr auf meinen AVR laden. Es kommt zu einer Fehlermeldung, dass der Inhalt der Datei nicht zu meinem Device passen würde. Wenn ich auf gleichem Wege eine Section "anlege" die .data heisst, als SRAM konfiguriert ist und an der Adresse 0x1100 beginnt, kommt diese Fehlermeldung nicht! Sind nun alle meine Variablen im externen Speicher oder lieg ich da generell falsch! Irgendwie kapier ich das glaub ich ned! Wie benutz ich denn nun das externe Ram für meine Variablen, damit das interne SRAM für den Stack da is? Auf jeden Fall schon mal Danke für eure Hilfe und eure Antworten! MfG Max
Ich mache es über die .init Sctions und den Linker, weil das im AVR-Studio auch nicht funktioniert hat. http://www.nongnu.org/avr-libc/user-manual/mem_sections.html Folgende Linker Section legt die Data-Area ab 0x1000 fest: -Wl,--section-start=.data=0x801000,--defsym=__heap_end=0x80ffff Folgende Code-Sequenzen stehen ganz oben im Code: Externen Speicher in .init1 deklarieren:
1 | //-------------------------------------------------------------------
|
2 | // .init1
|
3 | //
|
4 | // used to enable external ram in XMCRA register
|
5 | // also possible at top of main()
|
6 | //
|
7 | // Following linker section is necessary to set .data area:
|
8 | //
|
9 | // -Wl,--section-start=.data=0x801000,--defsym=__heap_end=0x80ffff
|
10 | //
|
11 | //-------------------------------------------------------------------
|
12 | void my_init_external_ram (void) __attribute__ ((naked)) \ |
13 | __attribute__ ((section (".init1"))); |
14 | |
15 | void my_init_external_ram(void) |
16 | {
|
17 | // enable external sram
|
18 | XMCRA |= (1 << SRE); |
19 | |
20 | // one wait states for read/write upper sector
|
21 | // XMCRA |= (1 << SRW10) | (0 << SRW11);
|
22 | |
23 | // two wait states for read/write upper sector
|
24 | XMCRA |= (0 << SRW11) | (1 << SRW11); |
25 | |
26 | // two wait states for read/write upper sector
|
27 | // one wait state befor driving out new address
|
28 | // XMCRA |= (1 << SRW11) | (1 << SRW10);
|
29 | |
30 | XMCRA &= ~(1 << SRW11); |
31 | }
|
Den Stack-Pointer in .init3 auf 0x09FF legen:
1 | //-------------------------------------------------------------------
|
2 | // .init3
|
3 | //
|
4 | // used to set the stack pointer to 0x09FF (4096)
|
5 | // cause .data area reach from 0x1000 to 0xFFFF (4096..65535)
|
6 | //
|
7 | // Following linker section is necessary to set .data area:
|
8 | //
|
9 | // -Wl,--section-start=.data=0x801000,--defsym=__heap_end=0x80ffff
|
10 | //
|
11 | //-------------------------------------------------------------------
|
12 | void my_init_stack_pointer (void) __attribute__ ((naked)) \ |
13 | __attribute__ ((section (".init3"))); |
14 | |
15 | void my_init_stack_pointer (void) |
16 | {
|
17 | // stack-pointer at 0x09FF
|
18 | asm volatile("ldi r29, 0x09"::); |
19 | asm volatile("out __SP_H__,r29"::); |
20 | asm volatile("ldi r28, 0xFF"::); |
21 | asm volatile("out __SP_L__,r28"::); |
22 | }
|
Vieleicht hilft Dir das.
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.