2009年2月20日星期五

VxWorks任务钩子示例

/* includes */
#include "vxWorks.h"
#include "taskLib.h"
#include "taskHookLib.h" /* taskHook
所对应的库
*/

/* task function */
void myFunc(void)
{
int i;
printf("Hello, I am task %d\n", taskIdSelf()); /* Print task Id */
}

/* taskCreatHook */
void myTaskHook(void)
{
printf("task hook function called\n");
}

/* user entry */
void user_start()
{
taskCreateHookAdd( (FUNCPTR) myTaskHook);
taskSpawn("myTask", 90, 0x100, 2000, (FUNCPTR) myFunc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
}


运行输出:

task hook function called
Hello, I am task 14868640

有过Windows钩子(Hook)编程经验的读者应该对其概念并不陌生,Hook作为回调函数,当被挂接后。操作系统发生特定的事情时,将触发这个 Hook回调函数的执行。VxWorks也有钩子的概念,不过比Windows要简单许多,主要有taskCreateHook taskDeleteHooktaskSwitchHookAdd,可以通过如下6API来添加和删除这三种Hook
STATUS taskCreateHookAdd (FUNCPTR createHook /* routine to be called when a task is created */ );
STATUS taskCreateHookDelete (FUNCPTR createHook /* routine to be deleted from list */);
STATUS taskSwitchHookAdd (FUNCPTR switchHook /* routine to be called at every task switch */);
STATUS taskSwitchHookDelete (FUNCPTR switchHook /* routine to be deleted from list */);
STATUS taskDeleteHookAdd (FUNCPTR deleteHook /* routine to be called when a task is deleted */);
STATUS taskDeleteHookDelete (FUNCPTR deleteHook /* routine to be deleted from list */);

钩子函数,就是沟起来嘛,,,,,,,比如说发生某件事情的时候同时你想做点什么,就为这件事情添加一个钩子函数。具体点:比如说vxWorks重启动, 你想在重启动之前做点什么,比如说关闭某个正在工作的设备,或者点亮某个指示灯。那么你就可以通过,rebootHookAdd()来添加钩子函数,这个 沟起来的函数就是你要关闭设备或者点灯的函数。那么,在重启动的时候,这个函数就被调用了。还由任务切换等等等,都可以添加相应的钩子函数。。咋说呢,有 点类似于Windows下的回调函数,或者事件函数,比如串口控件的OnComm事件函数。。说得不对的话,欢迎PK。

From: http://blog.chinaunix.net/u1/53892/showart_1217481.html

0 评论: