欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > 深入理解单片机的运行流程

深入理解单片机的运行流程

2025/4/19 16:20:10 来源:https://blog.csdn.net/2303_79336820/article/details/147287805  浏览:    关键词:深入理解单片机的运行流程

        目录

一、理解STM32芯片和CortexM3的关系

二、理解编写代码以及单片机运行的整体过程

(1)代码是如何编译成可执行程序的?

(2)可执行程序是如何烧录到单片机的flash的?

(3)单片机是如何从flash读取并执行可执行程序的?


        在学习STM32外设的时候,我经常会有一个疑问,为什么按照教程上的步骤就能正确的控制GPIO口等外设,因为stm32使用了标准库让我们开发者不再需要关心寄存器的构造,但是作为一个喜欢刨根究底的人,不了解一下总会感觉并没有理解本质,只是在学习API的使用方式。本篇文章就从STM32内核的结构说起,捋捋处理器内核Cortex-M3与STM32的关系。

一、理解STM32芯片和CortexM3的关系

在STM32的官方使用手册中可以看到这样一张图,他是描述STM32芯片各种外设和CortexM3的关系。

        Cortex-M3是一个32位处理器内核。内部的数据路径是32位的,寄存器是32位的,存储器接口也是32位的。CM3采用了哈佛结构,拥有独立的指令总线(ICode)和数据总线(DCode),可以让取指与数据访问并行不悖。这样一来数据访问不再占用指令总线,从而提升了性能。为实现这个特性,CM3内部含有好几条总线接口,每条都为自己的应用场合优化过,并且它们可以并行工作。但是另一方面,指令总线和数据总线共享同一个存储器空间(一个统一的存储器系统)。换句话说,不是因为有两条总线,可寻址空间就变成8GB了。

        比较复杂的应用可能需要更多的存储系统功能,为此CM3提供一个可选的MPU,而且在需要的情况下也可以使用外部的cache。另外在CM3中,Both小端模式和大端模式都是支持的。

简而言之:

(1)Cortex-M3是一个处理器内核,他只负责提供基本的运算和控制功能。它和老版本的CPU功能类似。(只不过CPU的算力远比Cortex-M3强大,主频可以达到GHz而单片机往往只有MHz)

(2)STM32是基于该处理器内核搭建的一套"主机",通过对该内核进行封装,利用他的运算和控制功能搭建了一套可以直接使用的芯片。就好像电脑的主机。那么我们可以简单的这么理解,电脑如果没有了操作系统这一上层软件,他其实本质就和我们的单片机是一样的!没有操作系统你同样需要寄存器才能进行开发。

(3)不同厂家如果使用的处理器内核是同一个,那么理论上来讲性能是相似的,但是由于不同厂家对于外设的技术优势可能不同,或者是市场对外设的需求不同,使得不同厂家对芯片的封装工艺不同,这直接影响芯片的功耗和性能。所以理论上来说只要你学会了一种处理器内核,以后遇到基于该内核的芯片都是手拿把掐。

二、理解编写代码以及单片机运行的整体过程

(1)代码是如何编译成可执行程序的?

        在学习C语言的时候,我们编写一个代码都是打开某款IDE,比如VScode,然后一顿敲,最后点击一下编译就能让C语言这种高级语言变成CPU能理解的机器码(二进制文件,比如.hex文件或.bin文件)。他们的具体流程是什么呢?

        他们往往需要经历以下几个步骤:

1.预处理器处理宏定义、头文件包含等。处理源代码中的预处理指令;展开宏定义,将头文件内容插入到源代码中;删除注释,处理条件编译指令变成.i文件。输出给编译器。

2.编译器拿到.i文件后,将预处理后的源代码(.i文件)转换为汇编代码;并进行语法分析、语义分析、代码优化等变成.s文件。输出给汇编器。

3.汇编器拿到.s文件后,将汇编代码转换为机器可执行的目标文件,即二进制或十六进制机器码(Object File)变成.o文件。输出给链接器。

4.链接器会收到许多个.o文件。

  • 其中每个.o文件包含:
    • 机器代码:编译后的程序逻辑。
    • 符号表:记录了该文件中定义的函数、全局变量,以及引用的外部符号(如其他文件中的函数或变量)。
    • 重定位信息:用于在链接时调整地址。注意这里是相对地址,而非绝对地址

然后链接器对这些信息进行解析,读取他们的符号表和重定位信息,并将目标文件的代码段,数据段等合并到一个内存布局中(此时基于链接脚本(Linker Script)的规则和上述的相对地址分配绝对地址)。例如某个函数func在代码段的偏移量是0x100,但是链接脚本规定了代码段的起始地址是0x08000,则func的绝对地址就是0x08100,同时链接器还会在所有调用处,把其跳转地址更改为0x08100。

注意:链接器生成的绝对地址就是在磁盘或者flash上的地址即程序加载到内存后,CPU 将直接使用这些地址访问指令和数据

        回想我们曾经学过的虚拟地址空间,是不是恍然大悟。如果没有虚拟地址空间来隔离真实的物理内存布局,所有程序经过链接器生成的地址是不是都是类似的,即所有程序的代码段起始地址,数据段起始地址都是一样的。那么说明一个磁盘中就只能保存一个程序了,因为不同的程序会覆盖写到磁盘的相同为止。

        有人可能要说了,那我修改我的链接器,每一次编译一个程序,就让链接器中缓存一些地址,它表示下一次链接器启动的位置,在理论上说这是可行的,但是实际操作中并不可能。因为它十分困难,而且不可拓展,相当于你每次写一个程序就要针对该程序规划一下内存布局。

        所以我们的操作系统经过虚拟地址空间的页表映射,就能防止链接器生成的绝对地址直接访问内存了,而是你要写数据到磁盘对吗?没问题,我操作系统先检查一下物理内存哪里还有空,我分配给你使用。即使链接器生成的代码的地址是一样的,但是并不知道有虚拟地址空间这个东西,实际上是操作系统把相同的虚拟地址分配到了不同的物理内存上。

(2)可执行程序是如何烧录到单片机的flash的?

        经过上一个步骤,我们已经在自己的电脑的磁盘中有了一份可执行程序,那么他是如何经过数据线拷贝到STM32的flash中的呢?

        在STM32开发中,往往有许多不同的调试器,如ST-Link、J-Link等。他们只是在信号线的条数等地方有区别,这里我以ST-Link为例进行讲解。首先我们要知道STM32芯片中有一个模块叫做调试模块(如ARM CoreSight调试组件)。他的作用是下载程序到flash、以及调试程序。

     在你点击下载的时候,分为以下步骤:

(1)调试器通过SWCLK(时钟线)和SWDIO(数据线)与STM32的调试模块(如ARM CoreSight调试组件)建立通信。且同时电脑要和调试器建立通信。

(2)电脑再分块发送数据或者指令(如下载指令或调试指令)给调试器,调试器将高级命令,转换成二进制机器码SWD 协议信号,如高低电平信号变化。将这个电平信号转发给STM32的调试模块,最后调试模块基于该电平信号解析,进行读写falsh把该二进制电平信号拷贝到单片机中。

这个过程中经过了哪些总线,以及哪些模块呢?

在这里有一个很关键的数据总线,叫做DCode总线,他的存在就是为了进行Cortex-M3内核与Flash进行数据交互的。

如果在STM32的结构图中具体就是这样的:

(3)单片机是如何从flash读取并执行可执行程序的?

        通过上一个步骤,我们已经明白了可执行程序是如何从电脑主机流入到单片机的falsh中的,那么单片机在执行一个程序的时候肯定先要从flash中把他读入到自己的Cortex-M3内核中执行,他又是如何实现的呢?

        其实他和上一个步骤大同小异。

1.PC程序计数器会生成一个指令的地址。该地址通过地址总线发送给flash模块

2.flash模块通过ICode传输指令,DCode传输可执行程序的相关变量、常量数据等

3.由核心进行运算,重复上述操作就能执行一个完成的程序。

注意:由于核心的运算速度远比flash的读取效率高,所以往往会有内存的存在,他是为了协调二者读写运算速度差异的,这个和之前C语言中学的类似。所以理论上flash向核心返回的数据(指的是运行数据而非指令数据)并不是直接交给了内核,而是先交给内存。

        且由于ICode和DCode是可以并行操作的,所以极大程度上提高了指令和数据的并行传递。

        这个过程中ICode是单向的,仅仅能保证Flash的指令能传递给内核。

指令的传递过程:

数据的传输过程:

        当你了解了这两个过程,那么调试过程也会变得十分简单。

        无非就是调试器向内核发送运行(continue 命令)或者暂停指令(pause 或 halt 命令)以及其他指令(逐条执行指令、在指定地址设置断点、读取或修改内存内容等),然后内核执行上面的执行操作。

注意:这里的调试器到内核的过程并不会经过任何总线,而是有额外的线路和内核直连,因为调试操作需要低延迟响应(通过总线会和其他模块产生竞争),直接通过硬件接口可避免 SRAM 和总线访问的额外开销。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词