ARM Cortex-M3的startup.s文件详解

发布者:石头12345最新更新时间:2019-05-07 来源: eefocus关键字:ARM  Cortex-M3  startup  s文件 手机看文章 扫描二维码
随时随地手机看文章

以LM3S9B90为例。Startup.s文件是系统的启动文件,主要包括堆和栈的初始化配置、中断向量表的配置以及将程序引导到main( )函数等。

Startup.s主要完成三个工作:栈和堆的初始化、定位中断向量表、调用Reset Handler。

a)堆和栈的初始化

Startup.s中的代码如下图所示:

 


1.程序分别对堆和栈进行了大小的规定以及空间的分配。



Stack   EQU     0x00002000     //定义栈的大小。EQU相当于汇编当中的宏定义,Stack替换0x00002000,即8*1024字节=8KB。


Heap    EQU     0x00000000         //定义堆的大小。


2.为栈分配8K Byte空间。


 


AREA    STACK, NOINIT, READWRITE, ALIGN=3  //堆栈段, 未初始化, 允许读写, 8字节边界对齐。


说明:AREA命令指示汇编器汇编一个新的代码段或者数据段。Contrx-M3的指令地址要求是字边界对齐(4字节),但是代码段是要求8字节边界对齐的。NOINIT:指定此数据段仅仅保留了内存单元,而没有将各初始值写入内存单元,或者将各个内存单元值初始化为0。

 

StackMem    SPACE   Stack    //分 配连续 Stack_Size 字节的存储单元并初始化为 0

 

__initial_sp                    //标号,代表堆栈顶部地址

3.为堆分配空间。

 

  .             

        AREA    HEAP, NOINIT, READWRITE, ALIGN=3  //堆栈段, 未初始化, 允许读写, 8字节边界对齐。

__heap_base      //标号,代表堆末底部地址

HeapMem

        SPACE   Heap  //分配堆空间

__heap_limit      //标号,代表堆界限地址

 

 

 

PRESERVE8       //指示编译器8字节对齐。

说明:PRESERVE8 指令指定当前文件保持堆栈八字节对齐。 它设置 PRES8 编译属性以通知链接器。链接器检查要求堆栈八字节对齐的任何代码是否仅由保持堆栈八字节对齐的代码直接或间接地调用。


b)定位中断向量表

;******************************************************************************

;

; Place code into the reset code section.

;

;******************************************************************************

    AREA    RESET, CODE, READONLY   //定义只读数据段,放在CODE区,位于0地址

 

        THUMB           //指示编译器以后的指令为THUMB指令

 

;******************************************************************************

;

; The vector table.

;以下为向量表,在复位时被映射到FLASH的0地址。

;******************************************************************************

    EXPORT  __Vectors     //EXPORT:在程序中声明一个全局的标号__Vectors,该标号可在其他的文件中引用。EXPORT 命令声明一个符号,可由链接器用于解释各个目标和库文件中的符号引用,相当于声明了一个全局变量。 

 

IMPORT uart0_interrupt         //引入UART0中断    

IMPORT tick_interrupt          //引入systick中断

IMPORT eth_interrupt           //引入eth中断

IMPORT timer0_interrupt  //引入timer0中断

IMPORT reset_interrupt  //引入reset中断

 

 //DCD 命令分配一个或多个字的存储器,在四个字节的边界上对齐,并定义存储器的运行时初值。

__Vectors

        DCD     StackMem + Stack            // ; Top of Stack;栈顶指针,被放在向量表的开始,FLASH的0地址,复位后首先装载栈顶指针

        DCD     Reset_Handler               //; Reset Handler。复位异常,装载完栈顶后,第一个执行的,并且不返回

        DCD     NmiSR                     //  ; NMI Handler。不可屏蔽中断

        DCD     FaultISR                   // ; Hard Fault Handler。硬件错误中断

        DCD     IntDefaultHandler           //; MPU Fault Handler。内存管理错误中断

        DCD     IntDefaultHandler           //; Bus Fault Handler。总线错误中断

        DCD     IntDefaultHandler           //; Usage Fault Handler。用法错误中断

        DCD     0                        //; Reserved

        DCD     0                        //; Reserved

        DCD     0                        //; Reserved

        DCD     0                        //; Reserved

        DCD     IntDefaultHandler          //; SVCall Handler。系统调用异常,主要是为了调用操作系统内核服务

        DCD     IntDefaultHandler          //; Debug Monitor Handler

        DCD     0                        // ; Reserved

        DCD     IntDefaultHandler          //; PendSV Handler

        DCD     tick_interrupt            //; SysTick Handler

        DCD     IntDefaultHandler         // ; GPIO Port A

        DCD     reset_interrupt             //; reset Handler

        DCD     IntDefaultHandler         // ; GPIO Port C

        DCD     IntDefaultHandler         //; GPIO Port D

        DCD     IntDefaultHandler         //; GPIO Port E

        DCD     uart0_interrupt           //; UART0

        DCD     IntDefaultHandler         //; UART1

        DCD     IntDefaultHandler        // ; SSI

        DCD     IntDefaultHandler        //; I2C

        DCD     IntDefaultHandler        //; PWM Fault

        DCD     IntDefaultHandler        //; PWM Generator 0

        DCD     IntDefaultHandler        //; PWM Generator 1

        DCD     IntDefaultHandler        //; PWM Generator 2

        DCD     IntDefaultHandler        //; Quadrature Encoder

        DCD     IntDefaultHandler        //; ADC Sequence 0

        DCD     IntDefaultHandler        //; ADC Sequence 1

        DCD     IntDefaultHandler        //; ADC Sequence 2

        DCD     IntDefaultHandler        //; ADC Sequence 3

[1] [2]
关键字:ARM  Cortex-M3  startup  s文件 引用地址:ARM Cortex-M3的startup.s文件详解

上一篇:LPC1778/1788的初步开发问题
下一篇:Keil MDK 下 uC/OS-II 在LPC11C14上的移植

推荐阅读最新更新时间:2024-11-13 15:04

Cortex-M3处理器按键实验程序自学
有输出总会有输入,今天测试一下按键的功能,第一节已经说过了与GPIO端口相关的寄存器,这里不在重复,想要从端口读取数据,首先把FIODIR这个寄存器设置为输入,再从FIOPIN寄存器读取数据就可以了,这个寄存器具有读写功能。下面说一下这个实验的电路图,如下所示: 图1 JoyST IC k按键连线图 关于按键电路还有一个,不过是接在外部中断0 上的,其电路图如下图所示: 这次实验没有涉及到外部中断,都是做普通的IO输入使用的,所以在这里外部中断就做学习总结了。下面给出这次实验的主程序: /*************************************************************
[单片机]
<font color='red'>Cortex-M3</font>处理器按键实验程序自学
消息称ARM正在开发和制造芯片 或成为高通和联发科对手
北京时间4月23日午间消息,据报道,软银集团旗下芯片设计公司ARM正在打造自己的半导体产品(芯片),以展示其产品制造方面的能力。今年晚些时候,ARM将在纳斯达克进行IPO(首次公开招股)。因此,该公司目前正想方设法吸引新用户,以推动业绩增长。    多位知情人士称,ARM将与制造伙伴合作开发这款新的半导体产品。这也是ARM有史以来进行的最有诚意的一次芯片制造努力。此举正值软银积极推动ARM利润,以便在今年晚些时候的IPO中吸引更多投资者。    之前,ARM主要将芯片的蓝图设计出售给芯片制造商,而不是直接参与半导体本身的开发和生产。此举的目的是向更广泛的市场展示其芯片设计的力量和能力。虽然ARM此前也曾与三星和台积电等伙伴制造过一
[半导体设计/制造]
STM32与ARM启动代码比较分析
从ARM转到STM开发,开发工具也由ADS转到了Keil。借助STM的固件库,使得开发效率更加高效,比如你可以不用关心启动代码的具体实现,只需要专注于具体的应用代码,嵌入式开发也变得越来越“傻瓜”。此事好坏,暂且不论,来看看STM启动代码的特点,或者说相对于ARM的区别。 通常的启动代码结构: 1. 首先是中断向量表的定义. Ø ARM ARM代码在这块的代码为跳转语句,因为指令长度的限制,4个字节也就能放个跳转语就差不多了。通常两种实现方式: 1. B Reset_Handler 2. LDR PC, Reset_Handler 其实都是一个意思,跳转到真正实现Reset_Han
[单片机]
STM32外设有哪些?
STM32系列是ST公司基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M3内核的32位单片机。按内核架构分为不同产品: 其中STM32F系列有:STM32F103“增强型”系列、STM32F101“基本型”系列、STM32F105、STM32F107“互联型”系列。 增强型系列时钟频率达到72MHz,是同类产品中性能最高的产品;基本型时钟频率为36MHz,以16位产品的价格得到比16位产品大幅提升的性能,是32位产品用户的最佳选择。两个系列都内置32K到128K的闪存,不同的是SRAM的最大容量和外设接口的组合。时钟频率72MHz时,从闪存执行代码,STM32功耗36mA,相当于0.5mA/
[嵌入式]
ARM嵌入式系统应用中的问题总结分析
引言 由于各种新型微处理器的出现和应用的不断深化,嵌入式系统在后PC时代得到了空前的发展。随着时间的推移和技术的进步,在工业控制和新兴的手持式应用等领域,用户体验成为产品成功的关键因素之一,越来越多的产品需要良好的用户界面、互联功能以及较强的数据处理能力,这对嵌入式处理器硬件、软件、教学等提出了新的要求。 1嵌入式处理器与硬件 在处理器方面,目前大量的中、低端嵌入式应用,主要使用8/16位单片机。在国内,由于历史的原因,主要是以MCS51核为主的许多不同型号单片机,主要厂商有Atmel、Philips、Winbond、宏晶等。还有一些近几年发展较快的新型单片机,如PIC、AVR、MSP430系列等。这些单片机各有特点,
[单片机]
针对嵌入式和物联网市场发展,ARM扩展定制化SoC解决方案
2016年6月15日,ARM宣布拓展DesignStart项目,帮助用户更简单、更快捷地获取Cadence 和 Mentor Graphics的EDA工具和设计环境。全新合作基于DesignStart平台所提供的免费Cortex-M0处理器IP,于DAC 2016正式宣布。全新ARM认证设计合作伙伴计划(ARM Approved Design Partner program)将为DesignStart用户提供全球认证设计公司名单,助其在研发期间获得专家支持。 EDA合作伙伴增强DesignStart 现在,DesignStart平台可为SoC设计人员提供免费的ARM Cortex-M0处理器IP用于设计、仿真和原型建模,并
[单片机]
构建ARM Linux交叉编译工具链
读者可能会有疑问,为什么要用交叉编译器?交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序,比如在PC平台(X86 CPU)上编译出能运行在以ARM为内核的CPU平台上的程序,编译得到的程序在X86 CPU平台上是不能运行的,必须放到ARM CPU平台上才能运行,虽然两个平台用的都是Linux系统。这种方法在异平台移植和嵌入式开发时非常有用。相对与交叉编译,平常做的编译叫本地编译,也就是在当前平台编译,编译得到的程序也是在本地执行。用来编译这种跨平台程序的编译器就叫交叉编译器,相对来说,用来做本地编译的工具就叫本地编译器。所以要生成在目标机上运行的程序,必须要用交叉编译工具链来完成。在裁减和定制Linux
[单片机]
8.ARM寄存器详细解说
ARM寄存器的简单分类:图1-1: 图1-1 ARM微处理器中共有37个32位寄存器,其中31个通用寄存器,6个状态寄存器。但是这些寄存器不能被同时访问,在七种模式中,可以访问的寄存器种类不同。但是,通用寄存器R14——R0、程序计数器PC、一个状态寄存器cpsr都是可以被访问的。 具体的情况如下图1-2所示: 图1-2 寄存器分类: 1、不分组通用寄存器: R0-R7是不分组寄存器。所谓不分组就是在七种模式下的任意一种模式都访问同一个物理寄存器地址。就是不分组寄存器没有特权模式,任意一种模式都可以使用未分组寄存器。 2.分组寄存器R8——R12: FIQ模式分组寄存器R8——R12. FIQ以外的分组寄存器R8-
[单片机]
8.<font color='red'>ARM</font>寄存器详细解说
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved