ARM内存地址

时间:2014-05-13 01:39:23

标签: assembly arm microcontroller

尝试在较旧的LPC2148微控制器上写入内存地址时遇到问题。我曾尝试从http://www.keil.com/dd/docs/datashts/philips/lpc2141_42_44_46_48.pdf写入内存映射的几个不同部分(第6.4节),例如板载非易失性,静态等。我也尝试过STMDB到堆栈(0x40000000?)但是调试器将我发送到PrefetchAbort(预计如果内存不可访问)。

我对记忆图的了解不明白?

是否有全局默认值?我不能使用在创业公司宣布的任何一个。

如何专门写入堆栈? (使用STMFD或STMDB / STMIA)?

[STACK ATTEMPT] *使用与下面相同的启动文件 - 完全降序堆栈

LDR r1, =19
LDR r2, =20
STMDB SP, { r1, r2 }

[ERROR]

*** error 65: access violation at 0x00000000 : no 'write' permission

以下是启动后最简单的代码:

[MAIN] *(ALIGNS由于对齐错误而放置在那里,但如果删除则没有区别)

    GLOBAL user_code
AREA mycode, CODE, READONLY 

user_code
 LDR r1, =0x400000000
 ALIGN
 LDR r2, =19
 ALIGN
 STR r2, [r1]
 ALIGN
 END

[STARTUP]

; Standard definitions of Mode bits and Interrupt (I & F) flags in PSR s
Mode_USR EQU 0x10
I_Bit EQU 0x80 ; when I bit is set, IRQ is disabled
F_Bit EQU 0x40 ; when F bit is set, FIQ is disabled
;Defintions of User Mode Stack and Size
USR_Stack_Size EQU 0x00000100
;USR_Stack_Size EQU 0x7FFF
SRAM EQU 0x40000000
Stack_Top EQU SRAM+USR_Stack_Size

    AREA RESET, CODE, Readonly
    ENTRY ; The first instruction to execute follows
    ARM
    IMPORT user_code
VECTORS
    LDR PC, Reset_Addr
    LDR PC, Undef_Addr
    LDR PC, SWI_Addr
    LDR PC, PAbt_Addr
    LDR PC, DAbt_Addr
    NOP
    LDR PC, IRQ_Addr
    LDR PC, FIQ_Addr
Reset_Addr DCD user_code
Undef_Addr DCD UndefHandler
SWI_Addr DCD SWIHandler
PAbt_Addr DCD PAbtHandler
DAbt_Addr DCD DAbtHandler
    DCD 0
IRQ_Addr DCD IRQHandler
FIQ_Addr DCD FIQHandler
SWIHandler B SWIHandler
PAbtHandler B PAbtHandler
DAbtHandler B DAbtHandler
IRQHandler B IRQHandler
FIQHandler B FIQHandler
UndefHandler B UndefHandler
    ; Enter User Mode with interrupts enabled
MOV r14, #Mode_USR
BIC r14,r14,#(I_Bit+F_Bit)
MSR cpsr_c, r14
;initialize the stack, full descending
LDR SP, =Stack_Top
;load start address of user code into PC
LDR PC, =user_code
;IMPORT Reset_Handler
END

[ERROR]

Non-aligned Access: ARM Instruction at 00000080H, Memory Access at 00000013H
*** error 65: access violation at 0x00000013 : no 'write' permission

1 个答案:

答案 0 :(得分:1)

不要在指令之间放置对齐,因为这可能会在指令流中添加额外的数据,这是不好的。无论如何,指令是对齐的,这是你已经想到的。

你的代码需要在str之后做一些事情,否则它只是徘徊(执行int)垃圾或那些代码之后的任何东西,最终可能会运行到最后并触及预取中止......如果你的工具允许这样做那么放:

b .

,否则

label: b label