英语原文共 5 页,剩余内容已隐藏,支付完成后下载完整资料
面向DSP虚拟机的全数字仿真与测试设计
摘要:为了解决这一问题和人保证嵌入式软件的质量,研究了如何建立一个基于纯软件的目标硬件运行环境来代替真正的硬件运行环境。核心SIMDSP55是一个解释和执行驱动的虚拟机。根据TI公司的TMS320C55xDSP的体系结构虚拟内存管理机制,对象文件加载、指令译码和中断处理描述了SIMDSP55。为了满足实际应用程序,添加了一些新的特性。
关键词:全数字仿真,DSP,虚拟机,测试
1.引言
传统嵌入式软件的测试过程通常在主机上建立交叉编译环境,用硬件供应商的开发工具或可选的程序辅助工具开发嵌入式软件,然后将编译后的目标文件直接下载到硬件(包括处理器和外设与处理器连接)在此期间运行时使用在线仿真进行软件测试。所有这些测试都基于硬件仿真的高速度,快速。但是缺点是需要硬件支持,所以没有硬件就不能工作。这将成为嵌入式软件测试的瓶颈,延缓嵌入式软件测试的进程,也最终影响嵌入式设备的稳定性。为了克服这些缺陷,对嵌入式软件的质量有很强的保证,工程师们需要在没有硬件支持的情况下进行嵌入式软件测试。为了实现这一目标,最有效的方法是对目标硬件进行软件仿真,即使用纯软件,建立虚拟目标硬件来代替真实目标硬件。这样可以大大提高嵌入式软件测试的效率,也可以充分分析嵌入式软件测试之前使用的目标硬件,可以较早地检测软件缺陷。
本文将重点研究TI公司的TMS320C55 DSP架构,详细分析SIMDSP55虚拟机上的内存管理、对象文件加载、指令解码、中断处理功能仿真。此外,结合测试应用,增加了许多新的特点,以测试。
2.TI TMS320C55X DSP系统体系结构
TI公司的TMS320C55X系列DSP是基于哈佛体系结构的,程序和数据具有独立的存储空间、独立的程序总线和数据总线。因此,它们可以同时处理程序和数据,极大地改善了DSP的数据处理。在图1中,我们可以看到它有四个处理单元(I,P,A,D单元)和12个内部总线(程序读地址总线和数据总线,数据读写地址总线和数据总线),它们可以同时读取和写入数据。
C55X DSP的结构复杂,使得仿真具有一定的难度,它属于指令长度不同的CISC处理器。与RISC处理器相比,一个指令可以完成多个任务。当运行处理器时,他们需要分割指令,因此在处理过程中,处理器会进行大量分割。
图1 TI TMS320C55X DSP架构
3. 内存管理单元
硬件内存管理单元通常需要在嵌入式处理器中实现两个主要的功能:
- 存储介质访问地址的划分,即内存地址映射
- 虚拟地址转换
针对虚拟机内存管理系统,具体设计如下:首先,定义了虚拟机内存模型,然后在模型特点的基础上设计了一种访问模型的方法。最后,虚拟机存储器可以使用这些方法访问虚拟存储器。
SimDSP55虚拟机采用分页机制进行管理,这种管理方法不仅可以忠实地模拟目标硬件内存管理机制,使虚拟内存管理方便,而且内存消耗低,因为在使用该方法时,它只维护页表数据结构,但是,只有在与页表相关联的程序使用时才发生内存空间的模拟。
本文定义了管理页表和内存模型的分页使用的下列数据结构:
struct mem_pte_t {
struct mem_pte_t *next; md_addr_t seg;
byte_t *page;
}; / *页表结构* / struct mem_t {
char *名称;
struct mem_pte_t *ptab[MEM_PTAB_SIZE]; counter_t page_count;
counter_t ptab_accesses;
}; / *虚拟内存结构* /
mem_pte_t代表页表,包含指向分配给指针的实际内存页的链接。内存模型mem_t使用由页表项ptab构成的页表数组,其大小为128.内存页表结构如图2所示
图2 simdsp55x内存页表结构
在初始化内存模型时,页表数组PTAB的每个页表项都是空的。页表在加载程序之前不会初始化。加载器从目标读取代码和数据,根据它们对应的虚拟地址将它们存储在内存模型中,这是主机内存堆页表指向的。堆内存需要分配,它必须在写入数据到内存模型之前检查,以查看虚拟机是否分配空间给存储单元。如果是这样,直接写入数据,否则,应用一个新的页大小堆内存,并分配给相应的页表条目,然后写入它们。在读取过程中,不需要新的应用程序的存储空间。因此,内存模型只用于维护程序内存空间,而不是所有的内存空间,这大大减少了对主机内存的需求。
为了加速内存访问速度,虚拟机使用宏定义来实现虚拟地址转换和内存访问操作。首先,查看虚拟机的虚拟地址转换过程,用下面三个宏定义来实现这个过程:
#define MEM_PTAB_SET(ADDR)
(((ADDR) gt;gt;
MD_LOG_PAGE_SIZE)&(MEM_PTAB_SIZE - 1))
#define MEM_OFFSET(ADDR) ((ADDR)&(MD_PAGE_SIZE - 1))
#define MEM_PAGE(MEM,ADDR)
((MEM) - gt; ptab [MEM_PTAB_SET(ADDR)]?
((MEM)gt; ptab_accesses ,(MEM)gt; ptab [MEM_PTAB_SET(ADDR)] - gt; page):NULL)
MEM_PTAB_SIZE是页表项的页码,在simdsp55x虚拟机中为128,对应于128页的C55x DSP数据空间。MD_LOG_PAGE_SIZE是地址页的位数,在simdsp55x虚拟机中为17。MD_PAGE_SIZE是页面大小,单位是bytes。C55xDSP页面大小是64k位,所以MD_PAGE_SIZE是64times;1024times;2。MEM_PTAB_SET用于从虚拟地址ADDR中提取页面地址ADDR.MEM_OFFSET计算页面在虚拟地址ADDR中的偏移量。MEM_PAGE的作用是在与页表项相对应的虚拟地址中查找堆内存的第一个地址。虚拟地址转换过程如图3所示。
图3. simdsp55x地址转换过程
4. 虚拟机状态定义
在运行目标硬件的过程中,需要在执行指令之前读取相关寄存器值,确定程序或地址等的过程。然后在指令执行后需要设置处理器寄存器值,最明显的是PC的程序计数器值,它随着每个指令的执行而改变。因此,处理器的值代表目标硬件的当前状态。当目标硬件在状态改变时运行模拟需要保存寄存器的状态,该寄存器是所有寄存器的值。因此,需要在虚拟机模型中定义寄存器模型来表示虚拟机的状态,并将寄存器装入目标硬件中。
C55X DSP具有大量的寄存器,参考TI的官方文档,一共有70种不同类型的寄存器。为了在C55X DSP中建立所有寄存器的模型,我们需要定义以下结构regs_t(这省略了寄存器的一些定义):
struct regs_t{
regs_ac_t ac40[4];
sword_t ac32[4];
shalf_t ar[8];
byte_t arh[8];
hellip;hellip;
half_t dbier[2];
half_t dp;
byte_t dph;
half_t ier[2];
half_t ifr[2];
half_t ivpd;
half_t ivph;
word_t pc;
half_t pdp;
word_t rea[2];
word_t reta;
half_t sp;
byte_t sph;
half_t ssp;
half_t st55[4];
};
对于C55X DSP中的那些不规则寄存器,如7位DPH和SPH、9位PDP和24位PC,分别使用8位、16位、32位或更多寄存器,当使用它们时屏蔽。
上面定义的结构,我们可以考虑如何访问这些寄存器。在本文中,我们使用宏定义从simdso55x虚拟机访问寄存器值,形式如下:
#define GET_REG_GPR(NAME,INDEX)
(regs.NAME[INDEX])
#define GET_REG(NAME) (regs.NAME)
#define SET_REG_GPR(NAME,INDEX,VALUE)
(regs.NAME[INDEX] = VALUE)
#define SET_REG(NAME,VALUE)
(regs.NAME=VALUE)
GET_REG_GPR和SET_REG_GPR用来访问寄存器阵列,但是GET_REG和SET_REG用来访问单个寄存器。regs是regs_t的全局变量名。
除了注册模型的建立,我们还必须注意MMR的概念。所谓MMR是内存映射寄存器,是指用存储器寻址的寄存器。这些寄存器不是物理内存的一部分,但它们属于逻辑上的内存。因此需要使用指令来访问这些寄存器。数据空间的第一个96位16位地址(0x000000-0x00005f)是为CMRx DSP中的MMR保留的,前面192字(0x000000 -0x0000bf)也保留给MMR,这在编程时不需要注意使用这些地址中存储的代码或数据。在这种情况下,当寄存器的值变化,并且该寄存器正好是MMR的成员时,不仅需要修改相应寄存器的值,而且还将内容映射修改为虚拟存储器的地址。
5. 加载对象文件
C55X的DSP的对象文件格式是COFF(通用对象文件格式),加载对象文件是对其进行分析,然后加载仿真代码、数据段、堆栈等,可以用于将虚拟机运行到虚拟内存中。事实上,有两件事:分析对象文件和提取对象文件的内容到虚拟机的数据结构。
图4 coff的目标文件加载过程
如图4所示,对象文件加载器将文件头的前22个字节读入内存,检查文档COFF的有效性和类型,在确定它是可执行对象文件之后继续解析,读取可选字节的28字节,获取通道数量和程序的入口地址。C,然后阅读所有段落,直到完成。每次读取48字节段落头后,检查段落的类型。如果是文本区段,这是代码的通常意义,则根据段落中的虚拟地址信息,依次将代码中的数据复制到虚拟存储器中。其他段落,如.DATA也与.Text一样处理。在读取头信息的所有段落之后,完成目标文件加载过程,虚拟机将进入取操作阶段。
6. 指令解码实现
A. SIMDSP55虚拟机的指令缓存结构
后退指令模块是最重要的虚拟机模块之一,它负责从虚拟存储器中删除二进制指令到解码器进行解码。通过解码指令,将相应的代码放入C语言实现所描述的适当指令中,最后,运行这些代码修改虚拟机状态,并在实际对象硬件上模拟DSP程序。该模块的质量将直接影响SIMDSP55虚拟机的效率。
通过对C55X DSP指令码表的分析,发现C55X DSP中的最大指令为6字节,因此指令高速缓存大小定义为6字节,用以保证高速缓存可以容纳1字节到6字节的任何一个完整的指令编码,也可以提供召集。解码过程。SIMDSP55 X虚拟MACE的指令缓存定义如下:
typedef struct{
byte_t buffer[6];
int tail;
int size;
md_addr_t cur_mem;
}inst_buffer_t;
缓冲阵列用于保存六字节的指令代码,并作为循环队列进行管理。在缓冲队列中,尾部用来指示指令代码的最后一个字节刚刚完成,大小存储指令缓存缓冲区大小,这里是6。因此,在下一个要执行的指令代码中,第一个字节位置正好是(尾部 1)mod大小,最后一个字段cur_mem指示当前代码的最后一个字节在虚拟内存地址中的地址,该地址已经在读取缓存中,与PC的当前代码地址相关联。
B. 代码树的引入
C55X DSP中的第一个指令字节不能识别指令,因此需要比较不在指令的第一个字节中的一些位,进行解码,直到两次或更多次地检查指令。因此,它需要建立一个代码树:具有不同第一字节的所有指令都处于第一级L1,具有相同第一字节的其他指令也处于L1,但它们被抽象为一个节点。在移出比较之后可以区分的指令位于第二级L2,其他指令不能区分也位于L2并且抽象为一个节点。指令可以在L3比较三次
剩余内容已隐藏,支付完成后下载完整资料
资料编号:[23898],资料为PDF文档或Word文档,PDF文档可免费转换为Word
课题毕业论文、外文翻译、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。