STM32编译过程

[复制链接]
发表于 2025-10-24 17:37:54 | 显示全部楼层 |阅读模式
1. 编译过程先容

   

  编译MDK 软件利用的编译器是 armcc 和 armasm,它们根据每个 c/c++ 和汇编源文件编译成对应的以“.o”为后缀名的对象文件 (Object Code,也称目的文件),其内容紧张是从源文件编译得到的呆板码,包罗了代码、数据以及调试利用的信息链接链接器 armlink 把各个.o 文件及库文件链接成一个映像文件“.axf”或“.elf”格式转换必要对链接器天生的 elf 映像文件利用格式转换器 fromelf 转换成“.bin”或“.hex”文件,交给下载器下载到芯片的 FLASH 或 ROM 中

   构建过程调用的编译器。图中的编译器名字是“V5.06”,背面附带了该编译器所在的文件夹。在该路径,可看到编译工具中的各个编译工具,如 armar、armasm、armcc、armlink 及 fromelf, armar 是用于把.o 文件打包成 lib 文件的。 利用 armasm 编译汇编文件。图中列出了编译 startup 启动文件时的提示,编译后每个汇编源文件都对应有一个独立的.o 文件。 利用 armcc 编译 c/c++ 文件。图中列出了工程中全部的 c/c++ 文件的提示,同样地,编译后每个 c/c++ 源文件都对应有一个独立的.o 文件。 利用 armlink 链接对象文件,根据步调的调用把各个.o 文件的内容链接起来,末了天生步调的axf 映像文件,并附带步调各个域巨细的阐明,包罗 Code、RO-data、RW-data 及 ZI-data 的巨细。 利用 fromelf 天生下载格式文件,它根据 axf 映像文件转化成 hex 文件,并列出编译过程出现的错误 (Error) 和告诫 (Warning) 数目。 提示给出了整个构建过程斲丧的时间。 编译完成后,可以看到,每个 C 源文件都对应天生了.o、.d 及.crf 后缀的文件,另有一些额外的.dep、.hex、.axf、.htm、.lnp、.sct、.lst 及.map 文件。
  2. 步调的构成、存储与运行

   步调组件所属种别形貌呆板代码指令Code即代码域,指的是编译器天生的呆板指令,这些内容被存储到ROM 区。常量RO-data即只读数据域,指步调中用到的只读数据,这些数据被存储在ROM 区,因而步调不能修改
其内容。
比方 C 语言中 const 关键字界说的变量就是范例的 RO-data。初值非0的全局变量RW-data即可读写数据域,指初始化为 “非 0 值” 的可读写数据,步调刚运行时,这些数据具有非 0 的
初始值,且运行的时间它们会常驻在 RAM 区,因而应用步调可以修改其内容。
比方 C 语言中利用界说的全局变量,且界说时赋予“非 0 值”给该变量举行初始化。初值为0的全局变量ZI-data即 0 初始化数据,指初始化为 “0 值” 的可读写数据域,它与 RW-data 的区别是步调刚运行时
这些数据初始值全都为 0,而后续运行过程与 RW-data 的性子一样,它们也常驻在RAM 区,
因而应用步调可以更改其内容。
比方 C 语言中利用界说的全局变量,且界说时赋予“0 值”给该变量举行初始化 (若界说该变量时
没有赋予初始值,编译器会把它当 ZI-data 来对待,初始化为 0)
局部变量ZI-data
栈空间在 C 语言中,函数内部界说的局部变量属于栈空间,进入函数的时间从栈空间申请内存给局部
变量,退出时开释局部变量,归还内存空间。此空间都会被初始值化为 0 值。利用 malloc 动态分配的空间ZI-data
堆空间利用 malloc 动态分配的变量属于堆空间。此空间都会被初始值化为 0 值。   应用步调的存储状态分为:静止状态和运行状态
  静止状态静止态的步调被存储在非易失存储器中,如 STM32 的内部 FLASH,因而体系掉电后也能正常生存。运行状态当步调在运行状态的时间,步调经常必要修改一些暂存数据,由于运行速率的要求,这些数据通常存放在RAM,
掉电后这些数据会丢失。

左侧:应用步调的存储状态—静止状态     右侧:应用步调的存储状态—运行状态
上方:RAM 存储器地域            下方:ROM存储器地域

  步调在存储状态时,RO 节 (RO section) 及 RW 节都被生存在 ROM 区。当步调开始运行时,内核直接从 ROM 中读取代码,而且在实验主体代码前,会先实验一段加载代码,它把 RW 节数据从ROM 复制到 RAM,而且在 RAM 参加 ZI 节,ZI 节的数据都被初始化为 0。加载完后 RAM 区预备完毕,正式开始实验主体步调。
  编译天生的 RW-data 的数据属于图中的 RW 节,ZI-data 的数据属于图中的 ZI 节。是否必要掉电生存,这就是把 RW-data 与 ZI-data 区别开来的缘故起因,由于在 RAM 创建数据的时间,默认值为 0,但假如有的数据要求初值非 0,那就必要利用 ROM 记录该初始值,运行时再复制到 RAM。
  STM32 的 RO 地域不必要加载到 SRAM,内核直接从 FLASH 读取指令运行。盘算机体系的应用步调运行过程很类似,不外盘算机体系的步调在存储状态时位于硬盘,实验的时间以致会把上述的 RO 地域 (代码、只读数据) 加载到内存,加速运行速率,另有捏造内存管理单元 (MMU) 辅助加载数据,使得可以运行比物理内存还大的应用步调。而 STM32 没有 MMU,以是无法支持Linux 和 Windows 体系。
  步调状态与地域构成步调实验时的只读地域(RO)Code + RO data步调实验时的可读写地域(RW)RW data + ZI data步调存储时占用的 ROM 区Code + RO data + RW data 当步调存储到 STM32 芯片的内部 FLASH 时 (即 ROM 区),它占用的空间是 Code、RO-data 及RW-data 的总和,以是假如这些内容比 STM32 芯片的 FLASH 空间大,步调就无法被正常生存了。当步调在实验的时间,必要占用内部 SRAM 空间 (即 RAM 区),占用的空间包罗 RW-data 和ZI-data。
  3. 编译工具链

   点击 MDK 界面的“help->uVision Help” 可打开《ARM Development Tools》详解。

   
全部工具链的下令选项阐明:

  3.1 armcc 工具

   armcc 用于把 c/c++ 文件编译成 ARM 指令代码,编译后会输出 ELF 格式的 O 文件 (对象、目的文件)
  

  3.2 armasm 工具

   armasm 是汇编器,它把汇编文件编译成 O 文件。

  3.3 armlink 工具

     armlink 是链接器,它把各个 O 文件链接组合在一起天生 ELF 格式的 AXF 文件,AXF 文件是可实验的,下载器把该文件中的指令代码下载到芯片后,该芯片就能运行步调了。利用 armlink 还可以控制步调存储到指定的 ROM 或 RAM 地点。
  链接器默认是根据芯片范例的存储器分布来天生步调的,该存储器分布被记录在工程里的 sct 后缀的文件中,有特别必要的话可自行编辑该文件,改变链接器的链接方式。

  3.4 armar 工具

   armar 工具用于把工程打包成库文件。

  3.5 fromelf 工具

   fromelf 工具可根据 axf 文件天生 hex、bin 文件。

  4. MDK工程的文件范例

   < MDK 工程的文件范例先容 >

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表