會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客





請問可能造成 TRAPS_ADDRESS_ERR 的原因?
初級會員
註冊日期:
2017/02/12 20:58
所屬群組:
註冊會員
文章: 22
等級: 3; EXP: 41
HP : 0 / 60
MP : 7 / 325
離線
各位先進好

小弟最近使用 dsPIC33EV64GM006 開發時

因為需求所以需要固定時間從初始化重新執行內部程式

在初始化時

除了硬體周邊的初始化時

我還會將使用的 function 的 pointer 指到某些 指標變數

使用時直接 call 指標變數

像是


void function_a
(int in)
{
   ...
}

void (*function_ptr)(int in);
function_ptr = function_a;

function_ptr(num_a);



使用 Debug 測試時

第一次運作整個流程都沒問題

但一要求初始化並回到 function_ptr = function_a; 時

就會觸發 TRAPS_halt_on_error,值是 TRAPS_ADDRESS_ERR

1.原本認為是 function_ptr 指到奇怪的地方去,但檢查過並不是

2.跑到 function_ptr = function_a; 時,如果是step by step 執行下去,不會觸發 TRAPS_halt_on_error。但如果 run 不設中斷點,就會觸發 TRAPS_halt_on_error

3.若不用 Debug 模式跑,狀況會變成直接 reset

本來想提供原始碼,但考慮到程式過於複雜

因此才以簡述的方式敘述,還請見諒

謝謝

ps 網路上有找到篇類似的 https://phalox.be/wp/software/how-to-s ... address-errors-on-pic24f/

但按照上面進到 TRAPS_halt_on_error 後,將 INTCON1 設為 0X00 繼續執行

也不會跳至發生 TRAPS_halt_on_error 中斷前的位置

就只是一直卡在 TRAPS_error_code = code;

11月23日 17:00:24
轉換PDF檔 列印


Re: 請問可能造成 TRAPS_ADDRESS_ERR 的原因?
初級會員
註冊日期:
2017/02/12 20:58
所屬群組:
註冊會員
文章: 22
等級: 3; EXP: 41
HP : 0 / 60
MP : 7 / 325
離線
補充一下

TRAPS_halt_on_error 觸發時

INTCON1 的 STKERR 被 Set

但我不知道如何確認是否是 stack 爆掉

11月23日 17:26:07
轉換PDF檔 列印


Re: 請問可能造成 TRAPS_ADDRESS_ERR 的原因?
初級會員
註冊日期:
2017/02/12 20:58
所屬群組:
註冊會員
文章: 22
等級: 3; EXP: 41
HP : 0 / 60
MP : 7 / 325
離線
後來多測試了幾次

發生 traps_error 時

INICON1 一共有兩個 ERROR 被 SET

分別是 ADDRERR 與 STKERR

發生的時間點是在程式重新 Init 時( ps:不是斷電重跑,我程式中一個條件trigger時,會 goto 到 Init 的那行開始 ),設定完中斷優先、周邊後,INTERRUPT_GlobalEnable()時發生的

進入 traps_error 後

會先進入


void ERROR_HANDLER_NORETURN _AddressError
(void)
{
    
errLoc=getErrLoc();
    
INTCON1bits.ADDRERR = 0;  //Clear the trap flag
    
TRAPS_halt_on_error(TRAPS_ADDRESS_ERR);
}


errLoc 的值為 0xFFFD

但一直無法進入


void ERROR_HANDLER_NORETURN _StackError
(void)
{
    
/* We use a failsafe stack: the presence of a stack-pointer error
     * means that we cannot trust the stack to operate correctly unless
     * we set the stack pointer to a safe place.
     */
    
errLoc=getErrLoc();
    
use_failsafe_stack();
    
INTCON1bits.STKERR = 0;  //Clear the trap flag
    
TRAPS_halt_on_error(TRAPS_STACK_ERR);
}


接著 Debug 就卡住不動了

getErrLoc 是 google 搜來的

內容似乎是印出進入 traps_error 前的 pc 位置(這點我還需要些時間翻datasheet確定)

附加檔案:



jpg  2018-11-26_153401.jpg (466.45 KB)
50946_5bfbaeeb8abf6.jpg 1920X1080 px

11月26日 16:29:31
轉換PDF檔 列印






無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
Microchip連結

網頁捷徑
2019 Winter Elite 報名
教育訓練
其它網站連結
電話: 02-25000405
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project