wdStart有多个参数

时间:2014-12-09 08:50:40

标签: c vxworks watchdog

我四处寻找解决问题的办法,但徒劳无功。似乎没有什么可以解决我的问题。我非常感谢你的帮助。 我需要使用看门狗调用temperatureControl()。但是,temperatureControl占用2个参数,而wdStart只能用1个arg来调用fucntion。有没有解决这个问题?

wdStart(watchDog, args.tPeriod , (FUNCPTR)temperatureControl, arg1, arg2); 

代码:

struct arguments{
int tPeriod; /* Time in ticks used inside watchdog to change temperature*/
int room;  /* Room targetted */
int temperature; /* Desired temperature*/
};

/* Set the chosen room to the desired temperature after tperiod time*/
void setTemperatureUsingWatchDog(struct arguments args)
{
    watchDog = wdCreate();
    wdStart(watchDog, args.tPeriod , (FUNCPTR)temperatureControl, args);  
    logMsg("Room #%d",args.room, "temperature is set to%f", roomTemperature[args.room],0,0,0);

1 个答案:

答案 0 :(得分:0)

使用结构你是在正确的轨道上,但请注意看门狗参数是一个指针。传入一个整数是可以的,但是当你移动到一个真实的结构时,你必须使用指向它的指针。

在您的代码中,您试图传递结构而不是传递它的地址。请不要简单地使用&代码中的运算符。那会使用一个堆栈地址,然后在ISR上下文中使用它会产生不幸的结果。

以下是使用全局的示例(如果您只有一个结构,则为ok):

struct arguments myGlobalArg;
...
void setTemperature() {
   wd = wdCreate();
   wdStart(wd, myGlobalArg.tPeriod, (FUNCPTR)temperatureControl, &myGlobalArg);
}

如果你有许多不同的args,你可以使用全局结构数组,或动态分配结构。

关键是看门狗参数是指向不应该在堆栈上的东西的指针,但是在全局可访问的内存中。