本帖最后由 qwe890asd 于 2019-6-2 16:41 编辑
TMS320VC5410 DSP的DSP/BIOS扩展寻址的实现
摘要: TMS320VC5410的程序空间通常被限制在64K地址空间内, 当应用程序超出64K时, 则需增加目标系统存储区和附加逻辑, 实现对系统的扩展。介绍了如何配置及使用DSP/BIOS接口来实现扩展寻址功能, 分析了API函数调用和中断触发过程, 并以DSP并行自举引导方式实现程序的脱离仿真运行。
关键词: DSP/BIOS 扩展寻址 API 并行自举引导
1 DSP/BIOS 接口
DSP/BIOS 接口提供了基本的运行服务,如应用程序实时分析功能、时钟周期函数、I/O模块、优先级的任务调度等。 DSP/BIOS 接口提供支持汇编语言和C语言的API 接口函数,这些API 函数绝大部分都是用汇编语言实现的,因此汇编语言可以直接调用API,而C语言调用API 则要通过DSP/BIOS 的C封装器。应用程序通过调用API 函数来使用DSP/BIOS 接口,如软件中断、背景线程和中断服务程序等都可以调用DSP/BIOS 的函数。当DSP/BIOS 要调用用户的C语言函数时,则要通过函数链接器,如图1所示。
2 扩展程序空间 TMS320VC5410 的16位地址空间被划分为两块,低地址块定义为公共区(或未映射区),高地址块定义为映射区(或扩展区)。这两块的地址由目标系统的外部寄存器和存储区决定。值得注意的是,TMS320VC5410 的数据区没有扩展存储区。
用户可以在映射区上定义多个物理存储区,它们覆盖整个映射区,但彼此间不重叠。当使用存储区的扩展页时,内部16 位地址空间被扩展为32 位的地址进行寻址,高16 位代表扩展页的数目,低16 位代表局部的16 位地址。如使用扩展程序映射存储器(XPC)存放扩展页码,则XPC 存放在数据空间地址为0x1E 的位置,它的值要与.CMD链接文件中定义的扩展页码保持一致。图2 所示的是一个扩展3 页的程序区结构图。公共区的范围是0x0000-0x7FFF;映射区的范围是0x8000-0xFFFF;映射区为第一页,XPC 要为0才能访问该区;映射地址空间存放两个扩展页,扩展程序映射寄存器限定了映射地址,使得每个扩展页的每个单元具有唯一的地址。当访问扩展页时,映射区将被覆盖。
TMS320VC5410 的DSP/BIOS 不仅支持64K 程序页内的“近”访问模式,而且支持扩展程序的“远”访问模式,只需设置DSP/BIOS 的属性即可实现扩展程序的“远”访问。要注意的是,汇编语言写的API 只能在PAGE0 页调用,而C语言写的API 可以在任何页面调用。
3 中断 当中断产生时,DSP 的内部结构机制只能保存低16位页内的局部地址,而扩展寻址时程序地址需要23 位,这就意味着调用和返回时将超出64K(16位地址)的范围,因此必须考虑怎样保存和恢复扩展地址。解决的方法是用中断服务程序(ISR)保存XPC的值,确保能正确计算中断向量,为此中断向量表必须放在公共区或映射区的64K 程序页面上。当DSP/BIOS 在公共区上时,ISR 可以放在任何位置;如果不在公共区上,则ISR 必须放在PAGE0上。 当OVLY=0 时,为了能保证中断正确执行,必须在每一个页面上都要有中断向量表的拷贝。当OVLY=1 时,只需在公共页面上(如0x7F80)作一份中断向量表的拷贝就可以了。
4 程序实例 下面通过一个简单的例子介绍DSP/BIOS 如何实现程
序地址的扩展。本例中有三个软中断:时钟中断PRD_POST_SWI, 每100ms 触发SWI_PAGE1(或SWI_PAGE2)一次;SWI_PAGE1 完成置XF 高;SWI_PAGE2完成置XF 低。三个软中断执行的函数分别放在程序空间的不同页面上,即PRD_POST_SWI 放在公共页面上(XPC=0), Page1Func 和Page2Func 分别放在扩展程序页面1和2 上(XPC为1和2)。
|