目的是要喚起 pendsv 這個 isr, 這個程式碼其實不難, 原理也不複雜, 可是卻花了好大功夫才搞定。
L41 ~ 43, L51 ~ 53, 在設定 priority, 預期在 svc_isr 之後, 要跳進 pendsv_handle。在 svc_isr 設定 pendsv 的 pending bit, 等著離開 svc_isr 之後被喚起。
嘗試很久都無法喚起 pendsv_handle, 都無法成功, 我甚至還另外寫了一個 c 的版本, c 的版本順利 work, 終於讓我找到問題。
問題是 ... 沒有問題, 這個程式從頭開始就是對的, 只是 pendsv_handle 並不是在離開 svc_isr 後立刻執行, 而是在過了一段時間之後才執行。真是奇怪阿!
由於這緣故, 讓我多花了好幾天解決這問題。
程式碼註解中有提到可 dump 哪些暫存器來觀察, 你有和我買一樣的書會很方便, 沒有的話就看:
Cortex™-M3 Technical Reference Manual (filename:DDI0337E_cortex_m3_r1p1_trm.pdf)
以下為 gdb trace 的結果, 在 svc_isr, pendsv_handle 我加入一些說明。
你一定會有點疑惑, 為什麼要介紹這個對吧!嗯 ... 讓我賣個關子。
ref:
沒有留言:
張貼留言
使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。
我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。