Cortex-M0(NXP LPC11C14)启动代码分析

作者:刘老师,华清远见嵌入式学院讲师。

启动代码的一般作用

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地址处,这样就规定了向量表的地址。

人之所以有一张嘴,而有两只耳朵,原因是听的要比说的多一倍。

Cortex-M0(NXP LPC11C14)启动代码分析

相关文章:

你感兴趣的文章:

标签云: