2014-12-09 2 views
0

나는 내 문제에 대한 해결책을 찾고 있지만 헛된 것입니다. 내 문제를 해결할만한 것이 아무것도없는 것처럼 보입니다. 나는 너의 도움에 매우 감사한다. 워치 독을 사용하여 temperatureControl()을 호출해야합니다. 그러나 temperatureControl은 2 개의 인수를 사용하며 wdStart는 1 개의 인수 만 사용하여 함수를 호출 할 수 있습니다. 이 문제가 해결 되었습니까?여러 인수가있는 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

당신은 구조를 사용하여 궤도에,하지만 감시 인수가 포인터 것을 깨닫게하시기 바랍니다. 정수로 전달하는 것은 괜찮지 만 실제 구조로 이동하는 순간 포인터를 사용해야합니다.

코드에서 구조체의 주소가 아닌 구조체를 전달하려고합니다. 그리고 단순히 코드에 & 연산자를 사용하지 마십시오. 그러면 스택 주소가 사용되어 ISR 컨텍스트에서 불행한 결과가 발생합니다. 서로 다른 인수의 번호가있는 경우

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

, 당신은 할당 동적 구조의 글로벌 배열을 사용하거나 수 : 여기

은 (당신이 단 하나의 구조를 가지고있는 경우 확인) 글로벌을 사용하는 예입니다 구조.

중요한 점은 watchdog 인수는 스택에 있으면 안되지만 전역 적으로 액세스 가능한 메모리에 대한 포인터라는 것입니다.