通信握手信号有ACK和BCMP#信号。其中ACK信号用来通知接收准备好,在实时信
号处理中,一般不允许数据传输的等待,故将这个信号置为准备好。BCMP#信号
用于通知数据块传输的结束,当能确定DMA传输数据个数时,可以将此引脚悬空
。
L1_IRQ是FPGA发给DSP的外部中断,用来通知DSP收数据;L1_ACKI是DSP的
接收准备好信号;R_BUF_EN是读发送缓存使能信号 ;链路口时钟L1_CLKOUT是以
读缓存时钟R_CLK下降沿的二次分频,对应从缓存中读出的4bit链路口数据
L1_DA-To.注意这里读缓存及时钟分频时会有纳秒级的延迟。
3 DSP的相应设置
TS101和TS201的链路口都配置了控制寄存器(LCTLX)和状态奇存器
(LSTATx)两组寄存器。LCTLx用来控制链路口的传输,LSTATx用来通知链路口
的工作状态。TS101链路口时钟频率可以是核时钟的8、4、3 或2分频,通过设
置LCTLx中的SPD位米完成,本文设计将SPD位置000,即为核时钟8分频。由于
TS201的接收发送通道独立,所以其控制寄存器分为接收控制寄存器(LRCTLx)
和发送控制寄存器(LTCTLx)。 TS101链路口发送时钟频率可以与核时钟相同
或为其4、2、1.5分频,通过设置LTCTLx中SPD位来完成。本文设计将SPD位置
100,即为核时钟4分频,并将LRCTLx/LTCTLx中(接TDSIZE位置1,设置成4bit传
输 方式。如果BCMP#信号悬空,注意一定要将LRCTLx巾RBCMPE位置0.
有两种方法启动DSP的链路口DMA传输:利用链路中断和利用DSP的四个外部
中断(IRQ0~IRQ3)。两种中断方式都需要在中断服务程序中对DMA的TCB寄存器
进行配置来启动链路口的接收DMA通道。鉴于外部中断的优先级高于链路口中断
,可以避免数据丢失,本文设计的通信方式均以外部中断方式通知DSP接收数据
。在DMA的TCB寄存器配置过程中,为了保证程序不被其他中断打断,可以在中
断服务程序开始时就把所有其他中断屏蔽掉,存中断服务程序返回之前再把屏
蔽掉的中断位还原。
本文对TigerSHARC系列的两种典型DSP芯片的链路口进行了分析和比较,并
给出了FPGA与这两种DSP芯片进行链路口通倍的具体方法。在FPGA内部实现了
DSP链路口的设计,同时给出了DSP进行链路口通信的具体设置方法。
通信设计没有对所传输的数据进行校验。本文给出的基于FPGA路口设计具
有很强的通用性,可以应用于基于TS101/TS201的多种应用系统中,提高系统内
部的通信能力;也可用于板间DSP的数据传输,提高系统外部的通信能力。
2.3.2 数据存储
数据存储前先要找到优先级最高的空记录,其流程为先找到含空记录的页号,然后在该页中查找空记录号,最后根据页号和空记录号计算出当前可用于存储且优先级最高的存储空间的序号。详细程序如下:
High3=OSUnMapTbl[OSRdyPageGrp];//高3位
Low3=OSUnMapTbl[OSRdyPageTbl][High3]];//低3位
PrioPage=(High3《3)+Low3;//先找到含空记录的页号
High3=OSUnMapTbl[OSRdyGrp[PrioPage]];
Low3=OSUnMapTbl[OSRdyTbl[PrioPage][High3]];
prio=(High3《3)+Low3;//获得页中的空记录号
RecordNo=PrioPage*64+prio;//获得空记录在整个存储空间中的序号
根据以上程序得到序号后,就可以将数据存储到相应存储空间了,存储完成后需将该序号的存储空间设置为“满”状态,具体流程为:先将该页中的记录号置为“满”状态(即清零相应位),然后判断本页中是否所有记录均为“满”,若是则置该页的状态为“满”.详细程序如下:
PrioPage=RecordNo / 64;//页号
prio=RecordNo % 64;//记录号
if ((OSRdyTbl[PrioPage][prio》3] &=~OSMapTbl[prio & 0x07])==0)
OSRdyGrp[PrioPage] &=~OSMapTbl[prio》3]; //置页中的记录号为“满”状态
if(OSRdyGrp[PrioPage]==0){//若该页中的所有记录均为“满”则置该页为“满”状态
if ((OSRdyPageTbl[PrioPage》3] &=~OSMapTbl[PrioPage & 0x07])==0)
OSRdyPage &= ~OSMapTbl[PrioPage》3];
}
2.3.3 数据删除
数据删除即将存储序号RecordNo对应的页号和记录号的存储状态设置为“空”(则该记录可用于后续的存储),具体流程为:先设置页号为“空”(因为只要该页中任意一个记录为“空”,则页的状态即为“空”),然后设置记录号的状态为“空”,详细程序如下:
PrioPage=RecordNo / 64;//页号
prio=RecordNo % 64;//记录号
OSRdyPage |=OSMapTbl[PrioPage》3];
OSRdyPageTbl[PrioPage》3] |=OSMapTbl[PrioPage & 0x07];//设置该页的存储状态为“空”
OSRdyGrp[PrioPage] |=OSMapTbl[prio》3];
OSRdyTbl[PrioPage][prio》3] |=OSMapTbl[prio & 0x07];)//设置页中的记录为“空”状态
按以上方法将相应序号的存储空间设置为空状态,则在后续操作中该存储空间可用于存储。
结语
本文利用μC/OS嵌入式操作系统的任务调度算法并加以改进,巧妙地实现了简易的嵌入式数据管理,与传统方法比较,该方法具备不出现存储空间碎片、数据管理操作效率高等优点,可广泛应用于低端嵌入式应用中的数据管理。该方法已在笔者所开发的SF6电气设备分解产物检测仪及智能抄表终端中应用,运行稳定可靠。