温馨提示:文本由机器自动转译,部分词句存在误差,以视频为准
00:00
你有没有想过,单片机刚通电的时候,它连main函数在哪都不知道,那它到底是怎么一步一步跑到mainn的?如果你的技术还只是停留在点灯阶段,那这样的问题你大概率是回答不上来的。马上就秋招了,为帮助更多朋友顺利找到工作,有需要修改简历或简历指导的朋友可以后台私我,我免费帮你改,精力有限,每天最多10份哦,很多人以为程序下载进STM32以后,芯片一上店就会直接执行main函数,其实man并不是程序真正的起点,在它前面还有一套非常关键的启动流程。先说第一步,复位当STM32刚刚上电,或者你按下复位键以后,内核会进入复位状态,这个时候CPU要做的第一件事不是找妹,而是去一个固定的位置读取向量表。向量表可以理解成一张地址清单,它的第一项保存的是占点地址,第二项保存的是复位处理函数reset handler的地址。为什么先读取占点地址?因为程序运行时函数调用局部。
01:00
量和现场保存都可能要用到占。CPU必须先知道站放在哪里,后面的代码才能正常执行。所以CPU先把向量表里的第一个值加载到主站指针MSSP,然后读取第二个值跳转到reset handler. 到这里,单片机才算真正开始执行我们熟悉的程序代码。那Reset handler又做了什么?它通常会先调用system in配置一些底层环境。不同工程里的具体实现可能不一样,一般会涉及芯片基础设置,有些工程还会在这里处理时钟或者向量表的位置。接下来还有一部特别关键初始化C语言的运行环境,比如你定义了一个已经赋初值的全局变量in the count=10,这个变量运行时一般要放在M里,但初始值时是跟着程序保存在flash里的。启动代码会把这些初始数据从flash复制到RAM,这就是对data端进行初始化。如果你写的是int flag这种没有显示复制的全局变量,一般会放在BSS端,按照C语言规则。
02:00
他在程序开始时应该是0,所以启动代码还要把这一片内存清零,这两件事没做完,即使强行进入面,全局变量的值也可能完全不对。把站设置好,系统环境初始化好data塔段复制好BSS段,清零以后,启动代码才会调用C库入口,最终进入我们写的main函数,所以完整过程可以简单继承。商店复位,读取向量表,设置站指针,进入reet handler初始化系统,搬运data段,清零BSS端,最后才调用魅影。这也是为什么有时候程序连main都进不去,问题不一定出在main里面,也可能是占地的错误,启动文件不匹配,链接脚本配置错误,甚至在系统初始化阶段就已经触发了异常。面试官问这个问题也不是只想听一句先执行启动文件,他真正想看的是你是否理解向量表、flash framem、赞和启动代码之间的关系?好了,今天的分享就到这里,如果觉得有用,记得点赞关注,咱们下期见。
我来说两句