作者BlueFeel (藍色感覺)
看板ASM
標題[問題] 變數問題
時間Sun Nov 22 13:04:48 2009
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)
1F:推 Anal:一般來說盡量不要在ISR對全域變數作存取... 11/23 10:17
2F:→ Anal:當ISR發生結果又改到原來的全域變數的值,這樣會發生大部分都 11/23 10:17
3F:→ Anal:沒問題,但是不穩定的情形 11/23 10:18
4F:→ ksmrt0123:isr不access global variable似乎不太容易, 畢竟isr通常 11/23 13:24
5F:→ ksmrt0123:還是必需跟main thread溝通. 一般做法是儘量把global 11/23 13:25
6F:→ ksmrt0123:variable的讀寫分開, 在isr寫入的變數就不在main thread 11/23 13:26
7F:→ ksmrt0123:寫, 反之亦然. 這樣可減少很多可能犯錯的地方了 11/23 13:27
8F:→ ksmrt0123:x0130是 0x0130的筆誤? 11/23 13:29
9F:→ ksmrt0123:啊你TI沒清... 11/23 13:35
10F:→ BlueFeel:筆誤 11/25 21:32
11F:→ BlueFeel:為什麼您覺得是TI沒清呢?它是有時正常有時不正常 11/25 22:30
12F:→ BlueFeel:如果沒清應該每次都不正常 11/25 22:30
13F:→ BlueFeel:今天有CHECK一下,發現關鍵在為什麼 "偶而"會在0x0100跳開 11/25 22:33
14F:→ BlueFeel:跳開, 回主程式 11/25 22:33
15F:→ ksmrt0123:因為isr中 else{...} 只有 TI==1 才會執行到 11/25 22:56
16F:→ ksmrt0123:假如 TI 沒清, isr 就會一直被執行 11/25 22:56
17F:→ ksmrt0123:rbuf 跟 r_in 都可能爆掉 11/25 22:57