?? c06a_esr.c
字號:
/******************************************************************
*
* dataAccess_Exc.c -- 這個測試例程基于MPC8xx的目標板實現,將VxWorks默認
* 的異常服務程序修改為用戶指定的函數。
*
* Copy writes Oct, 2003
*
*步驟:
* 1. 觸發一個數據訪問異常.
* 2. 觀察系統默認的異常處理
* 3. 綁定用戶指定的函數.
* 4. 再次觸發數據訪問異常,觀察結果。
* 5. 恢復系統默認的異常處理程序.
*/
/* 頭文件 */
#include "vxworks.h"
#include "stdio.h"
#include "taskLib.h"
#include "loglib.h"
#include "excLib.h"
#include "asm.h"
/* 宏定義 */
#define TASK_PRIORITY 100 /* 觸發異常task的優先級 */
#define TASK_STACK 0x1000 /* 觸發異常task的堆棧尺寸 */
#define INVALID_ADDR 0x1000000 /* 無效地址 */
#define EXCEPTION_VEC 0x00300 /* 訪問無效地址所觸發的異常向量 */
/* 變量 */
LOCAL FUNCPTR defaultVec = NULL; /* 記錄系統默認的ESR的入口地址 */
/******************************************************************
*
* TriggerExc - 觸發非法地址訪問的異常
*
* Return N/A
*
*/
void TriggerExc(void)
{
int *ptr = NULL;
int addr = INVALID_ADDR;
ptr = (int*)addr; /* 將非法地址賦予一個空指針 */
printf("\n ptr = %x", (int)ptr);
addr = *ptr; /* 讀取非法地址的數據,此時觸發異常 */
printf("\n addr = %x", addr);
return;
}
/******************************************************************
*
* myESR - 用戶指定的異常處理程序
*
* Return N/A
*
*/
void myESR(void)
{
/* 輸出異常提示消息 */
logMsg("\n +++Invalid Data Access+++", 0, 0, 0, 0, 0, 0);
/* 從ESR返回,主要是恢復MSR,否則將會不斷的執行ESR */
__asm__(" rfi ");
}
/******************************************************************
*
* changeESR -改變系統默認的ESR為用戶編寫的程序
*
* Return N/A
*
*/
void changeESR(void)
{
/* 記錄系統默認的ESR入口地址 */
defaultVec = excVecGet((FUNCPTR*)EXCEPTION_VEC);
/* 關聯新的ESR */
excConnect((VOIDFUNCPTR*)EXCEPTION_VEC, (VOIDFUNCPTR)myESR);
return;
}
/******************************************************************
*
* recoveryESR -恢復到系統默認的ESR
*
* Return N/A
*
*/
void recoveryESR(void)
{
excVecSet((FUNCPTR*)EXCEPTION_VEC, (FUNCPTR)defaultVec);
return;
}
/******************************************************************
*
* myRoot - 創建一個任務去觸發數據訪問異常
*
* Return N/A
*
*/
void myRoot(void)
{
int taskid;
taskid = taskSpawn("tTriggerExc ", TASK_PRIORITY,
VX_NO_STACK_FILL, TASK_STACK,
(FUNCPTR)TriggerExc, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0);
return;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -