尝试在较旧的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
答案 0 :(得分:1)
不要在指令之间放置对齐,因为这可能会在指令流中添加额外的数据,这是不好的。无论如何,指令是对齐的,这是你已经想到的。
你的代码需要在str之后做一些事情,否则它只是徘徊(执行int)垃圾或那些代码之后的任何东西,最终可能会运行到最后并触及预取中止......如果你的工具允许这样做那么放:
b .
,否则
label: b label