Cortex-M0启动文件

本文详细介绍了Cortex-M0微控制器的启动文件,包括其作用、为什么需要启动文件,以及启动代码的主要内容,如堆栈和中断向量表的定义、地址重映射、系统时钟设置等。以STM32为例,解析了启动代码的各个部分,并强调了__main标号在C/C++程序执行中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

stm32启动代码概述

启动文件的作用:

启动文件是用汇编语言编写的一小段代码,用来初始化硬件电路以及为C语言应用程序作好运行前的准备,是任何微控制器(单片机)上电复位后程序运行的入口点。

为什么需要启动文件:  

C语言运用程序往往从main函数开始执行。但一个经常会被忽略的问题是:微控制器(单片机)上电后,是如何寻找到并执行main函数的呢?学习单片机很长一段时间都以为单片机一上电就开始跑main函数,其实是错的。很显然微控制器无法从硬件上定位main函数的入口地址,因为使用C语言作为开发语言后,变量/函数的地址便由编译器在编译时自行分配(这里涉及到编译原理知识),这样一来main函数的入口地址在微控制器的内部存储空间中不再是绝对不变的。这时就需要相对应的启动文件。

 

启动代码包含的内容:

1、定义堆栈的大小(即分配堆和栈的大小)

2、中断向量表的定义

3、地址重映射及中断向量表的转移

4、设置系统时钟频率

5、堆栈的初始化

6、跳转到main函数入口

stm32Cortex-M0内核的启动代码为例,逐一解释启动代码的内容。

注意:stm32ARM7/ARM9内核跟Cortex-M0的启动代码有些不同。

下面是代码详细解释:

1.定义堆栈大小

;定义栈的大小

Stack_Size  EQU     0x00000400                                 ;定义stack_size0x00000400

 AREA   STACK, NOINIT, READWRITE, ALIGN=3      ;定义栈,可初始化为0,8字节对齐

 Stack_Mem  SPACE   Stack_Size                               ;分配0x400个连续字节,并初始化为0

 __initial_sp                                                                   ;汇编代码地址标号   (栈空间顶地址)

;定义堆的大小

Heap_Size       EQU     0x00000200                             ;定义heap_size0x00000200

AREA   HEAP, NOINIT, READWRITE, ALIGN=3          ;定义堆,可初始化为0,8字节对齐

__heap_base                                                                ;堆空间的起始地址

Heap_Mem     SPACE   Heap_Size                              ;分配0x400个连续字节,并初始化为0

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值