频道栏目
读书频道 > 系统 > 其他综合 > ARC EM处理器嵌入式系统开发与编程
3.5.1 核心寄存器组
2020-09-22 16:43:01     我来说两句
收藏   我要投稿
本书以实际的嵌入式系统产品应用与开发为主线,力求透彻讲解开发中所涉及的庞大而复杂的相关知识。第1~5章为基础篇,介绍ARC嵌入式系统的基础知识和开发过程中需要的一些理论知识,具体包括ARC嵌入式系统概述、  立即去当当网订购

如表3-2所示,核心寄存器组共包含64个32位寄存器,具体如下:

1)26个基础的通用核心寄存器。

2)6个预留特殊用途寄存器,用于存储指令中隐式使用的特殊指针以及分支和中断子程序返回时存储在寄存器中的链接。

3)4个特殊目的保留寄存器,如循环计数器、长立即数寄存器、程序计数器等。

4)28个用于扩展的核心寄存器。


 


1.指令访问限制

ARCv2 ISA支持两种指令宽度:32位指令和16位指令。32位指令可以访问核心寄存器组的所有寄存器。16位指令受限于其有限的指令编码长度(3位),只能访问部分寄存器,对其余核心寄存器的访问需要通过特殊指令完成。表3-3列出了核心寄存器组的寄存器分别在32位指令和16位指令中的访问情况。


 

 

2. 16位指令中通用寄存器的映射

从表3-3可以看出,16位指令可以自由访问r0~r3、r12~r15这8个核心寄存器。对应其3位宽的操作数域,这8个核心寄存器在16位指令中的编码映射关系如表3-4所示。


 


3.精简核心寄存器组

默认配置下,r0~r31共32个核心寄存器可供编程和使用。为了更好地适用于低成本的应用,ARCv2 ISA支持对核心寄存器组进行精简配置,即只配置16个核心寄存器,以减少内核面积和降低系统成本。

在ARCv2的应用程序二进制接口(Application Binary Interface,ABI)中,最常用的核心寄存器是r0~r3(称为参数寄存器)、r12(称为临时寄存器)、r16~r25(称为备份寄存器)。表3-5给出了默认配置和精简配置下核心寄存器的映射关系以及各核心寄存器在ABI中的用途。


 

 4.多体寄存器

一组核心寄存器构成一个寄存器体(Register Bank),ARCv2 ISA支持配置多个寄存器体,实现不同粒度级的灵活配置,即:

1)配置寄存器体的个数,通过RGF_NUM_BANKS选项实现。

2)配置主寄存器体的核心寄存器个数(默认配置/精简配置),通过RGF_NUM_REGS选项实现。

3)如果寄存器体数大于1,允许配置备份寄存器体的寄存器个数,通过RGF_BANKED_REGS选项实现。

以1个和2个寄存器体配置为例,表3-6列出了不同配置下各个寄存器体所允许的核心寄存器映射关系。


 

 可以看出,当RGF NUM_BANKS>1时:

1)在RF32默认配置中,RGF_BANKED_REGS选项可以从集合{4,8,16,32}中选择。在RF16精简配置中,RGF_BANKED_REGS选项可以从集合{4,8,16}中选择。

2)当RGF_BANKED_REGS选项为4或者8时,核心寄存器的映射关系与精简配置时一致。

此外,需要指出的是,当处理器只配置为一个寄存器体(RGF NUM_BANKS=1)时,寄存器文件的硬件实现方式既可以选择用触发器实现,也可以选择用存储器RAM实现。当配置为多体寄存器(RGF NUM_BANKS>1)时,所有寄存器体只支持通过触发器逻辑实现。

(1)寄存器体的访问

当只有一个寄存器体(RGF NUM_BANKS=1)时,所有指令操作基于该寄存器体中的核心寄存器进行。

当有多个寄存器体时,为了对各寄存器体内部的寄存器进行访问和操作,用户需要首先选定寄存器体,步骤如下:

1)确保处理器工作在内核模式。

2)使用KFLAG指令对处理器的状态寄存器STATUS32中RB(Register Bank)域进行设置,选择一个寄存器体。

3)对步骤2中指定寄存器体下属的寄存器执行指令操作。

(2)对寄存器体的调试

在调试模式下,调试器(Debugger)也可以通过配置调试控制寄存器DEBUGI的RBE和RB域访问各寄存器体下的不同核心寄存器。

关于STATUS32和DEBUGI寄存器的具体域定义见附录A。

5.指针寄存器

在ARCv2 ABI中定义了3个指针寄存器:全局指针(GP)、帧指针(FP)和堆栈指针(SP),分别对应核心寄存器的r26、r27和r28。

全局指针(GP)被用于指向整个程序执行过程中共享数据。栈指针(SP)寄存器指向一个向下增长栈的最低地址(栈顶)。帧指针(FP)寄存器指向ABI中定义的当前堆栈帧的基址。

6.链接寄存器

链接寄存器(ILINKr29和BLINKr31)用于提供当发生中断、分支或跳转时返回的地址指针。

对于任何级别的中断,当发生中断和退出中断时,ILINK寄存器都可能被修改。因此,不能依靠ILINK保留其值,3种情况例外:处于优先级为0的中断处理程序、所有中断被禁用条件下的异常处理程序,以及所有中断被禁用。ILINK寄存器不能在用户模式下被访问。当处理器中用到多个寄存器体,并且这些寄存器体被配置成用来备份16~32个通用核心寄存器时, ILINK不复制保存这些附加寄存器的值。

r31是BLINK寄存器,通过使用Jcc[BLINK]指令返回BLcc或JLcc跳转到BLINK寄存器。

7.循环计数寄存器r60

循环计数寄存器(LP_COUNT)用在零延迟循环机制中,控制循环执行的次数。

需要注意的是,编程时不建议将r60当作通用寄存器使用,因为r60的值会在LP指令使用过程中被改变。同时,r60寄存器也不能作为多周期指令(包括多周期扩展指令)的目标操作数,多周期指令写LP_COUNT会产生非法指令异常。多周期指令具体包括:

Load操作

LR指令

乘法和除法指令

多周期无阻塞扩展指令

对LP_COUNT寄存器的赋值通常通过中间寄存器实现,如下所示:

LD r1,[r0] ; //从内存加载寄存器

MOV LP_COUNT, r1 ; //从寄存器加载LP_COUNT

当在一个零开销(zero-overhead)循环体里读寄存器LP_COUNT时,总会返回正确的值。

LP_COUNT可以在循环体的任意位置进行赋值,所有写LP_COUNT寄存器的操作都会在写指令一执行时就实时生效。如果写入LP_COUNT指令是在一个loop-end机制循环的最后一个位置,任何所需程序流(如跳转到 LP_START)的变化将在 LP_COUNT 寄存器更新之前完成。其结果是,循环中的最后一个指令写入 LP_COUNT 的赋值,会在下一个循环迭代时生效。除此以外,在其他任何位置,写操作LP_COUNT都会在当前的循环迭代中生效。

8.保留寄存器r61

寄存器r61 被处理器保留。凡涉及寄存器 r61的操作都会引发非法指令异常。

9.长立即数寄存器r62

寄存器r62被预留为指令编码中的32位立即数据,一般不作为通用寄存器使用。

10.字对齐程序计数器r63

寄存器r63为只读寄存器,用作支持PC相对寻址的所有指令中的源操作数。

读PCL寄存器值,返回当前指令开始的32位字的地址。而辅助寄存器组中的程序计数器PC(Program Counter)返回的是提交指令的实际地址。

两者的关系如下:

PCL = PC & 0xFFFF FFFC

11.非法的核心寄存器访问

以下情况视为对核心寄存器的非法访问操作,下述情形之一发生时,处理器会报告非法指令异常(Illegal Instruction exception):

1)访问不存在的核心寄存器。

2)对只读(read-only)寄存器执行写操作。

3)对只写(write-only)寄存器执行读操作。

您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:3.5 寄存器组
下一篇:3.5.2 辅助寄存器组
相关文章
图文推荐
排行
热门
最新书评
文章
下载
读书
特别推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 第一门户--致力于做实用的IT技术学习网站