[問題] 變數問題

看板ASM (組合語言)作者 (藍色感覺)時間15年前 (2009/11/22 13:04), 編輯推噓1(1016)
留言17則, 3人參與, 最新討論串1/3 (看更多)
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)

11/23 10:17, , 1F
一般來說盡量不要在ISR對全域變數作存取...
11/23 10:17, 1F

11/23 10:17, , 2F
當ISR發生結果又改到原來的全域變數的值,這樣會發生大部分都
11/23 10:17, 2F

11/23 10:18, , 3F
沒問題,但是不穩定的情形
11/23 10:18, 3F

11/23 13:24, , 4F
isr不access global variable似乎不太容易, 畢竟isr通常
11/23 13:24, 4F

11/23 13:25, , 5F
還是必需跟main thread溝通. 一般做法是儘量把global
11/23 13:25, 5F

11/23 13:26, , 6F
variable的讀寫分開, 在isr寫入的變數就不在main thread
11/23 13:26, 6F

11/23 13:27, , 7F
寫, 反之亦然. 這樣可減少很多可能犯錯的地方了
11/23 13:27, 7F

11/23 13:29, , 8F
x0130是 0x0130的筆誤?
11/23 13:29, 8F

11/23 13:35, , 9F
啊你TI沒清...
11/23 13:35, 9F

11/25 21:32, , 10F
筆誤
11/25 21:32, 10F

11/25 22:30, , 11F
為什麼您覺得是TI沒清呢?它是有時正常有時不正常
11/25 22:30, 11F

11/25 22:30, , 12F
如果沒清應該每次都不正常
11/25 22:30, 12F

11/25 22:33, , 13F
今天有CHECK一下,發現關鍵在為什麼 "偶而"會在0x0100跳開
11/25 22:33, 13F

11/25 22:33, , 14F
跳開, 回主程式
11/25 22:33, 14F

11/25 22:56, , 15F
因為isr中 else{...} 只有 TI==1 才會執行到
11/25 22:56, 15F

11/25 22:56, , 16F
假如 TI 沒清, isr 就會一直被執行
11/25 22:56, 16F

11/25 22:57, , 17F
rbuf 跟 r_in 都可能爆掉
11/25 22:57, 17F
文章代碼(AID): #1B2CPoit (ASM)
討論串 (同標題文章)
以下文章回應了本文
完整討論串 (本文為第 1 之 3 篇):
1
17
文章代碼(AID): #1B2CPoit (ASM)