当前位置:首页 > 单片机 > 单片机
[导读] 一、启动文件的作用(关于启动代码的作用,前面已经提到过了,这里再啰嗦一下)(1)初始化堆栈指针SP;(2)初始化程序计数器指针PC;(3)设置堆、栈的大小;(4)设置异常向量表的入口地址;(5)配

一、启动文件的作用

(关于启动代码的作用,前面已经提到过了,这里再啰嗦一下)

(1)初始化堆栈指针SP;

(2)初始化程序计数器指针PC;

(3)设置堆、栈的大小;

(4)设置异常向量表的入口地址;

(5)配置外部SRAM作为数据存储器(这个由用户配置,一般的开发板可没有外部SRAM);

(6)设置C库的分支入口__main(最终用来调用main函数);

(7)在3.5版的启动文件还调用了在system_stm32f10x.c文件中的SystemIni()函数配置系统时钟。


二、启动文件中提到的汇编指令

指令

作用

EQU

给数字常量取一个符号名,相当于 C 语言中的 define

AREA

汇编一个新的代码段或者数据段

SPACE

分配内存空间

PRESERVE8

当前文件堆栈需按照 8 字节对齐

EXPORT

声明一个标号具有全局属性,可被外部的文件使用

DCD

以字为单位分配内存,要求 4 字节对齐,并要求初始化这些内存

PROC

定义子程序,与 ENDP 成对使用,表示子程序结束

WEAK

弱定义,如果外部文件声明了一个标号,则优先使用外部文件定义的标号,如果外部文件没有定义也不出错。

IMPORT

声明标号来自外部文件,跟 C 语言中的 EXTERN 关键字类似

B

跳转到一个标号

ALIGN

编译器对指令或者数据的存放地址进行对齐,一般需要跟一个立即
数,缺省表示 4 字节对齐。要注意的是:这个不是 ARM 的指令,是编译器的,这里放在一起只是为了方便。

END

到达文件的末尾,文件结束

IF,ELSE,ENDIF

汇编条件分支语句,跟 C 语言的类似

LDR

从存储器中加载字到一个寄存器中

BL

跳转到由寄存器/标号给出的地址,并把跳转前的下条指令地址保存到 LR

BLX

跳转到由寄存器给出的地址,并根据寄存器的 LSE 确定处理器的状态,还要把跳转前的下条指令地址保存到 LR

BX

跳转到由寄存器/标号给出的地址,不用返回

三、启动代码详解

1、stack——栈

  1. Stack_SizeEQU0x00000400

  2. AREASTACK,NOINIT,READWRITE,ALIGN=3

  3. Stack_MemSPACEStack_Size

  4. __initial_sp


分配名为STACK,不初始化,可读可写,8(2^3)字节对齐的1KB空间。

栈:局部变量,函数形参等。栈的大小不能超过内部SRAM大小。

AREA:汇编一个新的代码段或者数据段。STACK段名,任意命名;NOINIT表示不初始化;READWRITE可读可写;ALIGN=3(2^3= 8字节对齐)。

__initial_sp紧挨了SPACE放置,表示栈的结束地址,栈是从高往低生长,结束地址就是栈顶地址。


2、heap——堆


  1. Heap_SizeEQU0x00000200

  2. AREAHEAP,NOINIT,READWRITE,ALIGN=3

  3. __heap_base

  4. Heap_MemSPACEHeap_Size

  5. __heap_limit


分配名为HEAP,不初始化,可读可写,8(2^3)字节对齐的512字节空间。__heap_base堆的起始地址,__heap_limit堆的结束地址。堆由低向生长。动态分配内存用到堆。

PRESERVE8 //指定当前文件的堆栈按照 8 字节对齐。

THUMB //表示后面指令兼容 THUMB 指令。THUBM 是ARM 以前的指令集,16bit,现在 Cortex-M 系列的都使用 THUMB-2 指令集,THUMB-2 是32 位的,兼容 16 位和 32 位的指令,是 THUMB 的超级。

3、向量表


  1. AREARESET,DATA,READONLY

  2. EXPORT__Vectors

  3. EXPORT__Vectors_End

  4. EXPORT__Vectors_Size


定义一个名为RESET,可读的数据段。并声明 __Vectors、__Vectors_End 和__Vectors_Size 这三个标号可被外部的文件使用。


  1. __VectorsDCD__initial_sp;TopofStack

  2. DCDReset_Handler;ResetHandler

  3. DCDNMI_Handler;NMIHandler

  4. DCDHardFault_Handler;HardFaultHandler

  5. DCDMemManage_Handler;MPUFaultHandler

  6. DCDBusFault_Handler;BusFaultHandler

  7. DCDUsageFault_Handler;UsageFaultHandler

  8. DCD0;Reserved

  9. DCD0;Reserved

  10. DCD0;Reserved

  11. DCD0;Reserved

  12. DCDSVC_Handler;SVCallHandler

  13. DCDDebugMon_Handler;DebugMonitorHandler

  14. DCD0;Reserved

  15. DCDPendSV_Handler;PendSVHandler

  16. DCDSysTick_Handler;SysTickHandler

  17. ;ExternalInterrupts

  18. DCDWWDG_IRQHandler;WindowWatchdog

  19. DCDPVD_IRQHandler;PVDthroughEXTILinedetect

  20. DCDTAMPER_IRQHandler;Tamper

  21. DCD RTC_IRQHandler ; RTC

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在Linux操作系统中,文件操作是进程与存储系统交互的重要方式。对于同一个文件,一个进程是否可以在其生命周期内多次调用open函数打开它,并进行读写操作呢?答案是肯定的。本文将深入探讨这一机制,并通过代码示例展示如何在进...

关键字: 文件 Linux 操作系统

在嵌入式Linux系统中,文件属主(Owner)与属组(Group)是文件系统权限管理的基础。它们决定了哪些用户或用户组可以访问、修改或执行特定的文件或目录。这种权限控制机制不仅有助于保护系统的安全性,还能确保只有授权的...

关键字: 嵌入式Linux 文件

在嵌入式Linux开发中,对文件系统的深入理解和操作是至关重要的。Linux系统以其灵活性和强大的文件管理功能而著称,支持多种文件类型以满足不同的需求。本文将详细探讨Linux系统中的文件类型,并通过实例代码展示如何识别...

关键字: 嵌入式Linu Linux系统 文件

在嵌入式系统开发中,文件操作是一项基础且重要的功能。它允许程序读取、写入、修改存储在存储设备上的数据,如配置文件、日志文件、数据库等。由于嵌入式系统资源有限,文件操作通常需要高效且可靠。本文将通过一个实例,深入探讨嵌入式...

关键字: 嵌入式开发 C语言 文件

会话层(Session)是建立在传输层之上,利用传输层提供的服务,使应用建立和维持会话,并能使会话获得同步。会话层使用校验点可使通信会话在通信失效时从校验点继续恢复通信。这种能力对于传送大的文件极为重要。

关键字: 会话层 传输层 文件

摘要:针对信息系统自身安全需求及威胁行为特征,提出了基于云架构的分级威胁防御机制。该机制将信息系统作为一个整体进行威胁防护,将文件访问异常行为作为判断威胁的依据,并针对信息系统终端安全分级设计了不同的文件访问行为模型,然...

关键字: 信息系统 威胁 文件 云架构 分级

Linux一个重要的哲学是:一切皆文件。而文件与文件系统是密切相关的,本篇笔记我们来一起学习、理清那些令我们眼花缭乱的文件系统。

关键字: Linux 文件系统 文件

我们在使用linux时,提示 Could not get lock /var/lib/dpkg/lock 报错?

关键字: Linux 文件

  在Windows中打开一个文件时,系统会自动调用相应的程序来打开它。但有时我们不想用这个程序来打开这个文件,这就得改变文件和程序的关联,《电脑报》上有一些改动关联的方法,但通过修改注册表,也可以找

关键字: 文件 程序 关联方法

Android上可能有很多文件浏览器,但是对于应用程序,没有太多选择。 由于用户使用同一类型应用程序的方式可能非常不同,因此在对书签问题进行故障排除时,只有一项额外功能或缺少功能会中断交易。 如果您有一个新的文件浏览器,...

关键字: Android 文件 ultra explorer
关闭