详解startup_M051.s

发布者:HeavenlyJoy444最新更新时间:2024-07-30 来源: cnblogs关键字:Keil  硬件堆栈 手机看文章 扫描二维码
随时随地手机看文章

在Keil新建的所有工程中,毫无例外地都包含startup_M051.s,如图19.1-1。

 

图19.1-1 startup_M051.s

 

该文件主要作用于上电时初始化单片机的硬件堆栈、初始化RAM、分配内存空间和跳转到主函数即main函数。硬件堆栈是用来存放函数调用地址、变量和寄存器值的;分配内存空间为异常提供更加快速的访问,减少中断延迟。如果不加载该startup_M051.s文件,编译的代码可能会使单片机不能正常工作。

那么什么是堆栈呢?在计算机领域,堆栈是一个不容忽视的概念,但是很多人甚至是计算机专业的人也没有明确堆栈这两种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。

堆,一般是在堆的头部用一个字节存放堆的大小,堆中的具体内容由程序员安排。

栈,在函数调用时,第一个进栈的是主函数中函数调用后的下一条指令的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,接着是函数中的局部变量,注意静态变量是不入栈的。当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址(后进先出),也就是主函数中的下一条指令,程序由该点继续运行。

虽然堆栈的说法是连起来叫,但是他们还是有很大区别的,连着叫只是由于历史的原因。

startup_M051.s文件并不复杂,只要用户有基本的汇编基础,就可以看懂,以下就给出该上电初始化文件的详细注解,可以作为参考,只作为选学内容。

 

程序清单19.1-1 startup_M051.s核心内容详解

 

Stack_Size      EQU     0x00000400        ;//栈大小定义为0x00000400字节

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;声明数据段STACK

;该数据段内存单元无初始化,可读写,并重新字对齐

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                AREA    STACK, NOINIT, READWRITE, ALIGN=3

Stack_Mem       SPACE   Stack_Size       ;//为栈分配内存空间,并初始化为0

__initial_sp

 

 

Heap_Size       EQU     0x00000000  ;//堆大小定义为0x00000000字节

 

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3

__heap_base

Heap_Mem        SPACE   Heap_Size        ;//为堆分配内存空间,并初始化为0

__heap_limit

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;声明数据段RESET

;该数据段内存单元只读

;功能:为所有Handler分配内存单元

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                PRESERVE8                ;//当前堆栈保持8字节对齐

                THUMB                    ;//THUMB模式

;//向量表映射到复位地址0

                AREA    RESET, DATA, READONLY

                EXPORT  __Vectors

 

__Vectors       DCD     __initial_sp              ; Top of Stack

                DCD     Reset_Handler             ; Reset Handler

                DCD     NMI_Handler               ; NMI Handler

                DCD     HardFault_Handler         ; Hard Fault Handler

                DCD     0                         ; Reserved

                DCD     0                         ; Reserved

                DCD     0                         ; Reserved

                DCD     0                         ; Reserved

                DCD     0                         ; Reserved

                DCD     0                         ; Reserved

                DCD     0                         ; Reserved

                DCD     SVC_Handler               ; SVCall Handler

                DCD     0                         ; Reserved

                DCD     0                         ; Reserved

                DCD     PendSV_Handler            ; PendSV Handler

                DCD     SysTick_Handler           ; SysTick Handler

 

                DCD     BOD_IRQHandler  

                DCD     WDT_IRQHandler  

                DCD     EINT0_IRQHandler

                DCD     EINT1_IRQHandler

                DCD     GPAB_IRQHandler 

                DCD     GPCDE_IRQHandler

                DCD     PWMA_IRQHandler 

                DCD     PWMB_IRQHandler 

                DCD     TMR0_IRQHandler 

                DCD     TMR1_IRQHandler 

                DCD     TMR2_IRQHandler 

                DCD     TMR3_IRQHandler 

                DCD     UART0_IRQHandler

                DCD     UART1_IRQHandler

                DCD     SPI0_IRQHandler 

                DCD     SPI1_IRQHandler 

                DCD     SPI2_IRQHandler 

                DCD     SPI3_IRQHandler 

                DCD     I2C0_IRQHandler 

                DCD     I2C1_IRQHandler 

[1] [2] [3]
关键字:Keil  硬件堆栈 引用地址:详解startup_M051.s

上一篇:LIB的生成与使用
下一篇:18 RTX Kernel实时系统

推荐阅读最新更新时间:2024-11-12 10:22

Keil5 STM32L151pack包的安装
最近工作上需要使用到stm32l151这个芯片,原因嘛就是因为这个芯片成本低,某宝售价2元钱,但是原本使用keil5没有这个芯片的型号选择,于是在官网http://www.keil.com/dd2/pack/#/eula-container 找到了这个系列的pack包, 点击下载即可 下载完成后直接点击安装 然后重启keil软件就会找到需要的那个芯片型号了 刚碰到这个问题的时候在网上找了好久都没有解决,后来去官网上看看文档,才发现这么简单啊,所有啊 !这是一个教训,网上的一些乱七八糟的不能全信,可能会走弯路的。开发的道路坑多慎行啊!!!
[单片机]
<font color='red'>Keil</font>5 STM32L151pack包的安装
如何解决Current VI's Path 开发环境和运行环境不一致的问题
Current VI's Path 是取得当前VI所在路径,遗憾的是开发环境和运行环境这个VI返回的路径是不同的,这就造成了编译后文件无法找到的问题,解决问题的方法是所有文件名都采用相对路径加文件名的方法,绝对不要使用绝对路径,因为我们不能希望用户必须安装在一个指定的文件夹中. 先看看区别在那里: 运行结果是: 很明显,中间多了个执行文件名,所以解决的方法是如何去掉这个执行文件名. 方法一:利用APP的属性节点判断当前是开发还是运行环境. 两者之间的区别是对于运行环境,多了一层路径拆分,这样开发和运行环境就完全一致了. 顺便说一句,在需要程序退出LV时,我们经常使用EXIT LABVIEW节
[测试测量]
如何解决Current VI'<font color='red'>s</font> Path 开发环境和运行环境不一致的问题
尺寸最小的5.5英寸手机:异形全面屏夏普美人尖AQUOS S2
电子网消息,今天下午,夏普在北京金茂万丽酒店发布了夏普第29款全面屏手机,夏普美人尖AQUOS S2。全球第一款全面屏手机就出自夏普,第一款搭载摄像头的手机也是由夏普推出,夏普在创新上从没有停下来。而今天推出的夏普 AQUOS S2则是目前国内尺寸最小的5.5英寸异形屏手机。价格上,夏普AQUOS S2珍藏版售价3499元,标配版京东价2499元 。   异形屏设计,打造美人尖 AQUOS S2采用FFD异形全面屏技术,用25倍的工时切割一片异形玻璃、以精工钻石铣刀在0.3mm玻璃上打磨弧角,异形全面屏不同于传统标准的像素设计,每一颗像素都必须重新精密设计,异型屏幕弧形槽区域Gate 电极信号两端分别驱动,高度精密同步算法
[手机便携]
Keil C51是如何支持双数据指针,有哪些特别的要求
在8051体系中,数据指针DPTR作为一个特殊的16位寄存器,用于寻址64 KB的XDATA或CODE空间,通常它被当作一个16位指针,指向一个常数表。双数据指针可以改善同时有两个16位指针使用时的性能。作为一种增强特性,有许多8051派生型器件支持双数据指针。以宏晶科技STC89系列的产品为例,DPTR被增强为DPTR0和DPTR1两个,仍然使用原来的地址,用另外一个SFR AUXR1的0位DPS来切换。当DPS位为0时,所有对DPTR的操作使用DPTR0;当DPS位为1时,所有对DPTR的操作使用DPTR1。这样,通过一个简单的INC AUXR1指令,就可以来回切换两个数据指针。 1 Keil C51对双数据指针的支持情况
[单片机]
<font color='red'>Keil</font> C51是如何支持双数据指针,有哪些特别的要求
S3C2440时钟详解
S3C2440的时钟 ADS1.2中关于时钟的C代码: ChangeMPllValue((mpll_val 12)&0xff, (mpll_val 4)&0x3f, mpll_val&3); ChangeClockDivider(key, 12); 1)FLCK、HCLK和PCLK的关系 S3C2440有三个时钟FLCK、HCLK和PCLK。s3C2440官方手册上说P7-8写到:FCLK is used by ARM920T, HCLK is used for AHB bus, which is used by the ARM920T, the memory controller, the interrupt controlle
[单片机]
STM8S003 上升沿进不去外部中断问题
硬件配置中为双边沿触发; 问题:下降沿触发部分程序可以执行,上升沿进不去。 测试结果:上升沿可以进入中断,但是判断语句不满足条件。 if(GPIO_ReadInputPin(LED1_PORT,LED1_PIN)==1)//下降沿触发中断 条件函数为: BitStatus GPIO_ReadInputPin(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin) {undefined return ((BitStatus)(GPIOx- IDR & (uint8_t)GPIO_Pin)); } typedef enum {RESET = 0, SET = !RESET}
[单片机]
S3c2440代码重定位详解1---段的概念重定位的引入
S3C2440的CPU可以直接给SDRAM发送命令、给Nor Flash发送命令、给4K的片上SRAM发送命令,但是不能直接给Nand Flash发送命令 NAND启动过程 假如把程序烧写到Nand Flash上,即向Nand Flash烧入* bin* 文件,CPU是无法从Nand Flash中取代码执行的。 为什还可以使用NAND启动? 上电后,Nand启动硬件会自动把Nand Flash前4K复制到SRAM; CPU从0地址运行SRAM; 如果我的程序大于4K怎么办? 前4K的代码需要把整个程序读出来放到SDRAM(即代码重定位) NOR启动过程 如果从Nor Flash启动,会出现什么问题? 将拨动开关
[单片机]
<font color='red'>S</font>3c2440代码重定位详解1---段的概念重定位的引入
研调:S4登场,逾5成中国iPhone用户有意跳巢
    据全球市场研究机构TrendForce旗下中国速动(Avanti)消费者调查机构针对「中国地区三星Galaxy S4手机上市调查报告」显示,中国消费者不仅对 Galaxy S4 上市关注度高且存有高选购意愿,甚至造成一半以上的iPhone使用者有意跳巢,显示Galaxy S4不仅可强化三星在中国市场霸主地位,甚至进一步攻城掠地威胁iPhone中国市场市占。 Galaxy S4高知名度超过4成受访者有购买意愿 Source:TrendForce 研调机构评估,此次Galaxy S4上市宣传效果可说相当的好,有高达61.2%的受访者知道这款新一代旗舰机种上市讯息,可见三星Galaxy S系列的知名度足以和iPhone在市场中一
[手机便携]
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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