赞
踩
汇编文件被编译link到bin文件中了。先看下工程设置里Link页,
ro_base是0x8000000
再看下编译的s文件,定义的RESET 段,
该reset段在map文件中可以找到,如下:
那么0x08000000就是汇编程序放置的起始地址吗?我们来证明一下:
1)通过对汇编代码添加测试代码,如下图
2)将编译生成hex文件后,使用jflash或其它hex阅读软件打开,发现如下:
即可证明.s文件被连接到hex的开始位置,也就是0x8000000开始的地址处。当然如果sct文件中指定了位置,s文件的位置将会受sct文件影响。如下图,分散加载文件中地址为0x08001000,RESET段的地址也跟着调整。
link文件通过sct文件得知第一个运行的程序段名称。
通过上述SCT文件可知,程序运行的第一个程序段为RESET,RESET段就是stm32 startup汇编文件中定义的。RESET段中先分配了一定数量的存储空间用来存储中断向量,向量表的大小每个芯片不同,最终分配的大小由中断向量个数决定,可以在map文件中看到实际分配的大小,也可以自己数一数计算下看看与map中大小是否一致。这里Reset_Handler的地址就是存放复位向量的。当芯片复位后,会进到复位中断处理函数处执行,即如下代码:
依次执行SystemInit函数及__main函数,注意这里的__main不是我们定义的main,而是C库函数,主要是用来初始化系统堆栈,汇编代码如下:
到此,C语言运行环境就准备好了,__main运行完之后会跳到我们定义的main处运行。
更多单片机入门知识可见:单片机开发_贫民窟的码农的博客-CSDN博客
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。