ARM启动代码分析中两处疑问,欢迎探讨
时间:10-02
整理:3721RD
点击:
启动代码见网页:http://wenku.baidu.com/link?url=Li0nr7sH3AeVjXtbOuP4wmxYTypsol0-1wnLkSFt6bJDMzHYtpD7tQFJ0BZd-Q3hY3vQpZi4ZaDjsn8KevVGKbQun_H7yRtbcWIunHvyoaG
其中有个地方:
1、
#软中断处理代码
SWI_Exception:
STMFD SP!, {R2-R3,LR} //把R2,R3,LR值入栈
#0号软中断的处理程序
CMP R0, #0 //将R0和0比较
//以下4行带EQ条件的代码均为当R0为0时应该执行的语句
MRSEQ R2, SPSR //把SPSR读入到R2中
STREQ R2, [R1] //把R2的值存入到[R1]中
ORREQ R2, R2, #0x80 //把R2的Bit7位置1
MSREQ SPSR_c, R2 //把R2的值写入到SPSR_c中,即禁止IRQ
#1号软中断的处理程序
CMP R0, #1 //比较R0值和1
LDREQ R2, [R1] //相等则把[R1]中的数据存入R2中
MSREQ SPSR_c, R2 //相等把R2的值写入到SPSR_c中,恢复IRQ
红色标记处,为什么把SPSR保存到[R1]中,而R1指向是SP的呀,在随后的出栈操作后,SP的内容已经失控了呀?在恢复IRQ软中断时,取得的值是否还是原来的值?
2、
整段初始化代码中,没有初始化C语言中Heap的操作,那么是否会对C库函数调用产生影响?
对于你的第一点:是把spsr值保存到lr而已,为什么这么做,自己慢慢去理解
对于你的第二点:heap初始化不一定非得在启动代码体现,散转,c函数同样能初始化堆。散转的话要看*.sct文件,rt_heap.h头文件里面有初始化堆的接口函数,不要来问我怎么找这些文件
首先感谢你的回复。
对于第二点,分散加载文件中确实可以初始化Heap,网上介绍的方法(http://www.docin.com/p-117065129.html)一般都是堆和栈一起初始化的(使用ARM_LIB_HEAP 和ARM_LIB_STACK ),但是在例子代码中已经初始化过用户模式的栈,如下
---------------------------------------
#紧接着IRQ模式下的堆栈,设置超级用户下的栈顶指针
MOV SP, R0
SUB R0, R0, #SVC_Stack_Size #超级用户下的堆栈深度
#设置进入用户模式
MSR CPSR_c, #Mode_USR
---------------------------------------
是不是在分散加载文件中只需要初始化堆就可以了?(只使用ARM_LIB_HEAP ,不使用ARM_LIB_STACK )?因为我这里只是分析原码还没有代码可以执行,所以请教。
对于第一点,不很明白,我再想想……