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;
}
}
}
- vxworks的钩子函数和软中断定时函数
- vxworks中switch钩子函数的用法
- 钩子函数和键盘记录
- 生命周期和钩子函数
- Vue2.X的路由和钩子函数
- vue js 的生命周期和钩子函数
- vue生命周期和钩子函数的理解
- 钩子函数的学习
- 钩子函数的使用
- Vue的钩子函数
- Vm生命周期和钩子函数
- 钩子函数
- 钩子函数
- 钩子函数
- 钩子函数
- 钩子函数
- 钩子函数
- 钩子函数
- Object-C 设计模式
- Markdown语法练习
- HDU 5351 MZL's Border(2015多校第五场第9题) 写长串找规律
- 瞬间的感触
- MyEclipse配置Tomact运行环境
- vxworks的钩子函数和软中断定时函数
- 函数的递归调用
- 十大最容易让人误解的职业
- 关于输入框input如何实现只可以选择不可以键盘输入
- C 语言中的好基友 数组和指针之五
- PHP array系列函数
- rman convert 迁移win64位oracle 到linux oracle+asm 手稿
- Oracle递归排序 父子关系排序
- JAVA数据源连接方式汇总