当前位置:  技术问答>linux和unix

spurious 8259a interrupt: irq7

    来源: 互联网  发布时间:2016-01-19

    本文导语:  请问为什么偶尔产生此信息呢 我写了两个驱动一个通过读写ISA地址和DSP通讯, 一个接收DSP中断的中断服务程序IRQ11 现在在操作DSP时(通过写ISA向DSP发命令)有时会弹出信息 IRQ11中断大概1ms有5次 2.4.20 ///////////// ISR...

请问为什么偶尔产生此信息呢
我写了两个驱动一个通过读写ISA地址和DSP通讯,
一个接收DSP中断的中断服务程序IRQ11

现在在操作DSP时(通过写ISA向DSP发命令)有时会弹出信息
IRQ11中断大概1ms有5次

2.4.20

/////////////
ISR比较复杂,但必须如此,因为和DSP共用ISA总线,只有在ISR里(DSP空出ISA)我才可以读写ISA
static void ad_irq(int irq,void *dev_id,struct pt_regs *regs)
{
if ( data_buf_common[ADBUF_ENABLE] )//用户态程序允许中断,否则因为不发下降延,只会进一次中断了
{
unsigned long ulTemp;
int i; 
 
write_dsp_addr ( 0x3ff70 );
readdsp((char*)&ulTemp);
readdsp((char*)&ulTemp);

if ( (ulTemp&BIT31) == BIT31 )//dsp可以接收下一个命令了
{
data_buf_common[ADBUF_DSP_READY] = 1;
}
else if ( data_buf_common[ADBUF_READING_DSP_ON ]  && (ulTemp&BIT30)==BIT30 )//需要读入信息,而不是幅度
{

}
else
{
//if ( qam )
//{
//}
//else
{
if ( ( ulTemp & BIT29 ) == 0 )   
{
i = ulTemp >>16; 
//正常扫描或单次扫描下一场没结束
if( !data_buf_common[ADBUF_SINGLE_ON] || data_buf_common[ADBUF_SINGLE_ON] && !data_buf_common[ADBUF_SINGLE_FINISH] )
{
data_buf_ad[i] = ulTemp & 0xffff;  //低位存放数据
}
     if ( i == 500 )
     {
     data_buf_common[ADBUF_NEW_FIELD_ON] = 1; //新的一场数
     data_buf_common[ADBUF_AVG_NEW_ON] = 1;
     if ( data_buf_common[ADBUF_SINGLE_ON] ) 
     data_buf_common[ADBUF_SINGLE_FINISH] = 1; //单次扫描一场已结束
     }
}
//else //是跟踪源频响数据
}
}
 
write_dsp_con ( 0x50005 );//把中断的上升延后的高电平产生一个下降沿(bit 2) ,使dsp能继续产生中断
  }
}

/////////向DSP发中断,以让DSP接收指令
GenDspInter ( void )
{
if ( m_uCmdBit != 0 && !m_bPCON )
{
DisableAD();

int n = m_uAddr.size();

//将缓存的命令字送出
while ( n-- ) 
{
WriteDsp ( DSP_REG_ADDR, m_uAddr.back() );
WriteDsp ( DSP_REG_DATA, m_nData.back() );
m_uAddr.pop_back();
m_nData.pop_back();
}

//将缓存的命令位送出
WriteDsp ( DSP_REG_ADDR, DSP_ADDR_BIT );
WriteDsp ( DSP_REG_DATA, m_uCmdBit );

m_uCmdBit = 0;

SetDspReady ( false ); //置DSP准备好标志为 否
WriteDsp ( DSP_REG_CON, DSP_CW_INTER );  //让DSP产生一个中断
 
EnableAD();
usleep ( 20000 ); //20 ms
n = 0;
while ( IsDspReady() == false )
{
n++;
usleep ( 20000 ); //20 ms
if ( ( n + 1 ) % 5 == 0 ) //每隔100ms, 再送一遍参数
{
DisableAD();
WriteDsp ( DSP_REG_CON, DSP_CW_INTER );
EnableAD();
}
if ( n > 100 )   // > 2 Sec
break;
}
}


|
也碰见过,不过好像实际应用中没有影响

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3