当前位置: 技术问答>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;
}
}
我写了两个驱动一个通过读写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.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。