⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c06a_esr.c

📁 Tornado的源代码资源包
💻 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 + -