Forum: Compiler & IDEs STM32F207: Compilerfehler


von Leo (Gast)


Lesenswert?

Hi,

verwende als Toolchain den IAR Embedded Workbench.
Der IAR Compiler zeigt mir folgenden Fehler an:

Error[Pe167]: argument of type "void (*)(obSTM32UART *)" is incompatible 
with parameter of type "void (*)(void *)


Scheduler.c Datei:
1
//- Interruptfunktionen
2
obSTM32Scheduler_MLst.Parent.SetTimerInterrupt = (int(*)(obScheduler*,int,void(*)(void*),void*,int,int))  obSTM32Scheduler_SetTimerInterrupt;

UART.c Datei:
1
void  obSTM32UART_FrameEnd(obSTM32UART* pInst)
2
{
3
...
4
        // Frame-End Timer stoppen
5
        pInst->m_pTimer->pM->SetTimerInterrupt(pInst->m_pTimer,0,*obSTM32UART_FrameEnd,pInst,0,0);
6
...
7
}

Es liegt wahrscheinlich an der Verwendung des dritten Parameter von der 
SetTimerInterrupt Methode.
Wie kann ich den Fehler beheben ?

von Karl H. (kbuchegg)


Lesenswert?

Leo schrieb:

> Es liegt wahrscheinlich an der Verwendung des dritten Parameter von der
> SetTimerInterrupt Methode.

richtig.

Eine Funktion die einen obSTM32UART* Pointer bekommt ist nun mal nicht 
dasselbe, wie einen Funktion die einen void* Pointer bekommt. Zumindest 
nicht in C++

> Wie kann ich den Fehler beheben ?
Zurechtcasten

von Leo (Gast)


Lesenswert?

Wie müsste ich den Pointer zurechtcasten ?

von Leo (Gast)


Lesenswert?

Ich habe jetzt schon alles erdenkliche ausprobiert.

von Karl H. (kbuchegg)


Lesenswert?

Leo schrieb:
> Wie müsste ich den Pointer zurechtcasten ?

Der Compiler schreibt es dir doch sogar hin, wie der Datentyp aussehen 
muss

Error[Pe167]: argument of type "void (*)(obSTM32UART *)" is incompatible
with parameter of type "void (*)(void *)

Du hast einen
void (*)(obSTM32UART *)
und es sollte sein ein
void (*)(void *)

Ergo:
1
pInst->m_pTimer->pM->SetTimerInterrupt(pInst->m_pTimer,0,(void (*)(void *))obSTM32UART_FrameEnd,pInst,0,0);

mach dir am besten einen typedef dafür, das wirst du wahrscheinlich noch 
öfter brauchen.
1
typedef void (* voidPtrFnct)(void *);
2
3
....
4
5
pInst->m_pTimer->pM->SetTimerInterrupt(pInst->m_pTimer,0,(voidPtrFnct)obSTM32UART_FrameEnd,pInst,0,0);

> Ich habe jetzt schon alles erdenkliche ausprobiert.
Das einzig hilfreiche wahrscheinlich nicht: Das Studium von Literatur 
und dort wiederrum das Kapitel, in dem Funktionspointer besprochen 
werden.

von Leo (Gast)


Lesenswert?

Danke für die Hilfe. Es funktioniert nun.
Ich werde mir nochmals die Theorie von Funktionspointern und deren 
Verwendung durchlesen

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.