TMS320VC5410 DSP的DSP/BIOS扩展寻址的实现
接上文
5 DSP/BIOS 的配置
如要把DSP/BIOS 的程序映射到扩展程序空间,需要对其进行配置,步骤如下:
(1) 建立一个新配置文件。启动仿真软件(Code Composer Studio), 建立testfar.pjt 工程,通过File 中的New--DSP/BIOS Config 创建配置文件, 选用sd54.cdb (54X EVM)配置。 (2) 添加软件中断。右键打开软件中断管理器(Software Interrupt Manager), 选择Insert SWI, 创建SWI_PAGE1, 属性配置为:function:_Page1Func;priority2。用同样的方法 创建function为_Page2Func的SWI_PAGE2。右键打开定 时器功能管理器(Periodic Function Manage), 选择Insert PRD, 创建PRD_POST_SWI, 属性配置为:period(ticks):50, function:_PRD_Post_SWI, mode:continuous。 (3) 设置OVLY 位为1。打开System中的Global Settings 的属性页, 在PMST(6-0) 项中填入使第5位为1的值, 如MP=1, 填入0x60。 (4) 指定“远”调用模式。在Global Settings 属性页面的Function Call Model 选项中选择far, 使全局变量Callmodel 设置为far。 (5) 在公共区中重新分配中断向量表。双击System中的MEM, 右键打开VECT 的属性页, 在base 项中填入新的基地址, 如0x7F80。 (6) 配置扩展程序地址段。对于54X EVM 评估板, 已经有了两个扩展程序段EPROG0和EPROG1(如果没有的话, 则需添加这两个段, 选择Insert MEM, 添加两个扩展程序段, 重命名为EPROG0和EPROG1)。EPROG0属性为base:0x8000, len:0x4000, 勾去create a heap in this memory 选项, space:code;EPROG0与EPROG1的属性不同之处为base:0x18000。加入一个新的扩展程序段EPROG2,属性为base:0x28000, len:0x4000, space:code。 (7) 将目标代码链接到扩展程序段。 pragma 伪指令告诉编译器的预处理器如何处理函数,语法为#pragma CODE_SECTION(Page1Func,“.FarPage1”), 在名为“.FarPage1”的段中分配Page1Func的程序空间。这样,目标代码Page1Func 就被链接到.FarPage1 段的区域。 (8) 创建一个新的链接命令文件(testfar.cmd)。其主要功能是把testfarcfg.cmd 链接进去,并且告诉链接器把不同目标函数放在不同的扩展页面上。如:
(9) 保存配置文件为testfar.cdb, 然后将testfar.cdb、testfar.cmd、testfar.c 文件加入工程中。 (10) 配置编译器和汇编器支持远模式代码。打开菜单Project 中的Build Options 窗体, 选择Compiler 属性页, 点击Category 中的Advanced 选项, 勾选Use Far Calls(-mf)(C548 and higher)。此选项指定产生远调用代码模式。 (11) 在调试器内描述并激活扩展寻址功能。仿真器的调试软件需要激活扩展寻址功能才能支持长指令的执行和扩展存储区的读/ 写,方便地对使用扩展寻址的程序进行调试。所以使用通用扩展函数GEL_XMDef() 来定义映射寄存器(如XPC)和映射扩展空间的首地址。如当OVLY=1时, 扩展程序区从0x8000开始, 7 位XPC 放置在数据空间的0x1E 单元中, 并把下面两条语句加入到C5410.gel 文件的C5410_Init() 函数中。 GEL_XMDef(0,0x1e,1,0x8000,0x7f); //0:映射程序空间;0x1e:XPC 的地址;XPC 在数据空间中; //0x8000:映射首地址;0x7f:XPC 的大小,128页; GEL_XMOn();// 使能扩展地址映射
6 DSP/BIOS 函数调用和中断触发过程
6.1 DSP/BIOS 函数调用过程
DSP/BIOS API 调用过程如图3 中的实线所示。具体过程如下: (1) 产生PRD_F_swi, 短调用C 语言封装器的PRD_F_swi(), XPC=0。 (2)C 语言封装器触发PRD_POST_SWI 时钟软中断, 然后检测SWI_PAGE1, 产生执行DSP/BIOS调度表的分支。 (3)DSP/BIOS 调度表保存当前PRD_POST_SWI上下文信息,调用函数链接器以触发SWI_PAGE1。 (4)函数链接器远调用SWI_PAGE1,执行相应的函数(Page1Func),XPC=1。 (5)SWI_PAGE1 执行结束,远返回函数链接器。 (6)函数链接器又返回到DSP/BIOS 调度表。 (7)DSP/BIOS 调度表恢复PRD_POST_SWI 信息,返回到C 语言封装器。 (8)执行上述(1)和(2),第(3)步触发SWI_PAGE2,函数链接器远调用SWI_PAGE2,执行函数(Page2Func),XPC=2。 (9)SWI_PAGE2 执行结束,远返回函数链接器,然后顺序执行上述的第(6)和(7)。
6.2 中断触发过程
中断触发过程如图3中的虚线所示。 (1)PRD_F_swi 发生,CPU 把当前的16位PC 指针压入堆栈,在中断向量表中取指令。 (2)中断向量程序把当前的XPC 压入堆栈,产生一个配置中断服务程序的分支指令,执行中断服务程序,XPC=0。 (3)中断服务程序调用HWI_enter, 触发PRD_POST_SWI 软中断,接着调用HWI_exit 检测到SWI_PAGE1准备好, 开始调用DSP/BIOS 调度表。 (4)DSP/BIOS 调度表保存当前的上下文信息,调用函数链接器以触发SWI_PAGE1。 (5)函数链接器远调用SWI_PAGE1,执行相应的函数,此时XPC=1。SWI_PAGE1 执行完,远返回调用函数链接器,再到DSP/BIOS调度表,调度表恢复上下文信息,把程序指针交给PRD_POST_SWI 软中断。PRD_POST_SWI 结束。 (6)执行上述(1)、(2)步后,第(3)步检测到SWI_PAGE2 准备好,第(4)步触发SWI_PAGE2,第(5)步函数链接器远调用SWI_PAGE2,XPC=2,顺序执行下去,直到PRD_POST_SWI 结束。
|