自己做的板子,在调试程序的时候,发现一个问题,想不太明白是为什么,求专家给指导一下
程序分为核0上跑的程序和核1~4上跑的程序,核0通过上位机接收下发的命令字,等待FPGA数据缓存区里的buffer满,满了之后通过emif读空其中的数据,然后发消息给核1,消息传递通过查询共享内存里的标志位实现。
typedef struct
{
int frame_front;//帧头
int frame_cnt;//帧计数
int frame_lenth;//帧长
int Ord;//命令类型 10-设置参数,20-控制命令
int WorkMode;//工作模式10测量20标校
int CarryFre;//载频/10 10.5G/10
int MeasureState;//开始/结束测量 命令类型为控制命令时有效 10-开始,20-结束
int RotateSpeed;//转速 周/min
int FFTNum;//FFT点数
int RutterMaxNum;//目标最大航迹数
int VMin;//目标速度下限
int VMax;//目标速度上限
int RMin;//目标距离下限
int RMax;//目标距离上限
int SNRRCatch;//距离捕获门限
int SNRRLock;//距离跟踪门限
int LfmBandWidth;//扫频带宽
int LfmScanCycle;//扫频周期
unsigned int absolute_time;
float azimuth;
int frame_end;//帧尾
//int reserve[11];
}Control_word,*PControl_word;
trigger大小为84个字节
核 0 的主程序如下:
volatile int cnt0 =0,cycle_cnt = 0;
//通过网络下发的雷达控制字,存放在共享内存区
Control_word trigger;
PControl_word Ptrigger;
#pragma DATA_SECTION (trigger,"control_data");
#pragma DATA_ALIGN(trigger, 16);
//核间消息传递标志,L1cache为64BYTE一个line,对齐在line上
volatile int coretocore_flag[8][16];
#pragma DATA_SECTION (coretocore_flag,"control_data");
#pragma DATA_ALIGN(coretocore_flag,64);
main()
{
while(cnt0<=(TEST_NUM/2))
{
cnt0++;
if(cnt0%(TEST_NUM/2)==0)
printf("cnt0 is %d\n", cnt0);
//判断第一对buffer是否已满标志0101
flag = *(unsigned short*)(0x78000000 + INT_STATUS*4);
while ((flag & 0x05) != 0x05)
{
flag = *(unsigned short*)(0x78000000 + INT_STATUS*4);
}
if ((flag & 0x05) == 0x05)
{
for (i = 0; i < 4000; i++)
{
dataA1[i] = (*(unsigned short*)(0x78000000 + A1_READ_DATA*4));
dataB1[i] = (*(unsigned short*)(0x78000000 + B1_READ_DATA*4));
*(dataIA1+i) = dataA1[i];
*(dataQB1+i) = dataB1[i];
}
*(unsigned short*)(0x78000000 + INT_CLEAR*4) = 0x05;//清中断
coretocore_flag[0][0] = 10;
CACHE_wbInvL1d((void *)(&coretocore_flag[0][0]),4,CACHE_WAIT);
//判断第二队buffer是否已满标志1010
flag = *(unsigned short*)(0x78000000 + INT_STATUS*4);
while ((flag & 0x0A) != 0x0A)
{
flag = *(unsigned short*)(0x78000000 + INT_STATUS*4);
}
if ((flag & 0x0A) == 0x0A)
{
for (i = 0; i < 4000; i++)
{
dataA2[i] = (*(unsigned short*)(0x78000000 + A2_READ_DATA*4));
dataB2[i] = (*(unsigned short*)(0x78000000 + B2_READ_DATA*4));
*(dataIA2+i) = dataA2[i];
*(dataQB2+i) = dataB2[i];
}
*(unsigned short*)(0x78000000 + INT_CLEAR*4) = 0x0A;//清中断 coretocore_flag[0][0] = 10;
CACHE_wbInvL1d((void *)(&coretocore_flag[0][0]),4,CACHE_WAIT);
}
}
}
核1~4的主程序
//通过网络下发的雷达控制字,存放在共享内存区
Control_word trigger;
PControl_word Ptrigger;
#pragma DATA_SECTION (trigger, "control_data");
#pragma DATA_ALIGN(trigger, 16);
//核间消息传递标志,L1cache为64BYTE一个line
volatile int coretocore_flag[8][16];
#pragma DATA_SECTION (coretocore_flag,"control_data");
#pragma DATA_ALIGN(coretocore_flag, 64);
void main()
{
int i;
volatile int coreID = CSL_chipReadReg(CSL_CHIP_DNUM);//读取当前核的编号
int rad;
int j = 0;
int a,b,time_cycle;
int flag;
volatile int cnt1=0,cnt2=0,cnt3=0,cnt4=0;
if(coreID==1)
{
while(1)
{
CACHE_invL1d((void *)(&coretocore_flag[0][0]),4,CACHE_WAIT);
if(coretocore_flag[0][0]==10 )
{
cnt1++;
if(cnt1%(TEST_NUM)==0)
{
printf("cnt1 is %d\n", cnt1);
}
coretocore_flag[0][0]=0;
CACHE_wbInvL1d((void *)(&coretocore_flag[0][0]),4,CACHE_WAIT);
}
核1开三级优化时trigger收到的内容跟不开优化时不一样?加了volatile还是结果不一样?请问开了三级优化会影响cache吗??
CACHE_disableCaching(12);函数可不可以使共享memory为noncache
Allen35065:
不会影响cache,但会影响指令执行的时序,你需要确保数据已经写入到地址里了