各位大牛你们好, 我已经实现dsp向FPGA写数据和读数据的功能。
写数据流程:DSP-NWRIRE包
读数据流程:DSP-READ包->FPGA->NWRIRE->Doorbell包 ,然后在收到doorbell后,置全局标志位。在main中的while检测标志位后取数 ,现在都实现了, 但是在调试发现, 从FPGA读时,先是dsp发NREAD包,FPGA收到后,迅速从单口ram中读数据,再给dsp发NWRIE包,发完后 再发doorbell,dsp收到doorbell,进入中断,但问题是从中断入口出来,到main中while检测标志事件大概400ms , 这个时间也太长了,根本不能作为DSP主动从FPGA读数据接口。 我想知道这个时间为啥这么长?
我做了如下尝试:
1.怀疑其他中断影响,在出中断后,又进入其他中断。但工程里再也没有他中断
2.用CCS的 clock功能,第1个断点在发送NREAD包函数处打断点,第2个断点在main中while检测置位后,再打断点,单步调试中,发现还是400ms。
但是第1个断点在中断打,发现单步执行,竟然10us;这2中操作差距怎么这么大?我也用TSCH,TSCL计数器测得结果一样,也是400ms
3.我猜测出中断,检测标志位费好长时间,我将标志位定义成 volatile变量,但是结果一样
我的问题如下:
1.我本想发送NREAD后,FPGA回NWIRE,doorbell;当收到doorbell后取数,立马用当次数,达到数据同步,是否这种方法不行? 论坛看了好多,
都是FPGA主动上传大批量数后,再发doorbell,没我这么用的。哪有什么更好方法从FPGA获取数据吗?
2.从收到doorbell,到main中while检测标志位,为啥这么长时间?
3.是否跟cmd文件有关,是否需要优化程序?
Shine:
请问中断里有没有用printf打印信息?
fendou yang:
回复 Shine:
没有啊! 只是读取中断标志位,和清标志位, 还有全局一个变量++ ;
如下:
interrupt void SRIO_Doorbell_ISR()
{Uint32 doorbell;doorbell= gpSRIO_regs->DOORBELL_ICSR_ICCR[0].RIO_DOORBELL_ICSR; //read doorbell. this test only use doorbell reg 0
if(1==doorbell){DoorbellFlg = 1;}gpSRIO_regs->DOORBELL_ICSR_ICCR[0].RIO_DOORBELL_ICCR= doorbell; //clear doorbell interrupt
Doorbell_ISRnum++;
}
fendou yang:
回复 fendou yang:
我有做了如下实验还是不行
1.DoorbellFlg前加 volatile 关键词, 结果还是一样
2.我将全局DoorbellFlg 定义 数据段 , 映射指定内存空间 ,但还是不行啊
#include "MemoryMapInit.h"
#include "Keystone_common.h"#pragma DATA_SECTION(DoorbellFlg,".Flag");
volatilefar Uint8 DoorbellFlg = 0;cmd文件如下:.Flag>SL2
fendou yang:
回复 fendou yang:
自己先顶一下