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

来源:互联网 发布:厦门市公安局网络刻章 编辑:程序博客网 时间:2024/05/18 10:38

异常处理任务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;
                   
                   }
         }
}

0 0
原创粉丝点击