作者:刘老师,华清远见嵌入式学院讲师。
启动代码的一般作用
1、堆和栈的初始化;
2、向量表定义;
3、地址重映射及中断向量表的转移;
4、初始化有特殊要求的断口;
5、处理器模式;
6、进入C应用程序。
ARM复位后程序从0x00地址开始执行代码,所以一般都会有将Flash地址映射到0x00的过程。但对于这一款Cortex M0的启动代码比较简单,从存储分布图中我们可以看到LPC11C14拥有32K的片内Flash,地址范围是0x0000 0000 ~ 0x0000 8000,,当我们将程序(小于32K)烧写进片内Flash时,启动代码中就可以不用再对Flash的地址重新映射。
NXP LPC11C14存储分布图主要看Flash
CortexM0的启动代码进行分析:
一、堆栈初始化部分
在程序开始处,首先定义栈的大小及属性,然后对堆进行初始化操作,ARM-Thumb过程调用标准和ARM、Thumb C/C++ 编译器总是使用满减(Full descending)类型堆栈。
; <h> Stack Configuration
; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; <h> Stack Configuration; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>; </h>Stack_SizeEQU0x00000020//定义堆栈大小AREA STACK, NOINIT, READWRITE, ALIGN=3//定义一个数据段按8个字节对齐 AREA伪指令用于定义一//个代码段或者数据段//NOINIT定义此数据段仅仅保留了内存单元,而没有将各初//始值写入内存单元,或者将各个内存单元值初始化为0Stack_MemSPACE Stack_Size//保留Stack_Size 大小的堆栈空间,来分配连续Stack_Size//节的存储单元并初始化为0__initial_sp//标号–堆栈顶部地址。M0中堆栈式满递减堆栈,堆栈指针位//于堆栈的高地址Stack_SizeEQU0x00000020//定义堆栈大小; <h> Heap Configuration; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>; </h>Heap_SizeEQU0x00000000// 定义堆空间大小AREA HEAP, NOINIT, READWRITE, ALIGN=3// 定义了一个数据段,8字节对齐__heap_base// 标号–代表为堆末底部地址Heap_MemSPACE Heap_Size// 保留Heap_Size的堆空间__heap_limit// 标号–堆的界限地址PRESERVE8// 指令指定当前文件保持堆栈8字节对齐。它设置PRES8编译属性,以//通知链接器。链接器检查要求堆栈8字节对齐的任何代码是否仅由保持//堆栈8字节对齐的代码直接或者间接地调用。THUMB//指示编译器以后的伪指令为Thum指令
二、中断量表定义
在MDK生成分散加载文件中,RESET被设置在flash的0地址处,这样就规定了向量表的地址。
人之所以有一张嘴,而有两只耳朵,原因是听的要比说的多一倍。