看板 ASM 關於我們 聯絡資訊
sorry~之前那篇問得有一點攏統,重寫一下問題... 程式如下. 程式正確時,test會因為0x0130, while跳開而完成case0. 我將 printf("\r\n%04X",test); 加在 while(test < x0130); 下面 程式不正確時,test會為0x0100,且while跳開,完成case0. 問題就在........為什麼 test有0x0100, while會跳開呢? 後來, 我又加了 while(test < x0130); 在 while(test < x0130); 後面, 此問題就不再發生了... 雖然這是一個解決方法,但是原因一直找不到.... 感覺好像是中斷在test=0x0100先跳回主程式,讓case0先完成, 資料又進來了,又跳到中斷將test計數完(資料會一直進來) test 我宣告全域變數耶? why? 理論上,中斷跳回,應該會卡在while等, 因為沒有大於0x0130.. 但printf test 卻顯示最後是0x0100..... 一直想不通!! 這現象是偶然發生,不是一直發生... ================================ 主程式 case '0' : test =0; while(test < x0130); break; 串列函式 static void Serial_Port_ISR (void) interrupt 4 { /* Received data interrupt. */ if (RI) { RI = 0; if (upload == 1) { XBYTE[test] = SBUF; test++; } } else { if (((r_in - r_out) & ~(RBUF_SIZE-1)) == 0) { rbuf [r_in & (RBUF_SIZE-1)] = SBUF; r_in++; } } } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.32.236.8 ※ 編輯: BlueFeel 來自: 114.32.236.8 (11/22 13:43)
Anal:一般來說盡量不要在ISR對全域變數作存取... 11/23 10:17
Anal:當ISR發生結果又改到原來的全域變數的值,這樣會發生大部分都 11/23 10:17
Anal:沒問題,但是不穩定的情形 11/23 10:18
ksmrt0123:isr不access global variable似乎不太容易, 畢竟isr通常 11/23 13:24
ksmrt0123:還是必需跟main thread溝通. 一般做法是儘量把global 11/23 13:25
ksmrt0123:variable的讀寫分開, 在isr寫入的變數就不在main thread 11/23 13:26
ksmrt0123:寫, 反之亦然. 這樣可減少很多可能犯錯的地方了 11/23 13:27
ksmrt0123:x0130是 0x0130的筆誤? 11/23 13:29
ksmrt0123:啊你TI沒清... 11/23 13:35
BlueFeel:筆誤 11/25 21:32
BlueFeel:為什麼您覺得是TI沒清呢?它是有時正常有時不正常 11/25 22:30
BlueFeel:如果沒清應該每次都不正常 11/25 22:30
BlueFeel:今天有CHECK一下,發現關鍵在為什麼 "偶而"會在0x0100跳開 11/25 22:33
BlueFeel:跳開, 回主程式 11/25 22:33
ksmrt0123:因為isr中 else{...} 只有 TI==1 才會執行到 11/25 22:56
ksmrt0123:假如 TI 沒清, isr 就會一直被執行 11/25 22:56
ksmrt0123:rbuf 跟 r_in 都可能爆掉 11/25 22:57