📄 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 + -