Re: 進中斷後,其它變數值竟遭修改問題
|
||||
---|---|---|---|---|
版主
|
恭喜! 問題解決了。
寢問是 Temp Data context Saving 的問題導致的錯誤嗎? 分享一下你的心得。
發表於: 2008/4/21 15:22
|
|||
|
Re: 進中斷後,其它變數值竟遭修改問題
|
||||
---|---|---|---|---|
中級會員
|
哈哈,搞定了
感謝版主提供資訊!! 雖然知道版主的意思,但卻一直用不上來(一直出現error訊息) 之後去找了 "C18 C compiler User's Guide" 終於知道它的用法 ,經過測驗後之前的問題不再出現了~爽 這樣小弟負責的部份一定可以在working sample階段前給客戶 終於把這個問題解決了,再次感謝版主~感恩~
發表於: 2008/4/21 15:17
|
|||
|
Re: 進中斷後,其它變數值竟遭修改問題
|
||||
---|---|---|---|---|
版主
|
加在 #pragma interrupu 中斷服務程式的函數宣告。
發表於: 2008/4/21 14:03
|
|||
|
Re: 進中斷後,其它變數值竟遭修改問題
|
||||
---|---|---|---|---|
中級會員
|
感謝版主的回應:
首先先回應版主的問題" // 與其它 MCU 通訊程式 不知道這段程式要花多久時間? A:大概40us 可不可以在中斷裡只要設個 Time Out 的旗號,要要花較多時間執行的能刻意在主程式看到此 Time Out 旗號後交由主程式執行。 A:這個方式小弟有想過,但不可行,主要原因是與其它 MCU 通訊優先權是最大的不可LOSE,而TIMER4 200us中斷也是必要的,因為一定要在每200us內完成填值工作,若移至主程式的話處理速度變為10ms處理一次會來不及.... 另外對於版主上方所提供的方式,小弟有點不解: 是否只要將上方紅色文字描述加入程式中即可? 還是加在*.LKR 中? 感謝!!
發表於: 2008/4/21 11:36
|
|||
|
Re: 進中斷後,其它變數值竟遭修改問題
|
||||
---|---|---|---|---|
版主
|
// 與其它 MCU 通訊程式
不知道這段程式要花多久時間? 可不可以在中斷裡只要設個 Time Out 的旗號,要要花較多時間執行的能刻意在主程式看到此 Time Out 旗號後交由主程式執行。
發表於: 2008/4/21 10:40
|
|||
|
Re: 進中斷後,其它變數值竟遭修改問題
|
||||
---|---|---|---|---|
版主
|
其實這個問題已經很多客戶都有反應過,因為 Temp Data 的關係。因為在主程式下因 C 在叫用一些運算式時會使用到一些暫時儲存的 RAM ( temp data) 如果這時發生中斷,且中斷程式又做這些數學的計算時也會使用到相同的 Temp data 區域,所以原先的資料就被壞了。
所以中斷程式裡有用用到計算時就要特別小心,C18 裡有提供此 temp data 的 context saving 的功能 (紅色部分)。 User 自行定義的變數 : #pragma interrupt high_interrupt_service_routine save=myint 儲存自訂的 myint 變數 pragma interrupt high_interrupt_service_routine save=section("mydata") 儲存自訂變數節區 mydata 的變數 #pragma interrupt high_interrupt_service_routine nosave=section(".tmpdata") 儲存 temp data 區的資料
發表於: 2008/4/21 10:30
|
|||
|
進中斷後,其它變數值竟遭修改問題
|
||||
---|---|---|---|---|
中級會員
|
小弟目前遇到一個很難 Debug 的問題 ,想請教大家
因為程式太龐大故無法將程式貼上來... 只能以基本 的做法來與各位高手討論;先說明小弟的平台如下: 1.使用MCU為18F87J10 2.使用ICD2做DEBUG 3.程式使用C語言撰寫 4.使用MPLAB V8.0 5.使用C18的COMPILER V3.16; LINKER V4.16 6.編譯參數為:-Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa- (無使用最佳化處理) 小弟的程式架構大概是這樣子的 : Main loop為10ms一直重覆在執行一個Array1[256]的 填值工作,當然這些值是有經過加、減、乘、除的處 理,而在這main loop的 10ms中會有50次的TIMER4中 斷 (目前規劃在LOW ISR),每次間隔 200us,每次進 中斷後在中斷內執行另一個Array2[64]填值工作, 執行 時間大約 120us,剩餘80us 的時間給main loop做... 另外HIGH ISR的部份也有使用到外部中斷與其它 MCU 做通訊.... 現在問題來了: 只要這個LOW ISR (TIMER4) 200us的中斷有被執行, 且程式跑了一段時間(每次時間都不同)在 Main LOOP 中的 Array1[256]:0~255的位址有時就會被干擾,也 就是有時 Array1[256]其中某幾個不固定的位址內容 值會被 "偷偷地" 修改;如果我把TIMER4關閉的話, 這個Array1[256]內容值就會正常... 在中斷裡HIGH ISR 及 LOW ISR小弟已有將 WREG BSR STATUS 甚至處理四則運算的暫存器: AARGB0~3,BARGB0~3,REMB0~4 這幾個都有做了PUSH及POP的temp動作; 如下程式概述: void isr_high(void) { W_temp0 = WREG; BSR_temp0 = BSR; ST_temp0 = STATUS; hPW0 = __AARGB0; hPW1 = __AARGB1; hPW2 = __AARGB2; hPW3 = __AARGB3; hPX0 = __BARGB0; hPX1 = __BARGB1; hPX2 = __BARGB2; hPX3 = __BARGB3; hPY0 = __REMB0; hPY1 = __REMB1; hPY2 = __REMB2; hPY3 = __REMB3; //.......................// // 與其它 MCU 通訊程式 //.......................// INTCONbits.GIE = 1; __REMB3 = hPY3; __REMB2 = hPY2; __REMB1 = hPY1; __REMB0 = hPY0; __BARGB3 = hPX3; __BARGB2 = hPX2; __BARGB1 = hPX1; __BARGB0 = hPX0; __AARGB3 = hPW3; __AARGB2 = hPW2; __AARGB1 = hPW1; __AARGB0 = hPW0; STATUS = ST_temp0; BSR = BSR_temp0; WREG = W_temp0; } void isr_low(void) { W_temp1 = WREG; BSR_temp1 = BSR; ST_temp1 = STATUS; lPW0 = __AARGB0; lPW1 = __AARGB1; lPW2 = __AARGB2; lPW3 = __AARGB3; lPX0 = __BARGB0; lPX1 = __BARGB1; lPX2 = __BARGB2; lPX3 = __BARGB3; lPY0 = __REMB0; lPY1 = __REMB1; lPY2 = __REMB2; lPY3 = __REMB3; INTCONbits.GIE = 1; //.......................// // TIMER 4 功能程式 //.......................// __REMB3 = lPY3; __REMB2 = lPY2; __REMB1 = lPY1; __REMB0 = lPY0; __BARGB3 = lPX3; __BARGB2 = lPX2; __BARGB1 = lPX1; __BARGB0 = lPX0; __AARGB3 = lPW3; __AARGB2 = lPW2; __AARGB1 = lPW1; __AARGB0 = lPW0; STATUS = ST_temp1; BSR = BSR_temp1; WREG = W_temp1; INTCONbits.PEIE = 1; } 但結果還是無法避免 Array1[256]遭到修改的命運, 嚴格說來小弟認為不只是Array1[256]在其它RAM的部 份應該也有遭到修改... Array1[256]的位址使用強制定址在BANK 8上,如下 宣告: #pragma udata gpr8 = 0x800 volatile uchar Array1[256]; #pragma udata 即使變更到其它的 BANK 也是沒用... 而在 *.LKR FILE 中也把該BANK宣告成 PROTECTED DATABANK NAME=gpr8 START=0x800 END=0x8FF PROTECTED 還是無法克服該問題... 由於這問題並非一下子就呈現,但大約間隔個幾秒就出 現所以難DEBUG....基本上 MCU只要在進中斷前TEMP之前 正在處理的暫存器後,等執行完中斷再POP回來應該就不 會錯了才對...但很明顯地在小弟的程式中會有這樣的問 題;有那位高手能夠指導小弟一下,感激不盡!!
發表於: 2008/4/21 9:20
|
|||
|