This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

中断和主函数共用全局变量问题



工程师您好,

    我在进行C6678和FPGA之间的数据通信,有两个问题想请教:

1、DSP在接收FPGA发来的GPIO0中断和数据时,在DSP端中断响应函数中对SRIO连接情况进行判断(之前连接建立成功),代码如下:

//判断SRIO连接是否成功
 for(i=0; i<SRIO_MAX_PORT_NUM; i++)
 {
  if(srio_cfg.blockEn.bLogic_Port_EN[i])
  {
   //读SRIO中SPn_ERR_STAT寄存中的port_ok位
   if( ( gpSRIO_regs->RIO_SP[i].RIO_SP_ERR_STAT & CSL_SRIO_RIO_SP_ERR_STAT_PORT_OK_MASK ) == 0)
    printf("Error! port_ok = %d\n",gpSRIO_regs->RIO_SP[i].RIO_SP_ERR_STAT & CSL_SRIO_RIO_SP_ERR_STAT_PORT_OK_MASK);
  }
 }

在接收一些中断之后,会打印“Error! port_ok = 0”,表示SRIO连接断开,之后又会正常接收并打印中断。与此同时,FPGA端监测SRIO是没有断开连接的,我想请问,为什么DSP在接收FPGA端发来的GPIO0中断和数据时会产生SRIO断开的情况?

2、通过SRIO接口SWrite函数向FPGA写数据。在中断函数中调用没有问题;

可是现在改为:在中断到来时,在中断函数中置标志位SWrite_Flag为1,在main()中while(1){}中对标志位进行判断,满足条件时调用SWrite函数向FPGA写数据。单步调试时,图示实时监测标志位为1,满足if()中的条件,却没有进,而是进了else,这是为什么?是和嵌入式开发中硬件平台有关吗?有什么解决思路吗,请指教!(部分代码如下)

//Interrupt service routine for GPIO
void interrupt GPIO_ISR(void)
{……

 if( int_cnt % 32 == 0 )
 {
  SWrite_Flag = 1;
  //SRIO_Data_SWrite( 0x90000000, FPGA_SRIO_BASE_ADDR, 512 );
  printf("GPIO INTR %d\t%d\n",int_cnt,SWrite_Flag);
 }

……

}

main()

{

while(1)
 {
  if( SWrite_Flag == 1 )
  {
   printf("prepare Data_SWrite\n");
   SRIO_Data_SWrite( 0x90000000, FPGA_SRIO_BASE_ADDR, 512 );
   SWrite_Flag = 0;
  }
  else
  {
   //printf( "SWrite_Flag=%d\n",SWrite_Flag );
  }

 }

}

  • 1 查看一下SRIO其他状态寄存器是否存在错误记录,中断不会影响SRIO端口的状态;

    2 while循环一直判断一个全局变量时,可能会进行优化,优化之后只会从寄存器中读取值进行判断,而不再从实际的地址更新数据,所以即使更新了也读不到新的值,建议在全局变量定义前加上volatile,保证一直从实际地址更新数据。