微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > ARM技术讨论 > ARM启动代码分析中两处疑问,欢迎探讨

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 )?因为我这里只是分析原码还没有代码可以执行,所以请教。

对于第一点,不很明白,我再想想……

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top