首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

2410中断寄存器INTPND中有多个置位,太诡谲

2013-02-06 
2410中断寄存器INTPND中有多个置位,太诡异!近来开发过程中遇到一个死机问题,表现出来的现象十分奇怪。CPU是

2410中断寄存器INTPND中有多个置位,太诡异!
近来开发过程中遇到一个死机问题,表现出来的现象十分奇怪。

  CPU是三星的s3c2410, 测试场景包含两种不同类型的外设中断反复调用,这个问题在压力测试大概3,4天才复现一次,出现后CPU的INTPND寄存器有3个位被置位,查看中断OFFSET寄存器,值为0x0f,对应INT_UART2。但INTPND中与UART2中断对应的位并没有置位。在整个调用过程中,没有调用过和UART2有关的任何操作。

  也就是说CPU彻底乱了,检查了所有的中断操作过程,除了一个地方使用INTPND = (uint)1 << 3方式清中断外,其他都是手册推荐的INTPND = INTPND方式清中断。也没有重复清INTPND的代码。

  这个问题把大家都难住了,跟了很长时间,盼高手赐教。
[解决办法]
会不会是“虚假中断”引起?
[解决办法]
串口的输入线要是不用的要下拉(所有输入线不用都要下拉)
[解决办法]
rINTPND = rINTPND;
rSRCPND = rSRCPND;
一直用这两条语句清中断,好像没有发现问题啊。

[解决办法]
注意数据手册的INTPND部分表的最后的注意点.
如果向INTPND中有'1'的位写'0',可能导致INTOFFSET和INTPND出现不可预期的值.
你可以试试下面的代码:
void main()
{
    timer1_30us();/* 开一个30us的定时器自动重载中断 */
    timer2_20us();/* 开一个20us的定时器自动重载中断 */
    while(1)
    {
        rINTPND = rINTPND;
    }
    
    return;
}
你运行上述代码就可以看到效果!
这应该是CPU硬件设计时的BUG,其实硬件设计很容避免的,说明设计水平差,限制了程序员对寄存器的使用场景.
三星的CPU上的很多寄存器都是共用,比如定时器的控制,中断屏蔽寄存器等,软件设置必须通过与或操作,可是这会带来问题.考虑下面的情况:
main_loop()
{
    rINTMSK 
[解决办法]
= ( 1 << 0 );
    .
    .
    .
    rINTMSK &= ~( 1 << 0 );
}

interruption()
{
    rINTMSK &= ~( 12 << 0 );
    ....
}
如果在主循环中设置时在回写之前中断产生了会发生什么?
其它很多厂商在这种问题上均有很好的设计,比如ATMEL的使用专门的设置/清除寄存器,写0时无效就可以了.
就这么多了,用三星的cpu真得很注意些问题.

热点排行