您的位置:首页 > 其它

vxworks的钩子函数和软中断定时函数

2015-08-05 16:36 351 查看
异常处理任务tExcTask:
异常处理任务执行VxWorks异常处理,这些函数都是在中断中不能执行但又非常重要的。所以这个任务必须在系统中具有最高的优先级,不能被挂起、不能被删除、不能改变优先级。一般tExcTask的优先级定为0。
excJobAdd():由于tExcTask的优先级最高,所以可以将一些响应要求比较高的任务通过excJobAdd()交给tExcTask处理。

WatchDog

    VxWorks提供了一种通用的看门狗定时器机制。利用提供的函数,任何任务都可以创建一个看门狗定时器,经过指定的延时后,实现在系统时钟ISR的上下文中运行指定的程序。需要注意的是,看门狗定时触发的程序是在中断级别上执行,而不是在任务的上下文中。因此,看门狗定时挂接的程序编写有一定的限制,这个限制条件与中断服务程序的约束是一样的。比如,不能使用获取信号量的语句,以及像printf()这样的I/O系统函数。

    通过wdCreate()可以创建一个看门狗定时器。调用wdStart()启动定时器,延时参数同taskDelay一样以tick为单位,同时还须指定定时完成后要调用的程序。如果应用程序同时需要多个看门狗函数,则应使用wdCreate()产生多个独立的看门狗ID。因为对于给定的看门狗ID,通过wdStart()只能关联一个看门狗函数。在指定的tick计数到达之前,要取消一个看门狗计时器,可以通过调用wdCancel()实现。每调用一次wdStart(),看门狗定时器只执行一次,因此对于一些要求周期性执行的应用程序,要获得该效果,则定时器函数本身必须通过递归调用wdStart()来重新启动定时器。

    如果利用看门狗定时器实现延时,则存在与taskDelay一样的精度上的缺陷,以tick为基准.并且看门狗关联的函数所受的限制很大,这也是使用不便的一个方面。不过启动看门狗的任务不会被阻塞,因为wdStart()调用立即返回并继续执行。

软中断定时: wdCreate();

int  wdDebug = wdCreate();

         wdStart(wdDebug, sysClkRateGet(), debugWatchDog, 0);

 

 void debugWatchDog(void)

{

        // extern WIND_TCB * taskIdCurrent;

         

                  

                   if (++wdDebugCount > 3) {

                     

                            logMsg("\r\nwdDebugCount:%d;taskIdCurrent:%X\r\n", wdDebugCount,taskIdCurrent,0,0,0,0);

                            printf_switchtask_info();

                            excJobAdd(taskSuspend, taskIdCurrent, 0,0,0,0,0);   // excJobAdd()要执行的动作添加进来

                   }

       

         

         wdStart(wdDebug, sysClkRateGet(), debugWatchDog, 0);

}

钩子函数:void switchHook(WIND_TCB *pOldTcb, WIND_TCB *pNewTcb):

typedef struct

{

   unsigned long  taskid;

   unsigned long  start_tick;

   unsigned long  couter;

   unsigned long  num;

}taskinfor;

taskinfor taskinfo[100]={0};

void switchHook(WIND_TCB *pOldTcb, WIND_TCB *pNewTcb)

{

         unsigned long start_tick ,end_tick,tmp;;

         int i= 0;

        

         for(i=0;i<100;i++)

         {

                   if(taskinfo[i].taskid !=0)/* && taskinfo[i].taskid!=(unsigned long)pNewTcb*/

                   {

                            if(taskinfo[i].taskid==(unsigned long)pOldTcb)

                            {

                                     end_tick= TICK_GET();
tmp = end_tick - taskinfo[i].start_tick;

                                     if(tmp>taskinfo[i].couter )
taskinfo[i].couter= tmp;

                                     if(taskinfo[i].couter>100)

                                               logMsg("task_id = %ld, couter =%d,num = %d\n\r",taskinfo[i].taskid,taskinfo[i].couter,taskinfo[i].num ,0,0,0);

                            }

                            else if(taskinfo[i].taskid==(unsigned long)pNewTcb)

                            {

 

                                     taskinfo[i].start_tick = TICK_GET();
taskinfo[i].num= taskinfo[i].num +1;

                                     // taskinfo[i].taskid = (unsigned long)pNewTcb;

                                     break;

                            }

                            else

                                     continue;

                   }

                   else{

                            taskinfo[i].taskid = (unsigned long)pNewTcb;

                            taskinfo[i].start_tick = TICK_GET();
taskinfo[i].num= taskinfo[i].num +1;

                            break;

                   

                   }

         }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: