2014-12-09 11 views
0

Я искал решение моей проблемы, но напрасно. Кажется, что нет ничего, что могло бы решить мою проблему. Я высоко ценю вашу помощь. Мне нужно вызвать temperatureControl() с помощью сторожевого таймера. Тем не менее, temperatureControl занимает 2 аргумента, и wdStart может вызывать только fucntion только с одним аргументом. Есть ли для этого работа?wdStart с несколькими аргументами

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

попытаться добавить все три аргумента в 'struct', а затем передать структуру как один единственный аргумент –

+1

Не уверен, что такое' watchdog', но если типы гибкие, вы всегда можете передавать несколько объектов в виде структура. – nchen24

+0

Позвольте мне сделать снимок. Спасибо, ребята – Oliver

ответ

0

Вы на правильном пути, используя структуру, но нужно понимать, что сторожевой аргумент является POINTER. Это нормально передать в целое число, но как только вы перейдете к реальной структуре, тогда вы должны использовать указатель на нее.

В вашем коде вы пытаетесь передать структуру, а не ее адрес. И, пожалуйста, не просто используйте оператор & в вашем коде как есть. Это будет использовать адрес стека, который затем будет использоваться в контексте ISR с неудачными результатами.

Вот пример использования глобального (хорошо, если у вас есть только одна структуры):

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

Если у вас есть целый ряд различных аргументов, вы могли бы использовать глобальный массив структур, или динамически выделять структур.

Ключ в том, что аргумент watchdog является указателем на то, что не должно быть в стеке, но в общедоступной памяти.