arm指令手册_平台/代码从上电到运行(ARM/Cortex-M)(一)

事实上, 网上可以搜出很多讲代码运行的相关帖子。但对于一些没入门的人来说理解起来仍有挑战性。 当然, 这篇日志也没必要从二极管、门电路、地球是怎样形成的之类的本源开始。 但尽量写的详细些, 主要目的在于把目前在这一方面认知整理成文, 细加梳理。

尽量通俗易懂的用自己的话阐述,试试自己能不能串起来。

0 0与1

首先, 需要一些操作系统知识, 两个寄存器, SP(堆栈指针), PC(程序计数器)。 所谓万变不离其宗, 记住每一行代码的有序运行, 每一个变量的存取离不开这两个寄存器。 不管各种书上和网页上怎么解释启动过程, 实质上都是通过改变这两个寄存器以达到驱使程序执行的目的。 当然, 让代码运行起来肯定不止这些, ROM、RAM甚至NOR FLASH、 SDRAM等都很重要, 但是目前还是集中精力把启动过程理清。

1 代码的本质

从依稀有印象的数电知识里, 可以知道各种数字逻辑是怎么从自然电压通过施密特触发器转换为0、1二值信号开始一一实现的。 嗯, 上一句的逻辑很严密, 非常棒。 寄存器、锁存器、触发器、 编码器、 译码器, 还有啥来着, 想不起来了。编码器是后想起来的,不知道为什么对它的印象好浅,可能是因为大学里数电期末考试关于它的大题没有做对吧。嗯, 合理。 刚才说的SP和PC就是寄存器。 总之, 这些器件与与逻辑门电路组合起来构成了更复杂的各种器件。 好了, 实际上只需要记住两个关键字, 0 和 1。 没错, 从模拟电路里的各种电压开始, 所有的数字逻辑门和数字器件都是围绕这二值信号运行。 理解代码背后的运行机制, 理解到这一层面即可, 有个笼统的概念, 更深更细的回去查书吧。 现在也记不起来,不知道。 到目前为止,只要心中有数: 我们可以通过0和1这二值信号驱动一个硬件电路完成我们指定的工作,进一步的讲,这些信号是通过电压的变化得到的。 比如最简单的,点亮一个二极管; 比如一个复杂的,给你国外的亲戚打个视频电话; 比如一个高级的,发射火箭。嗯, 好棒棒。 呵呵。

知道所有数字电路里的芯片、器件本质都是遵循二值信号的变换规律工作后, 就不难理解, 我们在PC上, 各种所谓开发环境也好、IDE也好、 框架也好, 总之各种编辑器里写下的代码都会经过编译的过程, 把这些代码翻译成为一个个的二进制文件。 当然, 一个完整的可以工作的工程, 还有更多的工作, 比如链接、pack iamge之类的, 现在也暂时只到这里了, 毕竟我现在在以加班的名义写日志, 我工作很饱和, 不过今晚老大去开会了。 呸, 我真不要脸。 事实上, 现在不管是PC机还是芯片,跑在这些平台上的工程,代码链接、编译、打包直到最后生成镜像文件的过程都被开发环境各种封装好的工具链自动完成了。

基于前两段, 我们分别知道了, 芯片的本质是通过0和1驱动的器件组成的电路、 我们写的代码最终会变成一个个都是由0和1组成的二进制文件。 好了, 我们需要的是只要把这一大堆一大堆的0和1 弄到芯片(不管是X86还是ARM)上,理论上就能有我们想看到的结果了。最近在看动漫石纪元,男主从石头开始做出了各种现代化设备, 真的牛逼。MMP, 活来了, 明天继续写。


2 代码的运行

很多人都知道ROM和RAM甚至还知道FLASH,更牛比的还知道什么是NOR FLASH什么是NAND FLASH, 还有什么SDRAM之类的种种。 简单讲, ROM是一种非易失性的只读存储器, RAM则掉电不可存储但可读写的存储器。 什么意思呢, 电脑运行的一个个软件都是一个个程序,这些程序存在哪里呢? 硬盘上。 不对不形象。 做菜。 锅碗瓢盆, 平时是放在柜子里的。 当然,有人做完饭不收拾,请原地爆炸。 做饭的时候这些锅碗瓢盆会从柜子里拿出来放在灶台上。 对应下来, 柜子就是平时存程序的地方,叫ROM。 灶台是用户使用这些程序的地方,叫RAM。但随着技术的进步, ROM与RAM之间的这种隔阂越来越模糊,尤其是在ARM架构下, 对存储器的分段定义更能证明所言非虚。

记得以前各种折腾电脑的系统, 动不动就重装。 有时会进入系统的BIOS然后做一些硬件相关的配置。 其实, 这个BIOS系统就是PC机的boot loader引导程序, 用来引导目标系统启动执行。 在嵌入式系统的开发过程中, 一个完整的产品需要有boot loader, 需要有app。 有时候,我们还需要给app固件进行升级, 因此一个优秀的boot loader代码能够完成这些功能:加载app、升级app。 这部分是目前的重点内容, 接下来展开讲。

2.1 代码的执行

事实上app的加载就是一段代码搬运的过程。 (1)里面的内容已经说了代码的来历, 是经过了一个编译链接烧录的过程。好, 所谓烧录就是把打包好的镜像文件(image file)存储到各个平台上。然后呢, 代码是怎么运行的呢? 别急, 还记得刚开始说的SP和PC吗,, 对, 这是两个寄存器:

SP(堆栈指针)寄存器总是指示栈顶所在位置, 为何栈顶的位置那么重要---- 所谓入栈出栈, 程序在这些出入的过程中总会产生对应的数据, 因此, 有了栈顶指针我们便能遍历到R0 --- R12通用寄存器,PC寄存器等(ARM体系)。

PC(程序计数器)总是自动指向下一个指令(ARM32位平台PC指向当前指令地址+4) , 对PC进行写操作,会使程序跳转到目的地址。

因此,上面这两个寄存器是能够引导代码的执行的存在。 再回头看, 芯片上电后,代码是怎么跑起来的呢? 首先, 这些都离不开人们的配置。 简单讲, 我把编译链接打包好的image文件放到了芯片的存储器上, 但是放到了哪个位置呢? 32位的MCU寻址范围并不是任意分配的, 有些是芯片的寄存器, 有些被划为了ROM, 有些被划为了RAM, 有些指定放代码, 有些指定放数据, 事实上,再往里这就牵扯到芯片的设计了。

目前还是再继续看代码的执行。 只说了SP和PC,却还没说明白代码怎么从上电后开始执行的。 要知道各个芯片的厂家都会都会根据各自的芯片内核架构去做相应的配置。 比如有些可以做到上电后从存储器的前4个字节取出的值即默认为SP指向地址, 之后的4个字节即为PC指向地址, 有了SP和PC内存储的地址,程序就可以运行起来了。

接下来,还要再把boot loader具体做了哪些事以及分散加载整理一下。 看看还是再补一些图吧。


2.2 启动代码解析

可能还是有点云山雾绕, 那就先从启动代码开始看吧。注意, 这个启动代码说的不是bootloader 。 bootloader是什么?说白了是一个程序, 最主要的作用是跳转到应用程序的主程序(app)。 也就是,bootloader里会有一个main函数, 应用程序里会有一个main函数。 而启动代码是整个系统在上电或者复位后运行的第一段代码, 是进入C 语言的main 函数之前需要执行的那段汇编代码。 启动代码里会做这几件事: 初始化并正确放置异常/中断向量表、 完成分散加载、 初始化系统运行环境(包括设置堆栈、FPU浮点数运算单元)等。 概括就是为代码在具体芯片上的运行进行配置。

https://blog.csdn.net/weixin_39118482/article/details/79508747​blog.csdn.net

这位老师讲的很不错, 恰好最近也在用NXP的片子。 再跟着嚼一遍捋一下。 划重点, 1、大多数cortex-M控制器复位后会进入厂商bootrom,进行一些芯片级别的初始化配置; 2、bootrom后进入用户启动代码; 3、 启动代码里完成的工作有设置MSP(main SP)和PC,以及重映射向量表; 4、 代码会从复位中断ResetHandler开始执行。

以及, 最重要的这个启动流程图:

73366ee21d314a03462b39c95fae9341.png

cortex-M启动流程

这位老师总结的很好。 再上几段<<cortex权威手册>>官方内容巩固一下认知。

06cd7def77d050724a022d8b95ca8cc7.png

内存空间的最开始保存的是一个向量表, 这个表里最开始的四个字节就是强调了很多次的堆栈指针,再然后是复位向量。 处理器在上电或者复位后会直接从内存的开始(事实上是看启动模式,但这里就先这样)读取栈顶值并赋给SP,然后设置PC值为复位向量,这样子一来前面的所谓程序就可以执行了。 怎么执行, _main() (注意_main()与main的不同, 一个是系统函数,一个是用户函数)。

f4e4d3536ed5d97a0c0c2db82304e6a4.png

上图里的地址是从0x0000 0000开始,其实这个启动地址也是可以根据代码加载情况做配置的。 写完启动后会写加载。

febc69990ddc2cd8188aa87453e06b4a.png

上图意在强调SP为要设为栈顶。

好了,这样子就知道上电后代码是怎么走的了。 进入ResetHandler后都做了哪些事呢,

e911233082d4e69993530b686245da0a.png

0XE000 ED08是VTOR寄存器地址, 用到这个是因为上图是APP的启动代码。暂先忽略。

SystemInit,这个函数里做了各个内部总线的时钟配置,做分频之类的,相当于给CPU内部各种器件(寄存器、编码器之类但又分不同总线,这里不写总线不深究)。 其实还是初始化。 再然后跳到_main,这个系统函数上面的链接里有跟,可以看到,__main里面会做分散加载,运行环境配置并且最后拉起用户代码。

今天就这样吧,腰疼。

[参考]

  1. <<cortex权威手册>>
  2. <<嵌入式系统设计与实践>> 机械工业出版
  3. <<现代嵌入式系统开发专案实务>> 电子工业出版

4. 高手带你分析STM32 的启动过程(写的不错)

5. https://blog.csdn.net/weixin_39118482/article/details/79508747

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/488719.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++ amp vs2017 报错_opencv4教程-1 opencv的安装与调试Windows10+vs2017

安装解压我就不必多说了。将opencv解压到相应的文件目录下&#xff1a;在vs2017创建一个空的项目。可以设置成release或者debug模式&#xff0c;64位&#xff0c;具体随意&#xff0c;代码如下&#xff1a;#include <iostream>using namespace std;#include <opencv2/…

F-35战机头盔:揭密世界最先进的显示系统(HMDS)

F-35战斗机头盔显示系统&#xff08;HMDS&#xff09;来源&#xff1a;今日头条F-35战斗机的第三代头盔是世界上最先进的头盔显示系统(HMDS)&#xff0c;首次使用了虚拟成像技术&#xff0c;可以直接将画面投射到驾驶员的面罩之上&#xff0c;配以计算机的处理运算技术&#xf…

定义一个Matrix类,实现矩阵的加法和乘法

1 #include<iostream>2 using namespace std;3 4 class Matrix5 {6 int row;//矩阵的行7 int col;//矩阵的列8 int **a;//保存二维数组的元素9 public:10 Matrix();//默认构造函数11 Matrix(int r, int c);12 Matrix(const Matrix &is);//拷…

无法读取配置节aspnetcore_ASP.NET Core 配置和使用环境变量

(给DotNet加星标&#xff0c;提升.Net技能)转自&#xff1a;HueiFengcnblogs.com/yyfh/p/12339961.html前言通常在应用程序开发到正式上线&#xff0c;在这个过程中我们会分为多个阶段&#xff0c;通常会有 开发、测试、以及正式环境等。每个环境的参数配置我们会使用不同的参数…

计算机软件英文参考文献,软件工程英文参考文献(优秀范文105个)

当前,计算机技术与网络技术得到了较快发展,计算机软件工程进入到社会各个领域当中,使很多操作实现了自动化,得到了人们的普遍欢迎,解放了大量的人力.为了适应时代的发展,社会各个领域大力引进计算机软件工程.下面是软件工程英文参考文献105个&#xff0c;供大家参考阅读。软件工…

面对新型肺炎疫情,AI能做什么?

来源&#xff1a; AI科技大本营根据最新的新型冠状病毒疫情通报&#xff0c;截至1月30日24时&#xff0c;国家卫生健康委公布确诊病例9692例&#xff0c;重症病例1527例&#xff0c;累计死亡病例213例&#xff0c;另有疑似病例15238例。为防止疫情扩散&#xff0c;全国31省市自…

残疾人计算机高考试题,残疾人勇夺玉溪高考榜眼:想去清华学计算机

没有脚&#xff0c;思想可以替我走很远。矣晓沅网易教育频道综合讯 据春城晚报报道&#xff0c;6年前&#xff0c;备受类风湿关节炎折磨的矣晓沅在家中写下了一篇名为《第一片落叶》的故事&#xff0c;讲述了一个中学生纷繁复杂的校园生活。彼时的他只能坐在轮椅上&#xff0c;…

directx repair_DirectX修复工具增强版

DirectX修复工具最新版&#xff1a;DirectX Repair V3.9 增强版 NEW!版本号&#xff1a;V3.9.0.29371大小: 111MB/7z格式压缩&#xff0c;196MB/zip格式压缩&#xff0c;345MB/解压后其他版本&#xff1a;标准版 在线修复版MD5校验码&#xff1a;DirectX Repair.exe/eeab9900cc…

灯亮怎么办_车辆隔音效果不好怎么办?

会开车并不代表对车了如指掌日常生活中还是有好多车主被诸多问题困扰&#xff0c;比如车辆隔音效果不好怎么办&#xff1f;扳手形状的故障灯亮起是什么意思&#xff1f;今天&#xff0c;就由利星大连为您答疑解惑汽车隔音效果不好该怎么办&#xff1f;有车以后遇到噪音偏大的情…

Linux下使用iotop检测磁盘io使用情况

介绍 Linux下的IO统计工具如iostat, nmon等大多数是只能统计到per设备的读写情况, 如果你想知道每个进程是如何使用IO的就比较麻烦. iotop 是一个用来监视磁盘 I/O 使用状况的 top 类工具。iotop 具有与 top 相似的 UI&#xff0c;其中包括 PID、用户、I/O、进程等相关信息。 实…

springboot 2.3_SpringBoot对消息队列(MQ)的支持

1.异步消息的定义异步消息的主要目的是为了系统与系统之间的通信&#xff0c;所谓异步消息即消息发送者无需等待消息接收者的处理以及返回&#xff0c;甚至无需关心消息是否发送成功。在异步消息中有两个很重要的概念&#xff0c;即消息代理和目的地&#xff0c;当消息发送者发…

改变世界的十大经典物理实验及十大著名思想实验

来源&#xff1a;EETOP科学实验是物理学发展的基础&#xff0c;又是检验物理学理论的惟一手段&#xff0c;特别是现代物理学的发展&#xff0c;更和实验有着密切的联系。现代实验技术的发展&#xff0c;不断地揭示和发现各种新的物理现象&#xff0c;日益加深人们对客观世界规律…

智慧城市_城市大脑:加速构建智慧城市

(来源&#xff1a;天津数港)原标题&#xff1a;城市大脑&#xff1a;加速构建智慧城市加关注当前&#xff0c;伴随着5G、大数据、人工智能、区块链和新基建等一波又一波科技浪潮的到来&#xff0c;智慧城市的建设方兴未艾。然而&#xff0c;“智慧城市不智慧”的问题一直困扰着…

爱尔兰圣三一学院计算机全球排名,QS世界大学学科排名,爱尔兰圣三一学院20个学科进世界百强...

原标题&#xff1a;QS世界大学学科排名&#xff0c;爱尔兰圣三一学院20个学科进世界百强“爱尔兰、教育、悠久学术历史、世界一流、最大图书馆……”&#xff0c;看到这些关键词&#xff0c;个蹦入脑海中的是什么呢&#xff1f;相信大家都已经猜出来了&#xff0c;拥有如此之多…

nginx做服务器入口_「查缺补漏」巩固你的Nginx知识体系

Nginx篇基本介绍Nginx是一款轻量级的 Web服务器 / 反向代理服务器 / 电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器&#xff0c;主要的优点是&#xff1a;支持高并发连接&#xff0c;尤其是静态界面&#xff0c;官方测试Nginx能够支撑5万并发连接内存占用极低配置简单&…

Oracle 维护数据的完整性 一 索引

简介:索引是用于加速数据存取的数据对象,合理的使用索引可以大大降低i/o 次数,从而提高数据的访问性能. 当我们从一张表中检索我们需要的数据是,oralce往往会进行全表扫描,就是遍历所有的数据行,来找到我们需要的数据,并返回结果集给我们,这个过程就像下图: 当这个人需要去图书…

特征值_陶哲轩数学发现的故事 | 特征值特征向量等式

12月3日&#xff0c;陶哲轩在其个人博客上更新了一篇文章&#xff0c;https://terrytao.wordpress.com/2019/12/03/eigenvectors-from-eigenvalues-a-survey-of-a-basic-identity-in-linear-algebra/说他与合作者在arXiv上更新了此前关于特征值的文章Eigenvectors from Eigenva…

迪士尼研究院等将人造“神经纤维”用于软体机器人,赋予其“本体感知能力”!...

来源&#xff1a;机器人大讲堂 导读软体机器人模仿章鱼&#xff0c;象鼻&#xff0c;海星等动物而设计&#xff0c;栩栩如生&#xff0c;他们由软材料&#xff08;硅胶&#xff0c;橡胶&#xff09;构成&#xff0c;有着天生优良的环境适应性以及安全交互性。但是相比于传统机器…

C# 静态类和非静态类(实例类)

1.非静态类里面可以出现静态成员和非静态成员 using System; namespace shuzu { class dom_class{public string name "张三";private int age;public int Age//通过属性访问私有成员{get { return age; }set { age value; }}}class aclass {static void Main(s…

保存时间 默认_一些不起眼但又非常的实用的PPT制作技巧,大大节省PPT制作时间...

从PPT小白到PPT大神的过程中&#xff0c;我们总会无数次碰壁&#xff0c;无数次陷入困境。今天为大家带来的是一些不起眼的PPT技巧&#xff0c;但是非常的实用&#xff0c;不信就看下文吧&#xff01;自定义访问工具栏在PPT中我们有很多的常用操作&#xff0c;例如「左对齐/右对…