7017|9

928

帖子

0

TA的资源

五彩晶圆(高级)

楼主
 

LM3s8962体验之七……关于Startup.s解析 [复制链接]

关于Startup.s解析
; <<< Use Configuration Wizard in Context Menu >>>
;******************************************************************************
;
; Startup.s - Startup code for Stellaris.
;
; Copyright (c) 2006-2007 Luminary Micro, Inc.  All rights reserved.
;
; Software License Agreement
;
; Luminary Micro, Inc. (LMI) is supplying this software for use solely and
; exclusively on LMI's microcontroller products.
;
; The software is owned by LMI and/or its suppliers, and is protected under
; applicable copyright laws.  All rights are reserved.  Any use in violation
; of the foregoing restrictions may subject the user to criminal sanctions
; under applicable laws, as well as to civil liability for the breach of the
; terms and conditions of this license.
;
; THIS SOFTWARE IS PROVIDED "AS IS".  NO WARRANTIES, WHETHER EXPRESS, IMPLIED
; OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
; MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
; LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
; CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
;
; This is part of revision 1463 of the Stellaris Peripheral Driver Library.
;
;******************************************************************************
  extern  GPIO_Port_E_ISR
;******************************************************************************
;
; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>   栈尺寸
;
;******************************************************************************
Stack   EQU     0x00000100 ;为数字常量0x00000100定义一个字符名称Stack

;******************************************************************************
;
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>  堆尺寸
;
;******************************************************************************
Heap    EQU     0x00000000 ;定义Heap为0x00000000

;******************************************************************************
;
; Allocate space for the stack.  为栈分配空间
;
;******************************************************************************
        AREA    STACK, NOINIT, READWRITE, ALIGN=3 ;定义一个数据段,名为STACK,NOINIT 仅仅保留内存单元,还没有写入值,可读写,ALIGN=3 按8字节对齐 

 
StackMem ; 分配内存,用户模式栈名为StackMem
        SPACE   Stack ;分配0x100个连续字节,并初始化为0
__initial_sp ;Stack地址分配结束标记(就是一个地址标记) 栈顶地址

;******************************************************************************
;
; Allocate space for the heap. 为堆分配空间
; 堆空间,其中__heap_base 与__heap_limit 这两个符号是给采用了MICROLIB的程序准备的
;******************************************************************************
        AREA    HEAP, NOINIT, READWRITE, ALIGN=3 ;定义栈STACK,未初始化为0,可读写 ,8字节对齐
__heap_base  ;指定堆的开头
HeapMem   ; 分配内存,用户模式堆名为HeapMem
        SPACE   Heap ;分配0个连续字节
__heap_limit; 指定堆的结尾

;******************************************************************************
;
; Indicate that the code in this file preserves 8-byte alignment of the stack.
;
;******************************************************************************
        PRESERVE8  ;当前文件保持堆栈为8 字节对齐

;******************************************************************************
;
; Place code into the reset code section.
;
;******************************************************************************
        AREA    RESET, CODE, READONLY ;定义reset只读代码段,
        THUMB ;告诉汇编器下面是32为的Thumb指令,如果需要汇编器将插入位以保证对齐

;******************************************************************************
;
; The vector table.  中断向量表
;
;******************************************************************************
        EXPORT  __Vectors  ;在程序中声明一个全局的标号__Vectors,该标号可在其他的文件中引用
__Vectors
        DCD     StackMem + Stack            ; Top of Stack  栈顶   分配4字节32位的地址0x0
        DCD     Reset_Handler               ; Reset Handler   复位处理函数
        DCD     NmiSR                       ; NMI Handler     不可屏蔽
        DCD     FaultISR                    ; Hard Fault Handler 硬件出错
        DCD     IntDefaultHandler           ; MPU Fault Handler MEM MANAGE   存储器管理失败
        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  软件中断,使用SVC 指令触发 执行系统服务调用指令引发中断
        DCD     IntDefaultHandler           ; Debug Monitor Handler  调试监控
        DCD     0                           ; Reserved
        DCD     IntDefaultHandler           ; PendSV Handler  响应请求
        DCD     IntDefaultHandler           ; SysTick Handler
        DCD     IntDefaultHandler           ; GPIO Port A  A外部中断
        DCD     IntDefaultHandler           ; GPIO Port B  
        DCD     IntDefaultHandler           ; GPIO Port C
        DCD     IntDefaultHandler           ; GPIO Port D
 DCD     GPIO_Port_E_ISR            ; GPIO Port E    ; DCD     IntDefaultHandler           ; GPIO Port E      
        DCD     IntDefaultHandler           ; 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
        DCD     IntDefaultHandler           ; Watchdog
        DCD     IntDefaultHandler           ; Timer 0A
        DCD     IntDefaultHandler           ; Timer 0B
        DCD     IntDefaultHandler           ; Timer 1A
        DCD     IntDefaultHandler           ; Timer 1B
        DCD     IntDefaultHandler           ; Timer 2A
        DCD     IntDefaultHandler           ; Timer 2B
        DCD     IntDefaultHandler           ; Comp 0
        DCD     IntDefaultHandler           ; Comp 1
        DCD     IntDefaultHandler           ; Comp 2
        DCD     IntDefaultHandler           ; System Control
        DCD     IntDefaultHandler           ; Flash Control
        DCD     IntDefaultHandler           ; GPIO Port F
        DCD     IntDefaultHandler           ; GPIO Port G
        DCD     IntDefaultHandler           ; GPIO Port H
        DCD     IntDefaultHandler           ; UART2 Rx and Tx
        DCD     IntDefaultHandler           ; SSI1 Rx and Tx
        DCD     IntDefaultHandler           ; Timer 3 subtimer A
        DCD     IntDefaultHandler           ; Timer 3 subtimer B
        DCD     IntDefaultHandler           ; I2C1 Master and Slave
        DCD     IntDefaultHandler           ; Quadrature Encoder 1
        DCD     IntDefaultHandler           ; CAN0
        DCD     IntDefaultHandler           ; CAN1
        DCD     0                           ; Reserved
        DCD     IntDefaultHandler           ; Ethernet
        DCD     IntDefaultHandler           ; Hibernate


 

最新回复

谢谢  详情 回复 发表于 2011-12-7 09:18
 
点赞 关注
个人签名动手创造个性自我

https://home.eeworld.com.cn/?95709

回复
举报

928

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 
;******************************************************************************
;
; This is the code that gets called when the processor first starts execution
; following a reset event. 处理器复位时执行的代码
;
;******************************************************************************
        EXPORT  Reset_Handler
Reset_Handler
        ;
        ; Call the C library enty point that handles startup.  This will copy
        ; the .data section initializers from flash to SRAM and zero fill the
        ; .bss section.  It will then call __rt_entry, which will be either the
        ; C library version or the one supplied here depending on the
        ; configured startup type.
        ;
        IMPORT  __main ;引用其它文件中定义的符号MAIN
        B       __main
   ;处的__main并不是C代码中的main,而是编译器提供的专门用于启动用户程序的库函数,
   ;负责完成库函数的初始化和初始化应用程序执行环境,
   ;调用__user_initial_stackheap以初始化C代码运行需要的堆栈,初始化运行时库,最后自动跳转到main()执行。
;******************************************************************************
;
; This is the code that gets called when the processor receives a NMI.  This
; simply enters an infinite loop, preserving the system state for examination
; by a debugger.
; 不可屏蔽中断执行代码,没有处理,只是简单的无限循环。保护系统状态,方便查询
;******************************************************************************
NmiSR
        B       NmiSR

;******************************************************************************
;
; This is the code that gets called when the processor receives a fault
; interrupt.  This simply enters an infinite loop, preserving the system state
; for examination by a debugger.
;  故障中断执行代码,没有处理,只是简单的无限循环。保护系统状态,方便查询
;******************************************************************************
FaultISR
        B       FaultISR

;******************************************************************************
;
; This is the code that gets called when the processor receives an unexpected
; interrupt.  This simply enters an infinite loop, preserving the system state
; for examination by a debugger.
;意外中断执行代码,没有处理,只是简单的无限循环。保护系统状态,方便查询
;******************************************************************************
IntDefaultHandler
        B       IntDefaultHandler

;******************************************************************************
;
; Make sure the end of this section is aligned.
;   确保段文件对齐
;******************************************************************************
        ALIGN

;******************************************************************************
;
; Some code in the normal code section for initializing the heap and stack.
;
;******************************************************************************
        AREA    |.text|, CODE, READONLY  
   ;标记代码段的开始,只读,两个"|"必须要加上,
          ;因为"text"前面有个".",AREA后面第一个参数为字段的标号,
         ;若以数值或标点开始标号就要用两个"|"夹起来


;******************************************************************************
;
; The function expected of the C library startup code for defining the stack
; and heap memory locations.  For the C library version of the startup code,
; provide this function so that the C library initialization code can find out
; the location of the stack and heap.
;  为进一步改进基于ARM处理器的应用代码密度,
;  MDK-ARM采用了新型microlib C库(用于C的ISO标准运行时库的一个子集),
;  并将其代码镜像降低最小以满足微控制器应用的需求。Microlib C库可将运行时库代码大大降低。
;
;******************************************************************************
    IF :DEF: __MICROLIB  ;DEF:X 就是说X定义了则为真,否则为假  如果定义了MICROLIB则执行
                          ;支持 MICROLIB库,如果C程序的运行库是MICROLIB
    ;将__initial_sp __heap_base _heap_limit  导出
         
        EXPORT  __initial_sp  ;声明输出全局标号__initial_sp 栈地址
        EXPORT  __heap_base    ;输出堆的基地址   
        EXPORT __heap_limit    ;堆的末地址
    ELSE  ; 如果没定义了MICROLIB则执行
        IMPORT  __use_two_region_memory ;声明外部符号
        EXPORT  __user_initial_stackheap ;声明全局标号_user_initial_stackheap

__user_initial_stackheap  ;用于提供编译器的初始化C库函数设置用户程序的堆栈所需要的堆栈信息。
        LDR     R0, =HeapMem ;r0 中的堆基址
        LDR     R1, =(StackMem + Stack) ;r1 中的栈基址,即堆栈区中的最高地址
        LDR     R2, =(HeapMem + Heap) ;r2 中的堆限制
        LDR     R3, =StackMem  ;r3 中的栈限制,即堆栈区中的最低地址。
        BX      LR  ;跳出这段代码,返回到原程序,这个是为程序调用传递参数,参数就是R0-3中的值,初始化堆栈用

    ENDIF

;******************************************************************************
;
; Make sure the end of this section is aligned.
;
;******************************************************************************
        ALIGN

;******************************************************************************
;
; Tell the assembler that we're done.
;
;******************************************************************************
        END   ;汇编文件结束
 
个人签名动手创造个性自我

https://home.eeworld.com.cn/?95709
 

回复

928

帖子

0

TA的资源

五彩晶圆(高级)

板凳
 
哈,这句话 IF :DEF: __MICROLIB 变成 IF :DEF: __MICROLIB
 
个人签名动手创造个性自我

https://home.eeworld.com.cn/?95709
 
 

回复

38

帖子

0

TA的资源

一粒金砂(初级)

4
 
 
 
 

回复

144

帖子

0

TA的资源

一粒金砂(中级)

5
 
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

6
 
谢谢搂主的无私精神
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(中级)

7
 

请问LZ

请问楼主,如果用纯汇编来写Startup应该怎么写?
 
 
 

回复

173

帖子

0

TA的资源

一粒金砂(初级)

8
 
谢谢!!
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

9
 
貌似和IAR的startup_ewarm.c不太一样
 
 
 

回复

139

帖子

0

TA的资源

一粒金砂(中级)

10
 
谢谢
 
个人签名店铺:http://mcuc.taobao.com;单片机视频教程资料
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

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