最近看了好多关于处理器内部架构和原理的内容,脱离具体处理器学习总感觉不太容易,因为STM32资料较多,于是先研究下STM32启动流程和执行架构,结果发现里面水很深,竟花近一个礼拜时间方才完全领悟,网上资料虽多,但也比较分散,于是想自己整理一个出来分享给大家。
首先,是关于处理器的哈佛架构和冯诺依曼架构的区别,简单来说,哈佛架构是一种将程序指令储存和数据储存分开的存储器结构。冯诺依曼架构是一种将程序指令存储器和数据存储器合并在一起的电脑设计概念结构。怎么理解呢?具体到STM32上,STM32是哈佛架构,它在运行时,指令存储在片内的norflash上,数据存储在片内SRAM上,也就是说,STM32的程序是可以直接在FLASH上运行的,而不是先将FLASH上的程序全部copy到RAM再运行,这一点需要注意。
接下来说下STM32启动流程。
STM整个启动过程是指从上电开始,一直到运行到main函数之间的这段过程,步骤为:
①上电后硬件设置SP、PC
②设置系统时钟
③软件设置SP
④加载.data、.bss,并初始化栈区
⑤跳转到C文件的main函数
在真正讲解启动过程之前,先要讲解程序下载到Flash上的结构和程序运行时(执行到main函数)时的SRAM数据结构。程序在用户Flash上的结构如下图所示。下图是通过阅读hex文件和在MDK下调试综合提炼出来的。
MSP初始值 编译器生成,主堆栈的初始值
异常向量表 不多说
外部中断向量表 不多说