1. 前言
书接上文《arm_cortex-m0 designstart系列--3rtl仿真过程的详细分析》,本文基于hello这个case,对cortex m0的启动过程做一个详细的分析,其实整个arm cortex m系列的启动的过程都是很相似的,这对我们理解soc的启动过程会很有帮助。
2. cortex-m0 启动流程
arm cortex-m架构芯片一般带有片上闪存(flash)。arm cortex-m手册规定在片上闪存(flash)起始地址处需要有一个有效的中断向量表。芯片上电或复位(会触发reset_handler中断程序)后,cpu首先从中断向量表中读出栈指针(msp)和入口函数地址(复位向量,即程序执行的起始位置)。将栈指针和入口函数地址载入栈指针(cm0_msp)寄存器和寻址寄存器(cm0_pc)后,cpu会从复位向量 (一般是rom/flash)开始执行程序。
2.1 复位序列:
根据上文的描述,复位顺序大致如下图(复位序列)所示:
2.2中断向量表:
2.2.1 中断向量表的定义:
上文中提到的中断向量表(向量表在以后还可以转移到其它位置),那么什么叫中断向量表呢?把系统中所有的中断类型码(中断号)及其对应的中断处理函数按一定的规律存放在一个区域内,这个存储区域就叫中断向量表。
如下图所示,在cm0中,在地址0提供的是msp的初始值,然后紧跟着的是复位向量。向量表中的数值是32位的地址,不是跳转指令。向量表的复位向量指向复位后应执行的第一条指令。
2.2.2中断向量表格式
中断向量表每一条目为一个32bit的地址。每一个地址对应一个中断函数的地址(第一个条目除外)。除了第一个条目以外,所有地址的目标都为寻址寄存器(pc)。当相应中断触发时,arm cortex-m硬件会自动把中断向量表中相应的中断函数地址装载入寻址寄存器(pc)然后开始执行中断函数。如上所述,前16位(从msp初始值->systick向量)为arm保留的系统中断向量,建议大家熟记。之后的中断为芯片自定义的外部中断向量,可以在使用时查询手册或者厂商提供的驱动程序。
2.2.3 本项目中的中断向量表
下面的两副截图是我从cm0_designstart的启动文件startup_cmsdk_cm0.s中的截图,跟上面的图示解释是一致的,只是增加了一些外部中断向量。
通常中断向量表会放在启动文件中,那么什么是启动文件呢?顾名思义,就是mcu上电启动后要开始执行其中的代码(当然是编译后的代码,或者机器码指令)。要知道,我们对单片机烧录程序后,程序是存在nor flash(即nor闪存,通常用于存储程序,nand 闪存通常用于存储数据)。启动文件是使用汇编语言编写的,在堆栈建立之后才可以运行c代码,因为c函数调用需要把参数函数返回地址入栈,堆栈没有建立不能运行c代码。启动文件主要完成以下工作:1. 初始化堆栈指针msp和程序指针pc;2.初始化中断向量表;3.定义reset_handler子程序,4.初始化中断服务程序;5. 初始化用户堆栈。关于启动文件的更多细节,可以参考下图中的code。
2.3程序存储器和bootloader
cortex-m0的程序存储器,一般使用片上flash,但是程序也可以存储在外部或者使用其他类型的存储器(如外部spi flash、eeprom等)。我们一开始就讲了,当cpu从复位中启动时,会首先访问0地址的向量表,从而取得msp的初始值和复位向量,然后从复位向量开始执行程序。但要保证系统正常工作,系统中需要有合法的向量表和合法的程序存储器,这样cpu才不会执行恶意软件代码。
关于向量表我们前面已经讲过了,而程序存储器(也就是flash存储器,因为程序一般存放在flash中)一般是从地址0开始的。但是,在用户编程以前,市面上mcu产品的flash存储器中可能没有任何程序。
为了保证cpu可以正确的启动,有些基于cortex-m的mcu含有一个bootloader,bootloader是位于mcu芯片上的一小段代码(程序),bootloader会在cpu上电后执行并跳转,并且如果flash存储器已经编程的话,它会跳转到flash中的用户程序执行。bootloader是由芯片供应商预先编程,有时它位于片上flash存储器并且与用户程序是分开的(这样用户更新程序也不会影响到bootloader),而更多的时候它是位于和可编程程序存储器相互独立的rom中。
上电以后,cpu会执行bootloader程序,bootloader 主要是给系统一个机会,在上电后是从外部接收程序更新到系统内的flash,然后再执行,其实还是直接执行系统内flash内的程序。
当然,即使没有bootloader,即使flash存储器中缺少合法的程序映像,debugger也可以通过我们上文讲解的swd接口连接到cpu并重新编程flash存储器。
说到这里,又是中断向量表,又是启动文件,又是bootloader,是不是有点晕菜的感觉?不过你千万别犯迷糊,你再看看我们之前的一篇文章《arm_cortex-m0 designstart系列--3rtl仿真过程的详细分析》中bootloader.o以及bootloader.lst是怎么产生的,你就明白怎么回事了。下面是反汇编bootloader.lst的截图。结合下面的截图以及我们上面的分析,就应该就可以很清楚其中的过程了。
2.4启动过程的波形分析
2.4.1 ahb协议简单介绍
由于后面启动过程的波形分析是基于ahb总线的,多少需要一些ahb协议的基础,当然了这并不复杂。我从协议里面截了几张图,大家看一下就很清楚了。
2.4.2 启动波形分析
下面是,基于hello这个case的仿真波形,我们这里重点关注复位以后启动部分的波形。有了上面大量的分析和铺垫,到这里感觉反而轻松了。大家将下图中的波形跟bootloader.lst文件做一下对照就很容易理解了。下图中值得一提的是,从地址4读出的复位向量是’h199,而程序执行的起始位置是’h198。原因是,程序执行的真正起始位置是’h198,但是在将这个地址放到复位向量处时,将最低位置1,以表示thumb代码,即cm0是在thumb状态下执行的,仅此而已。
今天暂时先写到这里了,我们后续不见不散。
基于测量数据的电磁兼容性能参数建模的研究
vivox20发布会精彩盘点回顾:vivox20发布四大亮点解读,350万现货价格2998元起
电解液概念和浸润效果以及提高浸润效果的方法解析
差示扫描量热仪熔点检测:实验过程与结果分析
器件的1/f噪声有点吓唬人
ARM Cortex-M0 DesignStart系列--4启动过程分析
Agilent安捷伦E5071B网络分析仪8.5GHz
STM32单片机重映射USART设计
江苏林洋能源签署灌云永贯98MW光伏发电项目 合同总价达40,474万元
马斯克展示机器人“擎天柱”叠衣服
运算放大器的各种参数介绍
笔记本电脑音响的先天缺陷浅析
韩国5G用户数量跃升至870万
台积电和华为合作不变,新技术令人期待
推动5G商业变现,释放5G商业价值
一文带你看遍LED照明灯具性能特征与注意点(图文)
5G!AMEYA360签约芯讯通授权代理商
3D打的学校在非洲马拉维开学
我国首份生成式人工智能监管性文件已正式实施
使用MM32F0160 FlexCAN-FD接口实现CAN FD通信