目录
2.1 S32K144芯片的Interrupt Vector
3. Reset Vector等价于Interrupt Vector吗
前言
最近在研究符合AUTOSAR架构的OS(代码级别),系统在EcuM_Init调用OS标准接口StartOS之前还做了非常多的准备工作,感觉不把这些地方搞明白就去研究OS有点基础不牢呀,而且后面还发现OS在开始任务调度之前还完成了中断向量表(Interrupt Vector)的重映射,然后ECU第一次上电后还会有一个Reset Vector的概念,二者有什么联系了?本文讲基于NXP的S32K144芯片和Renesas的RH850-U2A芯片谈谈自己对Reset Vector和Interrupt Vector的理解。
ECU系统从上电到运行到main函数之前一般经历了初始化堆栈,初始化RAM,系统初始化等操作,具体可以参考:
本文参考文档:
1.RH850/U2A-EVA GroupUser’s Manual: Hardware
瑞萨电子 (Renesas Electronics Corporation)
2.Cortex-M4 Devices Generic User Guide
3.ARM Cortex-M4 Processor Technical reference manal
3.ARMv7-M Architecture
4.S32K1xx Series Reference Manual
正文
1. 什么是Reset Vector
Reset Vector也就是系统上电后存放第一个PC指针程序地址的存储空间的首地址值。
1.1 S32K144芯片的Reset Vector
S32K144芯片采用Cotex-M4内核,ARMV7架构,对于系统复位重启后上电的默认操作需要查看ARM相关的的手册,如下图所示:
R13是堆栈寄存器(stack Pointer),在Thread mode下,COTROL寄存器的bit[1]控制stack pointer作为Main Stack Pointer(MSP 这个是reset 值)还是Process Stack Pointer(PSP)
系统复位Reset后,处理器装载0x00000000地址处的四字节值到MSP寄存器。也就是说系统启动的时候,0地址处存放的是MSP寄存器的值。
R15是程序计数器(Program Counter PC)。存储当前程序地址。Reset重启的时候,处理器装载0x00000004地址处的值到PC指针,也就是装载Reset handler的地址到PC指针,PC指针跳转到Reset Handler标号/地址处开始执行Reset Hander标号下的操作。
也就是说,对于S32K144芯片,Reset Vector也就是Reset Handler,也就是以0x0000_0004为首地址的四字节(.long)存储的Reset Handler标号的地址。
Reset Vector/Handler下的具体操作就是跳入到main函数之前的一些系统级操作,如初始化堆栈,初始化RAM,系统初始化等。具体参考前言部分关于S32K启动流程的参考文章。
1.2 RH850芯片的Reset Vector
RH850芯片采用瑞萨公司自定义的内核IP架构(不是ARM,PowerPc,X86等常见嵌入式芯片架构),有自己一套独立的指令集。
但是,关键核寄存器(SP,PC,LR等)和ARMV7架构的核寄存差不多。
RH850-U2A有四个核,每个核的Reset Vector地址可以通过Option Byte(RH850特有的配置字,可以配置系统时钟,Reset Vector地址等很多关键信息)配置,核0(PE0)和核1(PE1)的默认(default)Reset Vector地址是0x0000_0000(也就是说,系统上电后PC指针把0x0000_0000起始地址处存放的程序所在地址装载到PC指针),核2(PE2)和核3(PE3)的默认(default)Reset Vector地址是0x0080_0000(也就是说,系统上电后PC指针把0x0080_0000起始地址处存放的程序所在地址装载到PC指针)。
也就是说,对于RH850芯片,Reset Vector也就是以0x0000_0000/0x0080_0000为首地址的四字节(.long)存储的Reset Handler标号的地址。
2. 什么是Interrupt Vector
中断向量表就是一片地址空间,这段地址空间里面存放了系统所有的中断处理函数的入口地址,包括异常中断处理函数。通常我们在讲中断向量表的时候都是说中断向量表的入口地址。每个系统有自己的中断控制器及对应的中断控制寄存器,我们可以通过改变中断控制寄存器中保存的中断向量表的基地址来对中断向量表进行重映射(也就是在不同地地址空间存放中断向量表,然后在合适的时候把中断向量表地地址赋值给中断向量表寄存器)。
2.1 S32K144芯片的Interrupt Vector
S32K144芯片是ARM-Cotex M4内核,ARMV7架构的芯片,核寄存器VTOR(中断向量表寄存器)中存放的就算Interrupt Vector的起始地址。
也就是说,赋值给VTOR寄存器的地址就是Interrupt Vector的起始地址,在系统启动启动阶段我们把isr_vector的地址赋值给了VTOR寄存器,也就是说Interrupt Vector地起始地址就是isr_vector所在的地址。
2.2 RH850芯片的Interrupt Vector
RH850芯片有两个中断向量表基址寄存器,EBASE存放的是异常中断向量表基地址,INTBP存放的中断向量表的基地址。
也就是说,对于RH850芯片有两个中断向量表寄存器,EBASE存放的是异常中断向量表的基地址,INTBP存放的是正常中断向量表的基地址。
3. Reset Vector等价于Interrupt Vector吗
以RH850芯片为例,PE0的Reset Vector的基地址是0x0000_0000,如果我们赋值0x0000_0000给EBASE,这个时候Exception Handler地基地址从0x0000_00010开始,这个时候我们可以理解为Reset Vector的基地址值等于Exception Interrupt Vector基地址值。
但是如果我们重映射EBASE = 0x0000_0100,这个时候Reset Vector的基地址值不等于Exception Interrupt Vector基地址值。
也就是说,Reset Vector和Interrupt Vector是两个概念,二者的值可能相同。
4. 总结
1. Reset Vector和Interrupt Vector是两个概念,二者的基地址的值可能相同。
2. S32K144的Reset Vector的地址是0x0000_0004,RH850-U2A PE0的Default Reset Vector是0x0000_0000。
3. 中断向量表控制寄存器中存储的值就说中断向量表的基地址,我们在系统开发的不同阶段(BootLoader和APP)会对其进行重映射,也就是BooLoader和APP中中断向量表的基地址是不一样。
4. 异常中断处理函数需要明确定义好,防止系统产生异常中断后找不到异常中断处理函数程序跑飞。