Gast
#1207171
Hallo Zusammen,
ich habe ein Probklem bei der initialisierung des AT91SAM7X. Ich benute
ihn zusammen mit dem RTOS freeRTOS, wobei ich mir dazu ein Beispiel von
der freeRTOS Seite runtergeladen habe. Als Tipp steht hier ein
bestehendes beispiel so zu ändern, dass man es auf die eigenen
Bedürfnisse anpasst.
Gesagt, getan.
Funktioniert sowiet, bis auf den Remap befehl. Um die maximale
Performance zu erreichen will ich den Code aus dem RAm laufen lassen und
musss dazu den Speicherbreich remappen. Hierzu copiere ich den gesamten
Code aus dem Flash in den RAM und setzte dann das Remap Bit.
memcpy(0x00200000,0x00100000,0x2000);
AT91C_BASE_MC->MC_RCR = AT91C_MC_RCB;
Das ganze mache ich in der LowLevelInit.c, welche nach den Befehlen mit
dem Wort SECTION ausgeführt wird (siehe unten).
Von den Speicherbereichen passt das soweit auch noch, nur dass ich mir
damit selber die Beine wegziehe und mir damit meine verschiedenen Stacks
überschreibe. In der CStartup.s Datei, in welcher die Stacks
initialisiert werden steht ein Befehl den ich nicht verstehe.
Evtl. kann mir jeamnd diesen Erklären:
Ich kopier hier mal einen größeren Zusammenhang...
;-----------------------------------------------------------------------
-------
; ?INIT
; Program entry.
;-----------------------------------------------------------------------
-------
SECTION FIQ_STACK:DATA:NOROOT(3) ??????
SECTION IRQ_STACK:DATA:NOROOT(3) ??????
SECTION SVC_STACK:DATA:NOROOT(3) ??????
SECTION ABT_STACK:DATA:NOROOT(3) ??????
SECTION UND_STACK:DATA:NOROOT(3) ??????
SECTION CSTACK:DATA:NOROOT(3) ??????
SECTION text:CODE:NOROOT(2) ??????
REQUIRE __vector ??????
EXTERN ?main ??????
PUBLIC __iar_program_start ??????
EXTERN AT91F_LowLevelInit ??????
__iar_program_start:
;-----------------------------------------------------------------------
-------
;- Low level Init is performed in a C function: AT91F_LowLevelInit
;- Init Stack Pointer to a valid memory area before calling
AT91F_LowLevelInit
;-----------------------------------------------------------------------
-------
;- Retrieve end of RAM address
ldr r13,=TOP_OF_MEMORY ;- Temporary stack
in internal RAM for Low Level Init execution
ldr r0,=AT91F_LowLevelInit
mov lr, pc
bx r0 ;- Branch on C
function (with interworking)
; Initialize the stack pointers.
; The pattern below can be used for any of the exception stacks:
; FIQ, IRQ, SVC, ABT, UND, SYS.
; The USR mode uses the same stack as SYS.
; The stack segments must be defined in the linker command file,
; and be declared above.
mrs r0,cpsr ; Original
PSR value
bic r0,r0,#MODE_BITS ; Clear the
mode bits
orr r0,r0,#SVC_MODE ; Set SVC
mode bits
msr cpsr_c,r0 ; Change the
mode
ldr sp,=SFE(SVC_STACK) ; End of
SVC_STACK
bic r0,r0,#MODE_BITS ; Clear the mode
bits
orr r0,r0,#UND_MODE ; Set UND
mode bits
msr cpsr_c,r0 ; Change the
mode
ldr sp,=SFE(UND_STACK) ; End of
UND_STACK
bic r0,r0,#MODE_BITS ; Clear the
mode bits
orr r0,r0,#ABT_MODE ; Set ABT
mode bits
msr cpsr_c,r0 ; Change the
mode
ldr sp,=SFE(ABT_STACK) ; End of
ABT_STACK
bic r0,r0,#MODE_BITS ; Clear the
mode bits
orr r0,r0,#FIQ_MODE ; Set FIQ
mode bits
msr cpsr_c,r0 ; Change the
mode
ldr sp,=SFE(FIQ_STACK) ; End of
FIQ_STACK
;- Init the FIQ register
ldr r8, =AT91C_BASE_AIC
bic r0,r0,#MODE_BITS ; Clear the
mode bits
orr r0,r0,#IRQ_MODE ; Set IRQ
mode bits
msr cpsr_c,r0 ; Change the
mode
ldr sp,=SFE(IRQ_STACK) ; End of
IRQ_STACK
bic r0,r0,#MODE_BITS ; Clear the
mode bits
orr r0,r0,#SYS_MODE ; Set System
mode bits
msr cpsr_c,r0 ; Change the
mode
ldr sp,=SFE(CSTACK) ; End of
CSTACK
;-----------------------------------------------------------------------
-
Hab die komplette Startup Datei nochmal als Anhang dran gehangen.
Meine Fragen jetzt:
Wo werden den die Stacks hingelegt (Speicherbereich)? Und wie kann, bzw.
muss ich sie legen, damit ich sie mit dem Remap Befehl nicht
überschreibe und es trotzdem funktioniert?
Hoffe jemand kann mir da helfen.
Viele Dank schonmal im Vorraus
MfG
Stefan