我四处寻找解决问题的办法,但徒劳无功。似乎没有什么可以解决我的问题。我非常感谢你的帮助。 我需要使用看门狗调用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);
答案 0 :(得分:0)
使用结构你是在正确的轨道上,但请注意看门狗参数是一个指针。传入一个整数是可以的,但是当你移动到一个真实的结构时,你必须使用指向它的指针。
在您的代码中,您试图传递结构而不是传递它的地址。请不要简单地使用&代码中的运算符。那会使用一个堆栈地址,然后在ISR上下文中使用它会产生不幸的结果。
以下是使用全局的示例(如果您只有一个结构,则为ok):
struct arguments myGlobalArg;
...
void setTemperature() {
wd = wdCreate();
wdStart(wd, myGlobalArg.tPeriod, (FUNCPTR)temperatureControl, &myGlobalArg);
}
如果你有许多不同的args,你可以使用全局结构数组,或动态分配结构。
关键是看门狗参数是指向不应该在堆栈上的东西的指针,但是在全局可访问的内存中。