STM32 启动代码 __main 与用户主程序 main() 的区别

最新更新时间:2019-04-01来源: eefocus关键字:STM32  启动代码  用户主程序 手机看文章 扫描二维码
随时随地手机看文章

1、__main 作用

__main函数是C/C++运行时库的一个函数,嵌入式系统在进入应用主程序之前必须有一个初始化的过程,使用__main标号引导系统时必须将应用程序的入口定义为main()。
    
在初始化的过程中,__main函数的作用主要有两点:


1) 完成对映像文件的初始化操作

a、映像文件

链接器把多个目标文件链接成一个映像文件。

b、加载地址和执行地址

映像文件可以有两种地址:加载地址和执行地址。

加载地址是映像文件在存储器中的存储地址;执行地址就是映像文件运行时的地址。

c、加载域和执行域

文件加载的存储区叫加载域,文件运行的存储区叫执行域。

d、从加载地址到执行地址

在结构比较简单的系统中,加载地址就是执行地址;

而在复杂系统中,程序运行前,常常会把映像文件的一部分或全部从存储区域移出去,此时执行地址就不再是加载地址。

知道以上几个概念,__main函数对映像文件的初始操作就不难理解了。

对于加载地址和执行地址不同的映像文件,__main函数会把加载地址的代码和数据复制到执行地址中,并且对被链接器指定为需要初始化为0的段,进行清零操作。


2) 调用__rt_entry函数,进入用户程序。

__rt_entry函数的运行流程如图:



 2、进入主程序

当所有的系统初始化工作完成之后,就需要把程序流程转入主应用程序,即呼叫主应用程序。

最简单的一种情况是:

IMPORT mainB main

直接从启动代码跳转到应用程序的主函数入口,当然主函数名字可以由用户随便定义。

在ARM ADS环境中,还另外提供了一套系统级的呼叫机制。

IMPORT __mainB __main


__main()是编译系统提供的一个函数,负责完成库函数的初始化和初始化应用程序执行环境,最后自动跳转到main()。


所以说,前者是库函数,后者就是我们自己编写的main()主函数;


因此我们用的B __main其实是执行库函数,然后该库函数再调用我们的main() 函数,因此在单步调试时会看到先要跑一段程序(其实是库函数),然后再单步到我们自己的main函数(这个同时也说明如果有B __main 则就对应必须有main函数,否则编译出错);


如果我们用 B main来进入我们的主函数的话,那在单步调试时就看到直接进入到我们自己的main函数了,中间不会看到其他程序;


那么用B __main和用B main 这两这进入我们的main函数方式有什么不同呢?

如果采用前者则会由编译器加入一段"段拷贝"程序,即我们说的从加载域到执行域转化程序;而采用后者就没有这个了;


因此如果要进行 "段拷贝"只能自己动手编写程序来实现了,完成段拷贝后就可以进入我们的主函数了,当然这个主函数不一定是叫做main(),可以起个其他好听的名字,这个有别于使用B __main方式;不管采用哪种方式进入我们的程序,都要有一段"段拷贝"程序,跑完了段拷贝后才能可以进入我们主程序了。


startup.s 这个文件并没有所谓的"段拷贝"功能。


对含有启动程序来说,"执行地址与加载地址相同"不容易实现:


如果执行地址与加载地址相同哪当然不需要做"段拷贝",但是个人理解编译器还会加入"段拷贝"程序(如果用B __main 的话),只是因为条件不满足而不执行而已;但是对含有启动程序来说,"执行地址与加载地址相同"就不容易了.因为启动程序是要烧到非易失存储器里,用来在上电执行的,而这个程序必定会有RW段,如果RW放在非易失存储器,如FLASH,那就不好实现RW功能了,因此要给RW移动到能够实现RW功能的存储器,如SRAM等.因此,对含有启动程序来说,"执行地址与加载地址相同"就不容易实现;程序的入口点在C 库中的__main 处,在该点,库代码执行以下操作:

1)将非零(只读和读写)运行区域从其载入地址复制到运行地址。

2)清零ZI 区域。

3)跳转到__rt_entry。


关键字:STM32  启动代码  用户主程序 编辑:什么鱼 引用地址:STM32 启动代码 __main 与用户主程序 main() 的区别

上一篇:STM32 启动代码汇编指令详解
下一篇:STM32 分散加载文件 .sct 解析

推荐阅读最新更新时间:2023-10-12 16:31

Stm32按键中断使LED灯闪烁
/* *说明: *PA0:KEY1;PA1:KEY2; *PA2:LED1;PA3:LED2; *PA9:USART1_TX;PA10:USART1_RX */ #include stm32f10x.h #include stm32f10x_rcc.h #include stm32f10x_gpio.h #include stm32f10x_crc.h #include stm32f10x_exti.h #include system_stm32f10x.h #include misc.h void RCC_Configuration(void); void GPIO_Conf
[单片机]
STM32的SPI采用DMA方式传输测试
环境: 主机:WIN7 开发环境:MDK4.23 MCU:STM32F103CBT6 说明: 参考链接: http://www.openedv.com/posts/list/3159.htm SPI传输数据分为连续传输和非连续传输. 连续传输时序图: 非连续传输时序图: 非连续传输模式可以参考上篇文章: http://blog.csdn.net/jdh99/article/details/7598573 官方pdf关于连续和非连续传输的说明: 当在主模式下发送数据时,如果软件足够快,能够在检测到每次TXE的上升沿(或TXE中断),并立即在正在进行的传输结束之前写入SPI_DR寄存器,则能够实现连续的通信;此时,
[单片机]
<font color='red'>STM32</font>的SPI采用DMA方式传输测试
STM32学习笔记:基础例子
本例子代码参考了STM32库开发实战指南中的代码,由于使用的板子是尚学STM32F103ZET6,为了配合板上已有资源,也参考了其配套代码。为了便于书写文本,我尽量将代码都写到了一个文件中,这种方式是不推荐的,在做具体工程时最好代码分类管理,使工程逻辑清晰。 现在对板上一些资源说明:板上有两个LED灯,引脚为PE5、PE6,均为ResetBits时点亮。有三个按钮,依次为黄色复位,红色PE4(按下接GND)、红色PA0(按下接3.3V,WAKE UP按钮)。ISP口为靠近电源开关的USB,也是USART1口。USART2口为PA3(Rx)、PA2(Tx)。IPD为高电平中断(按键一边接高电平),IPU为低电平中断。 接下来
[单片机]
<font color='red'>STM32</font>学习笔记:基础例子
STM32系列后缀的意思
举例:STM32 F 103 C 8 T 6 F 那一位指的是产品类型,现在似乎只有通用型即 F 103 那位指的是产品子系列,101= 基本型,102 = USB基本型、USB 2.0全速设备,103 = 增强型,105或107 = 互联型 C 那位指的是引脚数目,T=36脚,C=48脚,R=64脚,V=100脚,Z = 144脚 8 那位指的是FLASH的大小,4=16K,6=32K,8=64K,B=128K,C=256K,D=384K,E=512K T 那位指的是封装方式,H=BGA,T=LQFP,U=VFQFPN,Y=WLCSP64 6 那位指的是温度范围,6=-40~85摄氏度,7=-40~105摄氏度 整理
[单片机]
STM32单片机设计extern全局变量的定义解析
在写SysTcik_Handler()这个中断函数时,总是报错,明明在开头定义的全局变量extern u16 ntime,(nTIme--写在stm32f10x_it.c的sysTIck中断函数中)但是编译时总是报错,百度之后才有了解决方法, 之前也注意到过extern变量,但是没有仔细思考过它的使用方法,今天碰到了,一定要把它弄明白,把这个关键字的一般作用弄清楚(仅仅是一般作用,C的博大精深不敢妄谈); 当你建立一个头文件库时,经常会遇到一个问题,就是在A文件中定义一个temple变量,想把它的值传递给B文件使用,但是A文件操作中函数又不可以带返回参数,比如说中断服务函数,那该怎么办?如果你把temple定义在A中,然后
[单片机]
<font color='red'>STM32</font>单片机设计extern全局变量的定义解析
STM32外接DHT11温湿度传感器并通过OLED进行数据显示的设计电路与程序
本篇介绍STM32如何外接温湿度传感器实现当前环境温湿度的读取,并显示到OLED屏幕上。 1 DTH11温湿度传感器 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,包括一个电阻式感湿元件和一个NTC测温元件。 1.1 数据读取协议 微控制器MCU与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右。 用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据。 从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT1
[单片机]
<font color='red'>STM32</font>外接DHT11温湿度传感器并通过OLED进行数据显示的设计电路与程序
再造STM32---第七部分:初识 STM32 固件库
本章参考资料:《STM32F4xx 参考手册》、《STM32F4xx 规格书》、《Cortex-M3 权威指南》 , STM32 标准库帮助文档:《stm32f4xx_dsp_stdperiph_lib_um.chm》。在上一章中,我们构建了几个控制 GPIO 外设的函数,算是实现了函数库的雏形,但GPIO 还有很多功能函数我们没有实现,而且 STM32 芯片不仅仅只有 GPIO 这一个外设。 如果我们想要亲自完成这个函数库,工作量是非常巨大的。 ST 公司提供的标准软件库,包含了 STM32 芯片所有寄存器的控制操作,我们直接学习如何使用 ST 标准库,会极大地方便控制 STM32 芯片。 7.1 CMSIS
[单片机]
再造STM32---第七部分:初识 <font color='red'>STM32</font> 固件库
stm32 FSMC-外扩SRAM IS62WV51216
引脚定义 FSMC配置步骤 1.使能对应引脚GPIO时钟 2.配置GPIO引脚模式 3.使能FSMC时钟 4.FSMC初始化 5.存储器块使能 举例 #define Bank1_SRAM3_ADDR ((u32)(0x68000000)) //首地址0x60000000,每块0x40000000 void SRAM_gpio_init() { GPIO_InitTypeDef gpiof = { GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_12 | GPI
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved