2016-05-01 14 views
1

Für das Betriebssystem VxWorks, sie bieten eine Systembibliothek für Laich Aufgaben:Warum nimmt TaskSpawn statt void *?

int taskSpawn 
    (
    char * name,    /* name of new task (stored at pStackBase) */ 
    int  priority,   /* priority of new task */ 
    int  options,   /* task option word */ 
    int  stackSize,  /* size (bytes) of stack needed plus name */ 
    FUNCPTR entryPt,   /* entry point of new task */ 
    int  arg1,    /* 1st of 10 req'd task args to pass to func */ 
    int  arg2, 
    int  arg3, 
    int  arg4, 
    int  arg5, 
    int  arg6, 
    int  arg7, 
    int  arg8, 
    int  arg9, 
    int  arg10 
    ) 

Sie sehen können, wie begrenzt ist dies etwas, im Vergleich zu wie std :: thread.
Normalerweise könnte ich die passenden Argumente basierend auf der Eingabe-Funktion übergeben.


Da dies eine C-Funktion ist, war ich neugierig, ob es einen Grund dafür war, dass vxWorks wählen Argumente haben 1-10 ints anstelle von void-Zeiger sein.

Wenn sie ungültige Zeiger wären, wäre ich in der Lage, jeden Typ weiterzuleiten und dann in die Eingabefunktion zurück zu werfen.

Wenn ich einen Zeiger von struct foo in die Eingabefunktion geben wollte, die taskSpawn gegeben wurde, konnte es in eine Ganzzahl konvertiert werden und dann zurück zum entsprechenden Zeiger?
Basierend auf dem Design dieser Funktion bin ich gezwungen, Globals zu verwenden?

Antwort

1

Ich denke, Sie werden feststellen, dass auf VxWorks ein Integer die gleiche Größe wie ein Zeiger hat, und die übliche Praxis besteht darin, zwischen ihnen zu übertragen. Wenn Sie also einen Zeiger über TaskSpawn übergeben möchten, können Sie ihn als (int)ptr übergeben.

Nein, das ist kein tragbares C, aber es ist scheinbar normale Praxis auf dieser Plattform mit dieser Funktion.

+0

Hmm, das klingt nach ziemlich schmutzigem Code. Sich auf Implementierungsdetails ohne Notwendigkeit zu verlassen, ist ein schlechter Stil. ** Iff ** Man muss einen Zeiger als Integer übergeben (es gibt gute Gründe in einigen generischen Funktionen), "intptr_t" und seine sibbling "uintptr_t" sollten verwendet werden. Das hält nicht nur einen Zeiger fest, sondern gibt auch eindeutig an, dass "dieses Objekt einen Zeiger halten könnte". – Olaf

+0

@Olaf: Das ist hier nicht relevant, da die Person, die diese Frage stellt, eine Hersteller-API verwendet, die nicht geändert werden kann. –

+0

Nehmen Sie einfach meinen Kommentar als - gut - Kommentar. Es ist relevant, die Qualität des Codes zu beurteilen und wie gut er vom Anbieter gepflegt wird. (Ich kenne VxWorks). Ich habe nicht gesagt, dass der Code kaputt ist, obwohl ich mir sehr wohl bewusst bin, dass der Code auf dieser Plattform funktioniert. Aber es gibt eine Menge solchen Code, der problematischer ist und auch von anderen gelesen werden kann. – Olaf