Re: [問題] 如何在interrupt結束後要求program回到 …

看板C_and_CPP (C/C++)作者 (ggg)時間16年前 (2009/09/23 17:27), 編輯推噓2(204)
留言6則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《ronald7821 (ron)》之銘言: : 我看了longjmp的用法,唯一會產生問題,似乎是 : longjmp會Reset我的global variable counter; setjmp, longjmp 使用的情況是: 1. Error handling. 主程式叫用多個下層 function 時, 發生錯 誤的地方, 若按逐層 call/return 回去, 一則沒必要每層再判斷, 因此希望直接快速回到可以重來的地方. 2. 從多個內層程式圈 , by-pass 直接回到 最外層. 所以, 原理上並不是單純的 far jump . 是在叫用 setjmp 的地方, 由 setjmp function 做了一份 context 推存於 stack buffer. longjmp 是改了執行時的 stack retun-address, 接回 setjmp 原 存的 stack buffer 並還原 context 內容再接回 setjmp 的下一個 接續點還回主程式. 效果相當於主程式從頭開始重跑. : 所以我參考了http://0rz.tw/XAUZ1的建議 : 以下是我的code : /* counter -- +1 when user pressed PB9 */ : register unsigned char counter asm("r3"); : jmp_buf env; : int main() { : counter = 0; : setjmp(env); : for(;;){ : ..... : } : } : ISR(INT0_vect) { : if(counter >= 7) { : counter = 0; : } else { : counter++; : } : longjmp(env, 1); : } 上面的 main() 與 ISR() 宣告的 counter 會是同一個 global variable 嗎 ? 如果不是同一個, counter 值當然是傳不回來. 還有此 ISR 若是處理 hardware interrupt, 若不清除相關的硬 體中斷訊號源, 還原成可再產生中斷訊號的控制狀況就逕自跳離 的話, 這個硬體就可能處於無法再產生中斷的狀態. : 在我program到我的Microcontroller之後,按下按鈕counter值仍然沒變 這兩個 counter 不是同一個變數的可能性比較大. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.115.4.12

09/24 20:57, , 1F
謝謝ggg大大的解說 不過我的global variable "counter"
09/24 20:57, 1F

09/24 20:58, , 2F
只有在program最上面define過一次
09/24 20:58, 2F

09/24 20:59, , 3F
想請問一下 如何有可能會是不同一個變數?
09/24 20:59, 3F
真抱歉竟然未細看到 counter 是放在main外那行宣告,您宣告的counter似乎是指 定了r3, 雖然是 global variable 但 longjmp之後應會被最原始的 register content 蓋回去. ※ 編輯: ggg12345 來自: 140.115.4.12 (09/24 22:53)

09/24 23:03, , 4F
嗯 我debug的時候似乎是被最原始的蓋過去了
09/24 23:03, 4F

09/24 23:04, , 5F
朋友建議我用function pointer 仍在嘗試中
09/24 23:04, 5F

09/24 23:05, , 6F
還是非常謝謝你提供有關longjmp的資訊!^^
09/24 23:05, 6F
文章代碼(AID): #1AkUdco2 (C_and_CPP)
文章代碼(AID): #1AkUdco2 (C_and_CPP)