主題:請教:打開TMR1的ISR,串口接收數據會丟失。! 共有35839人關注過本帖 |
---|
quartzcq |
1樓 |
請教:打開TMR1的ISR,串口接收數據會丟失!! Post By:2007-7-26 17:27:00 [只看該作者]
一個棘手問題,請教。!
我是用的ETR186。當TMR1 ISR執行代碼時候(TMR1 設置20毫秒一次,內容是我們自己的簡易鍵盤的驅動,主要是一些GPIO操作),同時串口也發生中斷(串口每1秒鐘會接收到10BYTE左右的一個數據包,串口在接收到這個數據包的同時,取當前RTC時間,然后存入串口的BUFFER供上層調用),現在在測試過程中發現串口數據會丟失。。!如果關閉TMR1 ISR的鍵盤檢測代碼,就一切正常。 請問,有可能是什么問題???謝謝。 |
|
單帖管理 | 引用 | 回復 |
x10 |
2樓 |
Post By:2007-7-26 17:47:00 [只看該作者]
TMR1 ISR中斷級別高于串口中斷級別,可能導致串口數據丟失。建議TMR1 ISR只設置鍵盤掃描標志,由主循環根據標志進行掃描鍵盤。
|
|
單帖管理 | 引用 | 回復 |
quartzcq |
3樓 |
Post By:2007-7-27 8:35:00 [只看該作者]
1、“建議TMR1 ISR只設置鍵盤掃描標志,由主循環根據標志進行掃描鍵盤。”
您的意思是否是,TMR1 ISR只偵測是否有KEY按下,至于是哪個KEY,留到上層應用程序主循環時候判斷? 2、另外,請問下PC TIMER內部計時器(VECTOR 0X1C)的優先級是否低于ETR186的所有串口?如果是優先級高低引起的,我也可以移到0X1C里面做。 |
|
單帖管理 | 引用 | 回復 |
x10 |
4樓 |
Post By:2007-7-27 9:27:00 [只看該作者]
1.我的意思是定時中斷只是設置一個鍵掃描標志KeyScanFlag=1;主循環檢查該標志,若設置則掃描鍵盤并清標志。
2.INT 0x1C具有最高優先級別。 |
|
單帖管理 | 引用 | 回復 |
quartzcq |
5樓 |
Post By:2007-7-27 10:19:00 [只看該作者]
我還是覺得很奇怪,因為串口有硬件FIFO,數據首先是放到FIFO中,然后每放一個BYTE產生一次中斷,中斷會保存到操作系統的中斷STACK里面,然后應用程序調用STACK里面的中斷請求來相應對映的服務。即使此時TMR1正在執行,恰好串口產生了一個中斷,但這個中斷也是保存到操作系統的中斷STACK里面,只要中斷STACK的出棧速率大于進棧的速率,就不應該會丟失呀。。〔恢牢业睦斫馐欠裾_。
|
|
單帖管理 | 引用 | 回復 |
x10 |
6樓 |
Post By:2007-7-27 12:13:00 [只看該作者]
有可能在高級別ISR太長,導致系統的中斷控制器丟失低級別的中斷請求?梢栽谶M入TMR1 ISR就enable()同時發EOI來測試一下。
|
|
單帖管理 | 引用 | 回復 |
quartzcq |
7樓 |
Post By:2007-7-27 12:36:00 [只看該作者]
我測試過,如果只是打開TMR1,里面不做任何其他動作(或者做幾行簡單的加減乘除等代碼),長時間測試后,串口數據也不會丟失。而一旦加上這個3*2的鍵盤驅動,就會丟失。
另外,系統一般都能夠提供關閉中斷和打開中斷的功能,TURBOC里面是ENABLE和DISABLE這兩個函數。我認為,按照原理來講,如果在串口中斷時候,加入DISABLE,然后結束時候ENABLE,這樣就不會在串口中斷執行時候被TMR1或者其他高優先級ISR搶占造成丟失。但我這樣測試了一下,也沒用。 不知道ETR186的開關中斷是不是由這2個函數完成???或者,TMR1是個例外,即使DISABLE了,TMR1也可以響應(PC機應該是如果DISABLE了后,除了NMI的,其他都不響應)? |
|
單帖管理 | 引用 | 回復 |
quartzcq |
8樓 |
Post By:2007-7-27 12:37:00 [只看該作者]
補一下,上面我說“如果只是打開TMR1,里面不做任何其他動作(或者做幾行簡單的加減乘除等代碼)”是在tmr1 isr enable()和EOI之間的。
|
|
單帖管理 | 引用 | 回復 |
x10 |
9樓 |
Post By:2007-7-27 14:06:00 [只看該作者]
ETR186與PC是兼容的,當然可以使用enable()和disable()來操作CPU的中斷使能開關。DOS系統很多地方都可能有enable(),所以如果要確保在一段代碼中關閉中斷,就需要:
disable(); //your code... make sure no enable() instructtion enable(); 如果有系統調用,如printf(),中斷肯定被打開了。 |
|
單帖管理 | 引用 | 回復 |
返回首頁請教:打開TMR1的ISR,串口接收數據會丟失!! |
---|
用戶名: | |
驗證碼: | |
內容: | |