DSP扩展地址加载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于HPI的代码加载在扩展内存的实现
摘要:
一、扩展内存加载的概述
本例程主要针对5410A进行扩展地址加载的试验,即把DSP代码通过HPI方式加载到扩展页0x18000-0x1ffff内。
5410A的HPIC寄存器的位域描述如下表:
通过HPI口向DSP的扩展页读写数据时,首先要配置HPIA寄存器的值,当XHPIA=1时,向HPIA 写数据时配置的是高7位地址(即页),当XHPIA=0时,向HPIA寄存器写数据配置的是低16位地址。
主机端主程序加载代码的流程图如下图所示,假设DSP代码运行的起始地址为0x18080。
图1 主机的主程序流程图
在XHPIA=1时,向HPIA寄存器写入的高低字节的数据要相同。
并且主机通过HPI口加载代码的时候,XHPIA要为0,否则不能正确加载代码。
代码加载完后,要向DSP的7EH和7FH地址写入程序运行的起始地址。
在向0x007E和0x007F地址写入数据之前,要使HPIA高7位地址为0(即先后写HPIC=0x1111,HPIA=0x0000)。
DSP端要注意的设置有两点:
1、重新设置option---memory map中的程序映射范围。
2、设置project----build option-----compiler中的processor version为548,并选中User Far call(扩展
页加载)。
3、DSP编译链接时CMD文件中,程序的首地址要和通过HPI方式加载的代码的首地址一致。
4、DSP的代码加载到0x18000-0x1ffff地址内时,hex文件中的地址信息已经超过了64K的范围,
所以要选择合适的hex转bin工具,因为一般的转换工具转换的地址范围最大是64K。
可以使用hex2bin.exe文件,在dos下进入dsp.hex(假设hex文件的文件名是dsp)文件夹下,在命令行输入hex2bin.exe dsp.hex即可生成dsp.bin文件。
5、注意在扩展页寻址时的几个指令:FB、FBACC、FCALL、FCALA,FRET、FRETE以及WRITA
和READA。
6、要注意指令作用的数据位长。
如果一个标识符table在0x18000-0xffff地址中,使用ld #table,a
指令将把table所在地址的低16位送给a。
7、因为MP/MC=0的时候,片内的DARAM才定位到0x18000-0x1ffff程序空间,所以要注意MP/MC
的值。
extend_loader.BIN文件是烧写到单片机的二进制文件。
二、中断及其在扩展内存的加载
因为在5410A中,HPI加载的内存映射范围是0x80---0x7FFF、0x18000—0x1FFFF。
所以通过HPI 加载时,中断向量和代码只能写到该范围内。
在CMD文件中,当向量或者代码定位到x0080H—x7FFFH时,应将向量或者代码写到0080H—7FFFH对应的地址内,此时OVL Y=1。
在CMD文件中,当向量或者代码定位到18000H—1FFFFH 空间时,应将向量或者代码写到18000H—1FFFFH对应的地址内。
如果向量和代码连续存放,可以一次把数据写完,然后跳转到写入的起始地址开始执行代码;如果向量和运行代码放到不连续的地址内,应在对应的首地址分别写入,然后跳转到运行代码处执行。
并满足凡是有代码的页一定有一个中断向量表,因为在5410A中,当OVLY=1时,低32K RAM映射到所有页的低32K范围内,所以只需在0页加入中断向量表就可以映射到所有扩展页。
同时也要注意PMST中IPTR的配置,使其与VECTORS映射首地址的低16位一致。
FCALL,FB,FRETE,FRET四条指令说明:
FCALL指令执行时,把XPC和PC的值压入堆栈.
FRET 指令执行时将XPC和PC的值弹出堆栈。
FB指令只把转移地址的高7位和低16位放入XPC和PC,不会对XPC,PC进行保护。
FRETE指令把数据从堆栈弹出到XPC和PC,中断返回。
在中断服务程序中,PC会自动压入堆栈,而程序计数器扩展寄存器XPC不会自动压入堆栈。
如果中断向量表和ISR位于不同的页面,用户必须在分支转移到ISR之前压入XPC到堆栈中。
FRET指令从堆栈恢复XPC和PC的值,并从ISR返回。
在C语言中,FRETE中断返回指令是在far call的时候出现,RETE指令是在near call时出现。
注意使用far call(XPC入栈),near call(XPC不入栈)时,中断跳转之前XPC入栈与不入栈问题。
如:
Int0 :
Nop
Pshm xpc
B #_xxxxxx
此时编译连接时要使用far call,中断结束后FRETE指令正确恢复XPC的值
在0页加载代码时,C语言的运行支持库使用rts.lib,并使用near call。
在扩展页加载时,C语言的运行支持库使用rts_ext.lib,并使用far call。