求vxworks看门狗定时通用程序
最近在做一个项目,需要使用vxworks看门狗定时程序。vxworks也是最近才学的,希望大家能帮忙,共享一些手中的资料。
[解决办法]
帮顶
[解决办法]
其实Vxworks下定时函数很简单
MyTimer()
wdCreate
wdStart( MyTimer)
#include "inetLib.h"
#include "vxWorks.h"
#include "stdio.h"
#include "iolib.h"
#include "time.h"
#include "selectLib.h"
#include "msgQLib.h"
#include "semLib.h"
#include "wdLib.h"
//系统Tick=1ms
WDOG_ID g_wd2sHandle = NULL; /*2S定时器的句柄, 用于模拟量的计量*/
void TimerTest(int nInterval)
{
int i = 0;
int j = 0;
/* Start watchdog */
wdStart(g_wd2sHandle, nInterval, (FUNCPTR)TimerTest, nInterval);
logMsg("1. tickGet() = %ld \n", tickGet());
for(i = 0; i < 1000000; i++)
{
j = j+1;
}
logMsg("2. tickGet() = %ld \n", tickGet());
}
/************************************************************************/
/* Function : 启动向上位机发AI数据定时器函数
/* Input : nInterval, 定时时间ms
/* RetValue : 无
/* Date :
/************************************************************************/
void StartTimer(int nInterval)
{
/*If Timer of 2s is started, delete it */
if(NULL != g_wd2sHandle)
wdDelete(g_wd2sHandle);
/*Create watchdog handle*/
g_wd2sHandle = wdCreate();
if(NULL == g_wd2sHandle)
return ;
/*Start watchdog */
wdStart(g_wd2sHandle, nInterval, (FUNCPTR)TimerTest, nInterval);
}
/**************************************************************************
* 函数功能 : 测试程序的主函数,在usrAppInit.c文件中调用
* 输入参数 : 无
* 输出参数 : 无
* 返 回 值 : 无
* 创建信息 :
**************************************************************************/
void ProjMain()
{
int i = 0;
for(i = 0; i++; i < 10)
{
printf("AAAAAAAAAAAAAAAAAAAAAAAAAAAA \n");
}
printf("sysClkRateGet() = %d \n", sysClkRateGet() );
taskDelay(1000);
StartTimer(100);
//COMTest();
}
[解决办法]
可以起任务,or用楼上有人说的Wd的Timer(递归式的调用)
建议用任务方式。
如果只是自己学习,起一个优先级>10的任务喂狗即可
若系统还承载有许多重要业务,可以考虑用双任务喂狗方式,思路如下:
起高低优先级两个任务,简称高狗(>10)和低狗(比Idle高一点)
低狗给高狗“喂狗”,高狗则喂真正的硬件狗。高狗若在一定时间内没有收到低狗的喂狗信息,高狗则停止喂硬件狗。
好处:一般的任务够只是为了防止软件跑飞(内存越界等),但由于喂狗任务很高,若系统未跑飞但因异常导致CPU过载或大量任务饥饿,就无法解决了。
[解决办法]
楼上说的很详细,也很到位,楼主可以查阅相关书籍