本帖最后由 xlsbz 于 2010-5-27 22:09 编辑
弄的是AT91SAM7A3的。没有操作系统。
下面是启动代码关于设置模式的结尾部分
// Enter Supervisor Mode and set its Stack Pointer
MSR CPSR_c, #Mode_SVC|I_Bit|F_Bit
MOV SP, R0
SUB R0, R0, #SVC_Stack_Size
// Enter User Mode and set its Stack Pointer
MSR CPSR_c, #Mode_USR //启动IRQ FIQ
MOV SP, R0
// Enter the C code
LDR R0,=?C?INIT
TST R0,#1 ; Bit-0 set: main is Thumb
LDREQ LR,=exit?A ; ARM Mode
LDRNE LR,=exit?T ; Thumb Mode
BX R0
ENDP
然后进入main函数
void main (void)
{
//打算在这里禁止IRQ FIQ
//打算在这里初始化串口啊之类的
//打算在这里开启IRQ FIQ
while (1){
代码
}
}
我们知道 最主要是 要修改CPSR寄存器。并且一定要从特权模式修改。
请问大家关于模式转换有什么好的建议么?
====================================================
====================================================
比如说弄成这样行不行?(我对Supervisor不怎么了解)
// Enter Supervisor Mode and set its Stack Pointer
MSR CPSR_c, #Mode_SVC //禁止IRQ FIQ
MOV SP, R0
// Enter the C code
LDR R0,=?C?INIT
TST R0,#1 ; Bit-0 set: main is Thumb
LDREQ LR,=exit?A ; ARM Mode
LDRNE LR,=exit?T ; Thumb Mode
BX R0
ENDP
然后进入main函数
void main (void)
{
//设置为Supervisor并禁止IRQ FIQ
//打算在这里初始化串口啊之类的
//设置为user模式并开启IRQ FIQ
while (1){
代码
}
}
==========================================================================
大家都是怎么弄的?
多谢!!! |