Re: [問題] 如何在interrupt結束後要求program回到 …
※ 引述《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
09/24 20:57, 1F
→
09/24 20:58, , 2F
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
09/24 23:03, 4F
→
09/24 23:04, , 5F
09/24 23:04, 5F
→
09/24 23:05, , 6F
09/24 23:05, 6F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章