C51 玄學問題,magic

WindSpirit發表於2018-08-06

0x00 問題程式碼

void int0_isr(void) interrupt 0
{
    num++;
    if (num%2 == 1)
    {
        uint k;
        for(k=0;k<3;k++)
        {
            P1=0x0f;
            delay(500);
            P1=0xf0;
            delay(500);
        }
    }
    else if (num%2 == 0)
    {
        uint m;
        uint n;
        temp=0xfe;
        P1=temp;    //IO口無法直接參與運算,先賦值給字串再用cror進行二進位制移位運算
        for (n=0;n<2;n++)
        {
            for (m=0;m<7;m++)
            {
                delay(300);
                temp = _crol_(temp,1);
                P1=temp;
            }
            for (m=0;m<7;m++)
            {
                delay(300);
                temp = _cror_(temp,1);
                P1=temp;
            }
        }
    }
}

void int1_isr (void) interrupt 2
{
    P1=0xff;
    delay(3000);
}

0x01 問題剖析

手動分配using 0,using 1導致無法退出中斷
手動分配using 1,using 2正常退出並返回主函式
自動分配正常退出並返回主函式

以下純屬猜測,畢竟跟使用哪組暫存器沒啥關係
程式碼中使用電平中斷(可能也和使用全域性變數有關係?)
在沒有清中斷標誌位的情況下,開啟中斷後,會產生多箇中斷訊號
每個中斷程式都在把他們清零,相互影響,導致很難達到計數終點,程式難以終止

又發現一個問題:using 0,using 1是手動分配中斷使用哪組暫存器
但預設情況下系統自動分配暫存器也是using 0,using 1,正常退出中斷

using 0使用第0組暫存器(RS1=0,RS0=0),實際地址R0(00H) - R7(07H)
using 1使用第1組暫存器(RS1=0,RS0=1),實際地址R0(08H) - R7(0FH)

相關文章