|
本帖最后由 psuxaog 于 2018-10-21 11:42 編輯
如果你用定時(shí)中斷置標(biāo)志位,主程序查詢標(biāo)志位的情況,如果中斷中有延時(shí),且大于定時(shí)時(shí)間,此時(shí)會出現(xiàn)主程序無法執(zhí)行的情況,如果有用到看門狗,單片機(jī)會重復(fù)復(fù)位,即使沒有看門狗,主程序中的程序不運(yùn)行也是要命的。
中斷中用的變量也是有講究的,比如以下情況:
下面的代碼中g(shù)ValTmp是16位變量,TMP_Process是主循環(huán)中的程序,51單片機(jī)是8位機(jī),給gValTmp賦值的時(shí)候是一個(gè)字節(jié)是個(gè)字節(jié)處理的,16位是兩個(gè)字節(jié),如果已經(jīng)處理了第一個(gè)字節(jié)的時(shí)候發(fā)生了中斷,那中斷中的gValTmp的值就不是正常的值(另一個(gè)字節(jié)沒有刷新呀),會導(dǎo)致數(shù)據(jù)錯(cuò)亂。
- u16 gValTmp = 0;
- void TIM0_IRQ interrupt IRQ_T0
- {
- TL0 = XXX;
- TH0 = XXX;
- TMP_SendData(gValTmp);
- }
- void TMP_Process(void)
- {
- gValTmp = TMP_GetValue();
- }
復(fù)制代碼 將以上代碼稍作修改,這個(gè)問題就可以解決了:
- u16 gValTmp = 0;
- bit gFlagUpdated = 0;
- void TIM0_IRQ interrupt IRQ_T0
- {
- TL0 = XXX;
- TH0 = XXX;
- if(gFlagUpdated)
- {
- gFlagUpdated = 0;
- TMP_SendData(gValTmp1);
- }
- }
- void TMP_Process(void)
- {
- gValTmp = TMP_GetValue();
- gFlagUpdated = 1;
- }
復(fù)制代碼 除了以上兩種方式,也可以在賦值前關(guān)中斷,賦值后開中斷的方式,不會不推薦這樣方式,容易導(dǎo)致時(shí)基不準(zhǔn)。
|
|