1. 芯片及内核介绍
计算机内核架构(Processor Core Architecture)是指构成微处理器芯片的基本设计和组织结构,它定义了处理器执行指令、处理数据和控制程序执行的方式。不同的内核使用不同的内核指令集,内核架构也成为指令集架构,比如我们日常使用的计算机(Intel或AMD芯片),使用的就是X86指令集,内核就属于X86架构。常见的还有ARM架构、DSP架构和RISC-V架构。当我们想要掌握某款芯片,基于该芯片进行系统搭建时,就必须要了解该芯片的内核。
嵌入式领域的芯片一般都是精简指令集内核,比如RISC-V、ARM等, **精简指令集(RISC,Reduced Instruction Set Computing)是一种计算机处理器架构设计理念,其核心思想是将处理器的指令集设计得相对较小和简单,以提高执行效率。相对于复杂指令集计算机(CISC)**架构而言,RISC架构强调用更少、更基本的指令来完成操作,并且这些指令的执行时间相对较短。
英飞凌Aurix2G TC3XX系列芯片的内核架构是一种混合架构,同时结合了精简指令集计算机(RISC)和复杂指令集计算机(CISC)的特征,称为TriCore内核架构(以下简称TriCore)。它是一款专门为实时性进行了优化的32位的单核(这里的单核并非指芯片的单核,而是系统架构只涉及一个核,多核之间相互独立,区别于多核架构)嵌入式系统架构。之所以命名为TriCore,是因为其集成了RISC架构、DSP架构和实时系统的技术于一体,形成了兼具三方优势的内核架构。
TriCore架构采用了RISC-V的高性能load/store数据处理模式,同时具有DSP的数据处理能力。TriCore是32位计算机系统,因此采用32位地址空间,支持可选的虚拟地址空间。下面是TriCore架构的特性:
32位架构
4GB的地址空间
同时支持16位和32位指令,减少代码大小
大多数指令在一个周期内执行
分支指令(使用分支预测)
使用并行数据存储器,实现低中断延迟与快速自动上下文切换
专用接口特定于应用程序的协处理器,以允许添加定制指令
零开销回路功能
双/单时钟周期,16x16位乘法累加单元(可选饱和)
可选浮点单元(FPU)和内存管理单元(MMU)
广泛的位处理能力
单指令多数据(SIMD)打包数据操作(2x16位或4x 8位操作数)
灵活的中断优先级方案
字节和位寻址
数据内存和CPU寄存器的小端字节排序
内存保护
调试支持
本文主要介绍程序模型、通用寄存器和系统寄存器等。中断系统我们已经在之前发布的文章介绍过,上下文保存机制、TRAP系统等我们后续也会专门出文章进行介绍。
2. 内核详解
2.1 程序模型(Programming Model)
该小节主要介绍内核的数据类型、数据格式、存储模式以及地址空间等内容,因为计算机的本质其实是对数据的处理和呈现,因此要理解一款内核,首先要理解其数据的处理模型。
2.1.1 数据及内存
首先我们来看TriCore的数据模型,注意,这里提到的数据模型,是指内核在处理数据时的视角,并非我们C语言中定义数据的视角。TriCore架构支持下面几种数据类型:
Boolean:布尔型,FALSE表示0,TRUE表示1
Bit String:布尔串,一段Bit段,用于移位操作
Byte:字节,一个字节是8Bit的数据
Signed Fraction:有符号的分数,TriCore支持16位、32位、64位的分数
Address:地址表示一段32位地址数据(TriCore有专门的地址寄存器,下文会介绍)
Signed and Unsigned Integers:又符合和无符号整型,表示32位有、无符号数据
IEEE-754 Single-Precision Floating-Point Number:浮点数
TriCore是32位架构,因此大多数指令都是基于32位数据进行处理的,与数据类型相对应,其指令支持的数据格式如下图:
程序对数据的读取、存储操作是有对齐要求的,见下表:
同样外设的地址访问也是有对齐要求的:
TriCore的数据存储使用的是小端对齐,低字节在低地址。
TriCore是32位内核,因此地址最多支持0xFFFF FFFF,也就是4GB空间大小。因此地址空间的定义被分为16个段(Segments)[0 - F],地址最高位的4个Bit表示段号,每个段256MBytes大小。其中F段被用于外设寄存器地址段。
2.1.2 寻址模式
我们知道,计算机在进行数据计算过程中,需要不断进行数据的读取和存储,这中间有一个重要的流程就是寻址。不同的内核支持不同的寻址模式,TriCore支持的寻址模式如下表:
Absolute:绝对地址寻址模式,用于外设和全局变量的寻址
Base+Offset:基地址加偏移寻址方式,一般用于结构体成员寻址和局部变量的栈寻址
Pre-Increment and Pre-Decrement Addressing:预加/预减寻址,一般用于栈的操作
Post-Increment and Post-Decrement Addressing:后加/后减寻址,一般用于数据数据的处理指令
Circular:循环寻址,一般用于循环操作中
Bit-reverse:位翻转寻址,用于FFT算法中
2.2 通用寄存器和系统寄存器(General Purpose and System Registers)
TriCore的内核寄存器包括通用寄存器和系统寄存器,系统寄存器包括程序状态寄存器等。其中系统寄存器的地址是16位内核地址,读写采用的是专用的指令,MTCR(Move To Core Register)和MFCR(Move From Core Register)。
2.2.1 通用寄存器
通用寄存器是计算机体系结构中的寄存器,其设计用途是存储通用数据,而不是特定的数据类型或用途。通用寄存器可以存储整数、浮点数、内存地址等各种数据类型,而不受限于特定的操作或指令。
在许多计算机架构中,通用寄存器用于执行各种操作,如算术运算、逻辑运算、数据移动等。程序员可以使用这些寄存器来存储临时变量、中间计算结果和其他通用数据。通用寄存器的优点在于其灵活性和通用性,允许程序员更自由地使用寄存器来执行各种任务,而不受到特定数据类型或操作的限制。这有助于提高程序的灵活性和性能。
相比于ARM内核,TriCore有两类通用寄存器,包括16个32位数据寄存器(D[0]D[15])和16个32位**地址寄存器**(A[0]A[15])。
其按照功能有如下几类:
通用寄存器:D[0]D[14]、A[2]A[7]、A[12]~A[14]为真正意义上的通用寄存器
A[15]和D[15]为隐式寄存器,32位指令下与通用寄存器功能相同,16位指令下作为默认的寄存器使用
A[0]、A[1]、A[8]、A[9]为全局寄存器,在函数调用、中断、异常等场景都不会进行操作
A[10]为栈指针寄存器
A[11]为返回地址寄存器
数据和地址寄存器的分离促进了算术和内存操作并行执行的高效实现。同时,相邻的两个奇偶寄存器还可以成对进行访问,比如通过E[0]访问由D[0]和D[1]组成的64位数据(D[1]存放高8位),通过P[0]访问由A[0]和A[1]组成的64位地址。
众所周知,在操作系统调度或中断程序切换过程中,系统需要保存上下文,其中主要的内容是保存寄存器。TriCore的通用寄存器分为高上下文和低上下文,高上下文包括A[10]A[15]、D[8]D[15],低上下文包括A[2]A[7]、D[0]D[7]以及A[11],其中仅有返回地址寄存器A[11]在两部分中都存在。A[0]、A[1]、A[8]、A[9]作为全局地址寄存器,不存储在上下文中。
2.2.2 程序状态信息寄存器(Program State Information Registers)
程序状态信息寄存器包含三个寄存器:程序计数器,也就是我们常说的PC指针;程序状态字PSW;前一个上下文信息PCXI。
PC寄存器为32位程序计数器,反映了程序执行的位置,始终指向下一条即将执行的指令。
程序状态字PSW顾名思义,是用来反映程序执行过程中的状态信息。其中:
USB:用户状态位(User Status Bits),用来保存指令执行过程中的副作用位,如溢出信息等,用于后续指令作条件判断
RES:预留
PRS[2](Bit15)& PRS[1:0](Bit12,Bit13):保护寄存器集切换位(Protection Register Set bit),内存保护寄存器有多套配置,PRS用来选择程序保护寄存器或数据保护寄存器的配置切换
S:安全任务标识符(Safety Task Identifier),标注当前任务是否为安全任务
IO:I/O访问权限级别控制位(Access Privilege Level Control),TriCore内核对于外设寄存器的访问是由权限级别的:
0:User-0 Mode,无权访问外设,在此权限下访问会产生PSE和MPP异常,也无法进行开关中断
1:User-1 Mode,常规访问权限,在此权限下能够访问大部分外设,包括Port口的读写、定时器的读取和大部分I/O状态读取,能够开关中断
2:Supervisor Mode,具有完全的外设访问控制权限
3:Reserved Value
IS:中断栈控制位(Interrupt Stack Control),TriCore内核是有独立的中断栈寄存器ISP的,当进入中断且IS位为0的时候,硬件会先将栈寄存器置为ISP的值,以使用中断的特有栈(当然,在此之前硬件会自动保存SP指针,中断返回后会自动加载回来,不用担心被覆盖),并将IS位置1 。因为是共享栈,如果发生中断嵌套,则不作任何操作,继续往下使用中断栈
GW:全局地址寄存器写权限位,决定是否可写入全局地址寄存器,1表示有权限;全局地址寄存器一般用来指向某个关键的地址区域或关键的数据结构体,比如OS的任务调度控制块等;另外通常A[0]被用于短数据的读取和写入,A[1]也一般为编译器操作预留,A[8]和A[9]未作为编译器预留,一般用于指向系统的关键数据
CDE:调用深度计数使能位(Call Depth Count Enable),TriCore内核是有调用深度检查的,每次调用计数器加1,最大6位计数器,也就是最多支持64层调用(每个Task或者中断具有独立的上下文,因此独立计数),当超过调用上限,会产生异常;将CDE置0,可暂时关闭调用计数,但是在下次Call指令执行时会自动再次打开
CDC:调用深度计数器(Call Depth Counter),调用深度计数器,7个Bit位宽,溢出时产生异常,也可修改CDC降低调用深度上限,比如改为1111100,则4次调度就会产生异常
前一个上下文信息PCXI用来进行程序的上下文加载,当程序需要返回时,或中断结束调用时,都需要从这个地方向前链接,因此PCXI也称为链接字(Link Word),它和CSA的配合使得TriCore能够实现一套高效的硬件上下文保存机制,下面我们会介绍,这里先看PCXI的内容:
RES:预留
PCPN:前一个CPU中断优先级(Previous CPU Priority Number),在之前关于中断的文章中我们提到过,中断的处理流程的一个步骤,是将ICR.CCPN,也就是当前的CPU中断优先级位,写入到PCPN,也就是本寄存器位中,用于中断环境的保存,中断执行完之后再进行恢复
PIE:先前中断使能位(Previous Interrupt Enable),同PCPN,在中断处理流程中将CPU中断使能状态位ICR.IE,保存到PIE中,用于中断环境保存,中断执行完之后再进行恢复
UL:高、低上下文标签(Upper or Lower Context Tag),1表示高上下文,0表示低上下文
PCXS,PCXO:CSA是存储在内存中的,PCXS和PCXO用于指示存储地址,物理地址有32位,但是实际的内存空间没有这么大的,且CSA是64字节对齐,地址末尾6个为0,所以只需要20位就能指示上下文存储位置,具体算法是Addr=(PCXS<<12)|(PCXO<<6)
TriCore的上下文机制是利用CSA建立链表,PCXI指示链表的首位,以此形成函数调用栈关系。
2.2.3 栈管理寄存器
栈管理包括用户栈和中断栈,用到前文提到的栈指针寄存器A[10]、中断指针寄存器ISP(Interrupt Stack Pointer),以及前文提到的PSW中的IS位,来进行栈的管理。当运行非中断程序时,CPU正常根据栈指针寄存器使用普通程序栈,当从Task进入中断时,硬件会自动切换到中断栈。
栈指针寄存器通常是程序启动时进行初始化,根据链接脚本分配的栈空间,设置栈起始地址。
中断栈指针寄存器的使用,能够防止中断程序侵占Task程序的栈。在程序进入中断且PSW.IS==0时,系统会从ISP中加载中断栈地址到栈指针中,以使用中断的栈;如果是中断的嵌套,PSW.IS==1,则不进行任何操作,继续使用中断栈。当中断执行完毕后,PSW和栈指针都会从上下文中恢复,因此Task程序得以继续使用原先的栈.
2.2.4 系统控制寄存器
系统控制寄存器SYSCON的主要功能是对所属核进行控制(该寄存器有外设32位地址,可进行跨核访问,比如主核通过控制从核的BHALT位设置启动),主要包括:
RES:预留
BHALT:启动冻结状态控制位(Boot halt status and release),当芯片启动后,除了主核以外,该位都会置1,代表该核处于冻结状态,主核通过对该位写0来启动该核,启动后写1无效
U1_IO:User-1 Peripheral access as supervisor,前面我们提到用户模式包括User-0、User-1和Supervisor三种模式,该位能够允许User-1获得对外设的全部访问,不改变模式的情况下提高权限
U1_IED:User-1 Instruction execution disable,禁止或使能User-1模式下开关中断
ESDIS:Emulator Space Disable,仿真地址禁用
TS:进入异常(Trap)后PSW.S的默认值
IS:进入中断后PSW.S的默认值
TPROTEN:Temporal Protection Enable,1表示使能,0表示关闭
PROTEN:内存保护使能,注意需要先设置好内存保护配置再使能
FCDSF:空闲上下文列表耗尽粘滞标志位(Free Context List Depleted Sticky Flag),该位表征是否发生过上下文列表耗尽,因为CSA的空间是RAM中设置的,如果任务或中断过多,且都调用过深会导致CSA耗尽,从而该位置位,知道清除
2.2.5 Core_ID寄存器
Core_ID寄存器用来获取当前核的ID,在多核系统中,共用代码尤其是OS,获取所在核是非常重要的。
中断、内存保护、Trap相关的寄存器我们将会在模块单独介绍时候进行说明,这里就不展开介绍了。
3. 小结
本文主要介绍了Aurix TC3XX系列芯片的内核原理,从内核结构和寄存器对TriCore内核进行了说明。TriCore是基于三种内核发展而来的,因此从它身上还是能看到其他内核如ARM、RISC-V等的影子的,同时也结合了精简指令集和复杂指令集的优势,不仅有着较高的数据处理速度,也有类似DSP内核的复杂数据处理能力。下一篇内容,我们将结合TriCore内核指令和硬件逻辑,来介绍其上下文切换流程,以及其核心设计框架——CSA,这也是TriCore实现高实时性的关键机制。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_44000419/article/details/136143434
|
-
20161112131108144.jpg
(66.65 KB )
-
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3gxMTMxMjMwMTIz,size_16,color_FFFFFF,t_70#pic_center.jpg
(79.3 KB )
-
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg
(127.78 KB )
-
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg
(269.53 KB )
-
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg
(465.84 KB )
|