MDK For LPC Startup.S记录

来源:互联网 发布:淘宝优质网店怎么搜 编辑:程序博客网 时间:2024/05/18 22:39

1、Stack_Size EQU 0x00000200
语法:标号 SPACE 表达式
作用:是一个伪指令,表示EQU左边的符号与右边的值等价,类似于C中的宏定义,不分配空间

2、AREA STACK, NOINIT, READWRITE, ALIGN=3
AREA(伪指令)
语法: AREA sectionname{,ATtr}{,ATtr}…
作用:其中sectionname是将要指定的段名,ATtr是一个或多个段属性。例子中的STACK是作为段名;NOINIT表示该段未初始化或初始化为零;READWRITE表示可读可写;ALIGN=3表示3字节对齐。

3、Stack_Mem SPACE Stack_Size
SPACE(伪指令)
语法: 标号 SPACE 表达式
作用:用于分配一片连续的存储区域,并初始化为0;例子中表示分配Stack_Size字节的连续存储单元Stack_Mem并初始化为0;

4、PRESERVE8
作用:入口8字节对齐

5、THUMB
作用:跳转到THUMB状态

6、rel_vals DCD cpu_id, cpu_ctrl, coproc_boot, coproc_stack
DCD(伪指令)
语法:标号 DCD 表达式
作用:用于分配一片连续的存储空间,并用指定的表达式初始化

7、ANDS r3, r3, r5
ANDS
语法: AND{S} 目标寄存器 操作数一 操作数二
作用:将操作数一和操作数二按位与运算,并将结果保存到目标寄存器中;S表示运算的结果会影响CPSR的标志位,如果计算结果为0,Z位将被置1,否则置0;

8、SystemInit PROC

ENDP

PROC + ENDP(伪指令)
语法: 子程序名 PROC

ENDP
作用:定义一个名为SystemInit的子程序

9、IF :LNOT::DEF:NO_CRP
标号:
:LNOT: :LNOT:A,求A的逻辑补集,相当于C语言中的!
:DEF: :DEF:A,如果A定义过,则为TRUE,否则FAULSE
这句可以分解为IF :LNOT: (:DEF:NO_CRP) 相当于#ifndef NO_CRP

Startup步骤:
1、开辟一块0x200字节大小的栈空间,并初始化为0;
2、开辟一块0x100字节大小的堆空间,并初始化为0;
3、生成向量表,向量表的开头就是栈顶的地址
4、如果没有定义NO_CRP,则开辟一个代码段,将开辟一个32位的空间并初始化为0xFFFF,代表着CRP_Level是Disable的状态
5、开辟一块空间将cpu_id, cpu_ctrl, coproc_boot, coproc_stack的地址放进去,以便后续读取操作
6、定义一个Reset_Handle的函数,直到normal_boot结束
7、从地址0xE000ED00取出cpu_id,然后跟0xc24比较,如果相等,则是M4;否则为M0+
8、从地址0x40000800读出四字节中的最低位,如果为0,则是M0+为主机,M4为从机;否则相反
9、从0x40000804读取从机启动地址,如果为0,从机进入休眠状态直到有时间将其唤醒;如果不为零,则从 0x40000808读取从机stack地址,并将sp更新为改地址后,跳转到启动地址处执行
10、主机进入normal_boot函数
11、调用SystemInit(如果被外部定义的话)对chip或Board进行初始化
12、调用__main函数
13、__main函数主要有两个功能,一个是将需要在RAM中运行的代码拷贝过去,一个是初始化堆栈

0 0
原创粉丝点击