STM32
直播中

雅博电子科技

13年用户 548经验值
擅长:2223
私信 关注
[问答]

有哪位大神可以讲解一下startup_stm32f429_439xx.s启动文件吗

有哪位大神可以讲解一下startup_STM32f429_439xx.s启动文件吗

回帖(1)

臧超楠

2021-11-26 16:14:44

Stack—栈


Stack_Size    EQU    0x00000400                         ;EQU宏定义类C中define


              AREA   STACK, NOINIT, READWRITE, ALIGN=3  ;定义一个空间命名为STACK,不初始化,可读可写,ALIGN=3(2的3次方),8字节对齐
Stack_Mem     SPACE  Stack_Size                         ;开辟一个大小等于Stack_Size的,命名为Stack_Mem的内存空间。
__initial_sp                                            ;标号__initial_sp 紧挨着SPACE 语句放置,表示栈的结束地址,即栈顶地址,栈是由高向低生长的。


Heap 堆


Heap_Size    EQU    0x00000200                       ;宏定义


              AREA   HEAP, NOINIT, READWRITE, ALIGN=3 ;定义一个名为Heap的空间
__heap_base                                          ;堆的起始地址
Heap_Mem     SPACE  Heap_Size                        ;开辟大小等于堆的空间
__heap_limit                                         ;堆的结束地址


命令指令


PRESERVE8          ;指定当前文件的堆栈按照8 字节对齐。
THUMB              ;表示后面指令兼容THUMB 指令。THUBM是ARM以前的指令集,16bit,现在Cortex-M系列的都使用THUMB-2 指令集,THUMB-2 是32 位的,兼容16 位和32 位的指令,是THUMB 的超级。


向量表


AREA      RESET, DATA, READONLY    ;定义数据段名为RESET,可读,
EXPORT    __Vectors                ;声明此变量具有全局属性
EXPORT    __Vectors_End            ;同上
EXPORT    __Vectors_Size           ;同上


向量表


__Vectors       DCD     __initial_sp  ;栈顶地址
                DCD     Reset_Handler ;复位程序地址
                DCD     NMI_Handler
                DCD     HardFault_Handler
                DCD     MemManage_Handler
                DCD     BusFault_Handler
                DCD     UsageFault_Handler
                DCD     0              ; 0 表示保留
                DCD     0
                DCD     0
                DCD     0
                DCD     SVC_Handler
                DCD     DebugMon_Handler
                DCD     0
                DCD     PendSV_Handler
                DCD     SysTick_Handler
               
               
                ;外部中断开始
                DCD     WWDG_IRQHandler
                DCD     PVD_IRQHandler
                DCD     TAMP_STAMP_IRQHandler
               
                ;限于篇幅,中间代码省略
                DCD     LTDC_IRQHandler
                DCD     LTDC_ER_IRQHandler
                DCD     DMA2D_IRQHandler
__Vectors_End
__Vectors_Size  EQU     __Vectors_End - __Vectors  ;向量表的大小计算


DCD:数据定义( Data Definition )伪指令


一般用于为特定的数据分配存储单元,同时可完成已分配存储单元的初始化。
语法格式:


标号    DCD(或 DCDU)   表达式


DCD(或 DCDU)伪指令用于分配一片连续的字存储单元并用指定的表达式初始化。其中表达式可以为程序标号或数字表达式。 DCD 也可用 “ &” 代替。
用 DCD 分配的字存储单元是字对齐的,而用 DCDU 分配的字存储单元并不严格字对齐。


语法


AREA 段名 属性1, 属性2, ……


作用
用于定义一个代码段或数据段。
段名若以数字开头,则该段名需用“|”括起来,如|1_test| 。


属性字段表示该代码段(或数据段)的相关属性,多个属性用逗号分隔。


常用的属性如下:


CODE       定义代码段
DATA       定义数据段
READONLY   指定本段为只读,代码段默认为READONLY
READWRITE  指定本段为可读可写,数据段的默认为READWRITE
MON        定义一个通用的段,不包含任何的用户代码和数据。各源文件中同名的COMMON段共享同一段存储单元。


实例:AREA Init,CODE,READONLY


语法


ALIGN   {表达式{,偏移量}}


作用
通过添加填充字节的方式,使当前位置满足一定的对齐方式。其中,表达式的值用于指定对齐方式,可能的取值为2的幂,如1、2、4、8、16等。若未指定表达式,则将当前位置对齐到下一个字的位置。偏移量也为一个数字表达式,若使用该字段,则当前位置的对齐方式为:2的表达式次幂+偏移量。


实例:AREA    Init,CODE,READONLY,ALIGN=3  


语法


THUMB


作用
表示以下的代码都是THUMB代码。


EQUIRE8及PRESERVE8


语法


REQUIRE   (语法格式:requite label)


作用


REQUIRE伪操作用于指定段之间的相互依赖关系.


格式如下:


REQUIRE    lable  ;其中lable 为所需要的标号的名称.


当进行连接处理包含有“REQUIRE label”伪指令的源文件时,定义label 的源文件也将呗包含


语法


REQUIRE8及PRESERVE8


作用


REQUIRE8       伪操作指示当前代码中要求数据栈8字节对齐
PRESERVE8      伪操作表示当前代码中数据栈是8字节对齐的


说明


LDRD及STRD指令要求内存单元地址是8字节对齐的.当在程序中使用这些指令在数据栈中传送数据时,要求该数据栈是8字节对齐的,这时就需要用REQUIRE8伪指令来说明.链接器要保证要求8字节对齐的数据栈代码只能被数据栈是8字节对齐的代码调用.


复位程序


AREA     |.text|, CODE, READONLY              ;定义一个名称为.text 的代码段,可读。       
Reset_Handler   PROC                          ;定义Reset_Handler子程序
                EXPORT Reset_Handler   [WEAK] ;能被外部调用,弱定义
IMPORT          SystemInit                         ;引用C程序 SystemInit
IMPORT          __main                              ;同上
                LDR   R0,  =SystemInit        ;将SystemInit中的信息加载到R0中
                BLX   R0                      ;跳转到R0所给的地址中根据LSE 确定处理器的状态,还要把跳转前的下条指令地址保存到LR
                LDR   R0,  =__main
                  BX    R0                      ;跳转到R0中,不返回
                ENDP
举报

更多回帖

发帖
×
20
完善资料,
赚取积分