STM32底层机制--代码是如何在CM3芯片中运行的?
一、摘要
众所周知,代码会经过预处理、编译、汇编及链接四个阶段,最终被编译成可执行文件(二进制机器码)。根据启动方式的不同,决定了代码从哪块内存进行读取。一般而言,代码下载后都存储在Flash闪存中,即最终编译后的可执行文件是存储在Flash中,但flash中的代码是怎么被CPU读取并执行的呢?本文将从int a=0;a+=1;这两行代码如何在基于CM3内核的STM32F103处理器中运行来进行分析。
二、结果与分析

图2-1 代码执行流程

图2-2 系统结构图
如图2-1和图2-2所示,当int a=0;a+=1;的二进制机器码烧录至 Flash 后,CPU 首先通过 I-Code 总线(基于 AHB 协议的 32 位指令总线)从Flash读取int a=0的指令。该总线直接连接 Cortex-M 内核与 Flash 指令接口,支持指令预取以提升效率。Flash 控制器通过 AHB 总线将机器码返回 CPU,解码(说简单一点,解码就是将二进制机器码翻译成需要干的事情)后识别出需初始化变量a,但此时初始值0仍存储在 Flash 的数据区中。
为执行赋值操作,CPU 通过 D-Code 总线(专用于数据访问的 AHB 总线)获取初始值。D-Code 总线需经总线矩阵(总线矩阵指的是代码存储区既可以由指令指令总线(I‐Code)访问(当从此区取指时),也可以被数据总线(D‐Code)访问(当在此区访问数据时),需要在中间插入一个总线开关,称为“总线矩阵”;或者使用一个AHB总线复用器。),由于全局变量实际存储在 SRAM 中,在进入main()函数前的启动阶段,启动代码已将Flash内a的初值0拷贝至RAM 的指定地址,此过程由 D-Code 总线经总线矩阵完成写入,并返回操作确认,从而完成变量初始化。int a=0这行代码操作结束。
随后,CPU 通过 I-Code 总线从 Flash 读取a+=1的指令(通常编译为 LDR、ADD、STR 指令序列)。执行时,首先通过 D-Code 总线向总线矩阵发起读请求,从 SRAM 中加载a的当前值0至 CPU 寄存器。数据抵达后,CPU 内部的 ALU 单元执行加法运算0+1=1,生成结果。最后,CPU 将计算结果1通过 D-Code 总线发送至总线矩阵,由矩阵路由至RAM 控制器,完成对变量a的更新。此时完成a+=1这行代码。
结论
当int a=0;a+=1;的机器码存入 Flash 后,启动阶段由初始化代码通过 D-Code 总线经总线矩阵将a的初值0从 Flash 拷贝至 RAM;运行时阶段 CPU 首先通过 I-Code 总线读取a+=1 指令,随后经 D-Code 总线从 RAM 加载a=0至寄存器,ALU 执行加法运算得1,最终通过 D-Code 总线将结果写回 SRAM 更新变量值,整个过程由总线矩阵动态协调 I-Code 取指与 D-Code 数据访问的并发操作。
引用
CM3权威指南.
STM32中文参考手册_V10.
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)