Forum: Mikrocontroller und Digitale Elektronik FreeRTOS frage


von Peter (Gast)


Lesenswert?

Hallo,
ich versuche gerade FreeRTOS auf einem ARM7X256 zum laufen zubringen.
Der Code funktioniert angeblich (Demo Code), aber ich habe da einige 
Fragen zu dem RTOS selber.

Entweder ich kann kein C oder da wird getrickst und ich kenne den Trick 
nicht.

In Queue.C steht : "typedef xQUEUE *XQueueHandle;"
und im Header    : "typedef void *XQueueHandle;"

Mal abgesehen davon das jeder Code Checker da nur Fehler raus wirft, 
verstehe ich nicht wieso das überhaupt funktioniert.

Kann mich jemand aufklären.

Danke, Peter

von Peter (Gast)


Lesenswert?

Ist die Frage doch so kompliziert das niemand eine Antwort hat?

von dunno.. (Gast)


Lesenswert?

ich bin mir grad nicht so sicher ob das hier das gleiche ist, aber man 
kann ja durchaus void - pointer definieren, um z.b. in anderen files 
keinen (wirklichen) zugriff auf die vom pointer referenzierten daten zu 
bekommen - quasi datenkapselung...

just my few cents.

von Rolle (Gast)


Lesenswert?

Hallo,

das ist schon alles in Ordnung so!

Einem Pointer vom Typ "void*" darf man jeden anderen Pointer zuweisen, 
die Typprüfung ist damit quasi ausser Kraft gesetzt, es muss nur ein 
Pointer sein.

Einem Pointer vom Typ "xQUEUE*" dagegen nur einen vom Typ "xQUEUE*"

Alles klar

von Peter (Gast)


Lesenswert?

Im Prinzip ja.

ABER wenn ich den Code mir ansehe dann wird dort mit diesem Pointer 
gearbeitet. Läuft ja anscheinen auch, nur Debuggen möchte ich diese 
Stellen nie.

Ansonsten verstehe ich nicht wieso man einen solchen Schrott in einem 
sonst so guten RTOS rein macht.
Ich würde als mein Chef jeden Angestellten (Kollegen) der mir so etwas 
abliefert raus werfen. Alleine schon um alle Anderen zum vernünftigen 
Programmieren an zuleiten.

von Peter II (Gast)


Lesenswert?

Ich würde sage das es bei C durchaus üblich ist und auch gut so.

Es gibt sehr oft ein funktionen die dir ein void* als eine Art object 
zurückliefern. Und an die nächste Funktion übergibt du den zeiger 
wieder. Sie wollen aber verhindern das du auf die struktur zugreifst und 
eventuell daten veränderst. (in C++ würde man es mit private machen)

von Rolle (Gast)


Lesenswert?

Das hat alles nichts mit schlampig, oder  "vielleicht in C üblich" oder 
"anständigem Code" oder sonst was zu tun.

Es gibt halt Funktionen an die man beliebige Datenstrukturen per Pointer 
übergeben kann und die definiert man dann als void*, weiter nichts!

von Peter (Gast)


Lesenswert?

Nun ja wenn ich was beliebiges weiter geben kann, dann ist das auch eine 
Unendlich große gefahren Quelle.

Außerdem wenn ich nicht weiß was ich mal übergeben will dann sollte ich 
es lieber gleich lassen.

Mir sind solche Sachen immer suspekt und es ist richtig so das da jeder 
Code Tester Fehler raus gibt. Das ist mal wieder etwas, was nie in C 
hätte erlaubt werden dürfen.

Eine Schande das solche Tricks im FreeRTOS drin sind. Ich hoffe mal für 
die Macher das das im SafeRTOS nicht drin ist. So was würden sonst nie 
jemand ernsthaft in Sicherheitsrelevanten Geräten einsetzen.
Ich habe mal in der Medizintechnik gearbeitet und kenne deren 
Anforderungen!

von Purzel H. (hacky)


Lesenswert?

Dass C etwas lockerer wie andere Sprachen mit Typenpruefung umgeht war 
schon immer bekannt. Man muss etwas mehr mitdenken, sich etwas mehr 
konzentriern, oder andere Sprachen waehlen.

von Johnny B. (johnnyb)


Lesenswert?

Nun aber mal halblang!
Void-Pointer haben durchaus ihre Berechtigung und machen absolut Sinn.
Schon mal die Standardlibraries Deines Compilers angeguckt?

z.B. aus string.h:

void *memcpy(void *, const void *, size_t);

Dieser Funktion kann ja egal sein, was für Daten Du kopieren willst, 
daher die Void-Pointer.

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

dunno.. schrieb:
> man kann ja durchaus void - pointer definieren, um z.b. in anderen files
> keinen (wirklichen) zugriff auf die vom pointer referenzierten daten zu
> bekommen - quasi datenkapselung...

Der einzige, der die Kommentare in queue.c gelesen hat :-)

Die Frage ware ja nicht, warum überhaupt Pointer auf void verwendet 
wurden, sondern warum der selbe Typ in der einen Datei so und in der 
anderen anders definiert wurde.
1
/*
2
 * Inside this file xQueueHandle is a pointer to a xQUEUE structure.
3
 * To keep the definition private the API header file defines it as a
4
 * pointer to void.
5
 */
6
typedef xQUEUE * xQueueHandle;

(FreeRTOS 6.1.0)

Gruß
Marcus

von dunno.. (Gast)


Lesenswert?

Marcus Harnisch schrieb:
> dunno.. schrieb:
>> man kann ja durchaus void - pointer definieren, um z.b. in anderen files
>> keinen (wirklichen) zugriff auf die vom pointer referenzierten daten zu
>> bekommen - quasi datenkapselung...
>
> Der einzige, der die Kommentare in queue.c gelesen hat :-)


hab die kommentare nicht gelesen, ich habs so gelernt.. ;)

das ist halt objektorientiertes programmieren, ohne c++ oder klassen zu 
bemühen.. macht ja durchaus sinn, dem anwender nicht alles offen zu 
legen, damit er nicht alles kaputtpfuschen kann...

soweit ich das gelernt habe, (vorallem im bezug auf 
echtzeit-betriebssysteme, die eben nur in C geschrieben sind) gängige 
praxis.

von Peter (Gast)


Lesenswert?

Herr Marcus Harnisch, auch ich habe diesen Kommentar gelesen und 
trotzdem hier gefragt.

Meine Persönliche Meinung ist halt das so was unsauber ist.
Bei memcpy ist ein Void Pointer verständlich aber innerhalb eines RTOS 
sollte so was nicht drin sein. Ich habe nichts gegen privat gehaltene 
Funktionen / Daten aber dann sollte man das sauber machen. Z.B. 2 
Funktionen machen einmal mit Daten und einmal mit Void Pointer.
Dann wird sich auch nie ein LINT oder anderes Tool beschweren.

Ich bin über diese Stelle auch nur gestolpert weil ich ca. 30 
Fehlermeldungen bekommen hatte und in meinen Kopf diese unsaubere 
Programmierung einfach nicht rein will.

VG, Peter

von Bernhard S. (berns)


Lesenswert?

Peter schrieb:
> Ich habe nichts gegen privat gehaltene
> Funktionen / Daten aber dann sollte man das sauber machen. Z.B. 2
> Funktionen machen einmal mit Daten und einmal mit Void Pointer.
> Dann wird sich auch nie ein LINT oder anderes Tool beschweren.

Peter schrieb:
> Ich bin über diese Stelle auch nur gestolpert weil ich ca. 30
> Fehlermeldungen bekommen hatte und in meinen Kopf diese unsaubere
> Programmierung einfach nicht rein will.

C ist eine mächtige Sprache mit wenig Overhead, die viel Verantwortung 
dem Entwickler überträgt. Wem das zu viel ist, der kann ja gerne 
Richtung C# (.Net Micro)/Java (Nano VM, u.ä.) gehen - da ist alles 
"sicherer" ;).
Fehlerfreier wird Soft-/Firmware dadurch ja nicht - siehe das ganze Zeug 
das da so rumschwirrt.

Grundsätzlich sind LINT & Co nur Tools, die mögliche Schwachstellen 
aufzeigen sollen. Eine mögliche Schwachstelle oder Unschönheit ist 
aber noch lange keine. Die Interpretation ist wieder die Sache 
desjenigen der das Tool anwendet.

Peter schrieb:
> Ansonsten verstehe ich nicht wieso man einen solchen Schrott in einem
> sonst so guten RTOS rein macht.
> Ich würde als mein Chef jeden Angestellten (Kollegen) der mir so etwas
> abliefert raus werfen. Alleine schon um alle Anderen zum vernünftigen
> Programmieren an zuleiten.

Du würdest auch jemand rauswerfen der Goto's verwendet oder? Alle 
derartigen Konstrukte haben ihre Berechtigung - Programmieren muss man 
eben können und lernen dazu gehören auch solche Konstrukte. Berechtigung 
hat jedes - für wohl überlegte Zwecke.

FreeRTOS wird durch den void* ja nicht unsicherer. Intern wird der 
richtige Typ verwendet und das API "versteckt" den echten Typ. Klare 
Schnittstelle, nichts dubioses.

von Peter (Gast)


Lesenswert?

Wer bei uns ein Goto einbaut darf eine 20 Seiten Ausarbeitung schreiben, 
warum er das nicht anders lösen konnte oder gleich seine Papiere holen.
Ein anderer Kollege darf das dann wieder raus holen.

LINT & Co sind sehr gute Tools die helfen die Codequalität zu 
verbessern.
Auch die MISRA Regeln und  die entsprechenden Tools wurden ja nicht zum 
Spaß entwickelt.
Es hilft nur nichts wenn man gezwungen ist Code zuschreiben der durch 
diese Tools kommt ohne eine Warnung und dann immer wieder auf Code 
stößt, der zwar von Tausenden Personen benutzt wird, aber nicht durch 
diese Tools kommt.

Da wird man halt etwas nervös bei Sachen die zwar gehen, aber halt 
Warnungen Produzieren.

von Björn C. (bjoernc) Benutzerseite


Lesenswert?

Peter schrieb:
> Es hilft nur nichts wenn man gezwungen ist Code zuschreiben der durch
> diese Tools kommt ohne eine Warnung und dann immer wieder auf Code
> stößt, der zwar von Tausenden Personen benutzt wird, aber nicht durch
> diese Tools kommt.

Ja es zwingt dich aber keiner, FreeRTOS zu benutzen. Genauso wenig sind 
die Entwickler daran gebunden, sich an die Standards deiner Firma zu 
halten. Wenn ihr diese Auflage habt dann kauft euch ein RTOS, das diesen 
Standards genügt. Wo ist da das Problem?

von Bernhard S. (berns)


Lesenswert?

OMG. In der Zwischenzeit wurden Wirth und Dijkstra für Ihre 
(abwertenden) Äußerungen über Goto's schon ... lassen wir das.

Mir wurde gelernt goto's nicht zu verwenden -> 7-stufiges nesting lässt 
sich ja auch leichter lesen und nachvollziehen als goto :)
Ein kompetenter Programmierer*) kann die verschiedenen Techniken nach 
Bedarf einsetzen.
Btw. ich verwende goto sehr selten - meist in C Code der über Locking 
und I/O verfügt (also alle 1-2 Jahre 1x). Das Fehlerhandling kann 
sonst sehr unschön/unlesbar/komplex werden.

Peter schrieb:
> Es hilft nur nichts wenn man gezwungen ist Code zuschreiben der durch
> diese Tools kommt ohne eine Warnung und dann immer wieder auf Code
> stößt, der zwar von Tausenden Personen benutzt wird, aber nicht durch
> diese Tools kommt.

Wer zwingt dich dazu?! - Normalerweise muss man erklären können warum 
der Code so ist und warum das in diesem Fall akzeptabel ist - danach 
landet das im entsprechenden Dokument und die Sache ist erledigt.

In meinen Augen ist LINT & Co sowas wie ein Messgerät für Codequalität 
und damit gilt das selbe wie für alle Messgeräte: Wer misst, misst Mist.
Ich bin ein Freund von Code-Reviews bei kritischen Applikationen/Code 
Teilen - das deckt auch Fehler in "lt. LINT unbedenklichem Code" auf. 
Der Reviewer sollte dabei natürlich nicht am selben Code arbeiten und 
entsprechend kompetent sein.

Jetzt mal ehrlich: Wenn es nicht Free RTOS wäre, sondern ein closed 
source Produkt, würdest du nicht mal wissen, dass das im Code passiert 
und es würde nichts an der Funktionalität ändern.

*) das ist das Problem: Kompetenz - das setzt viel Erfahrung und Bildung 
voraus... Bei Neulingen oder Script Kiddies ists besser LINT und heftige 
Guidelines einzusetzen - da könnens immer noch genug "falsch" machen ...

von Peter (Gast)


Lesenswert?

Da sind halt die Vorgaben in der Firma so und über den Sinn könnten wir 
hier jahrelang Diskutieren.
Die wollen das so und gut ist.
Jeder der da arbeitet (ich nun >20 Jahre) weiß das und hält sich dran.

Ein gekauftes OS wird aber immer mit Sourcecode geliefert/gekauft und 
wenn es nicht gefällt geht es zurück. Firmen Politik!
Die Compiler werden übrigens auch mehrfach getestet!
Erstrecht das fertige Produkt (bei jedem Update ein Volltest).


Da das ARM Projekt mit dem FreeRtos ein privates Projekt ist, bin ich 
nicht an diese ganzen Vorgaben gebunden.
Aber ich verwende halt die Tools in der Firma auch mal gerne bei den 
privaten Daten. Da kommen dann ganz schnell mal Fehler zutage die man 
ohne diese Tools noch nicht bemerkt hat und Tage lang suchen würde um 
die dann zu finden.
Auch egal ob man SVN, CVS, .... benutzt, was ich jedem empfehlen würde, 
gibt es beim Start eines Projektes halt leider noch keine Historie.
Und somit auch hier keine Hilfe bei Fehlern.
Darum will ich halt sehen das ich nicht schon mit Fehlern starten.

Ich habe inzwischen mir das im Debugger angesehen und an den komischen 
Stellen im FreeRtos scheint alles zulaufen.
Wäre halt nur schön wenn die ganzen Tools keine Fehler darin vermuten 
würden.

von Bernhard S. (berns)


Lesenswert?

Peter schrieb:
> Da sind halt die Vorgaben in der Firma so und über den Sinn könnten wir
> hier jahrelang Diskutieren.

Der Grund warum ich mich bei diesem Thema meist ärgere ist die 
Delegation von Verantwortung an Programme (die von Menschen geschrieben 
wurden und daher per Definition fehlerbehaftet sind), ... - lassen wir 
das.

Peter schrieb:
> Da kommen dann ganz schnell mal Fehler zutage die man
> ohne diese Tools noch nicht bemerkt hat und Tage lang suchen würde um
> die dann zu finden.

Zum Glück :) - Ich bin kein Gegner dieser Tools, sondern hab nur ein 
Problem damit, wenn deren Output als "Gesetz" betrachtet wird. Denn 
diese Tools sind dazu da in den meisten Fällen zu helfen, sie können das 
aber nicht immer.

Peter schrieb:
> Wäre halt nur schön wenn die ganzen Tools keine Fehler darin vermuten
> würden.

Auch dabei gebe ich dir recht :). Schön heißt aber nicht, dass etwas 
derzeit "unsauber", "schlampig", ... ist. Auch der IST-Zustand kann 
schöner sein - "beauty is in the eye of the beholder".

von Peter (Gast)


Lesenswert?

Da sind wir uns ja fast einig.

Das Lint und co genauso wie Compiler Fehler haben können, wird ja leider 
immer wieder mal bestätigt. Ist meistens aber mehr bei den Compilern so.
Das ist dann leider immer das schlimmste was passieren kann.
Aber dafür gibt es dann entsprechend strenge Tests vom Produkt.

Wenn ein Codechecker was meldet muss man sich so oder so die Stelle 
ansehen und da merkt man dann schon, ob das Tool einen Fehler hat. Nicht 
gefunden Fehler bemerkt man natürlich so nicht. Aber dafür setzt man 
halt mehrere Tools auf den Code an.

Wenn man Jahrelang mit solchen Tools arbeitet merkt man aber schon das 
es der Fehlerrate der Produkte erheblich reduziert. Und somit 
unterstreichen sie das vorgehen der Firma (meinem Geldgeber).


Was FreeRtos angeht, es läuft und ich verwende es jetzt einfach.
Das es bessere gibt ist klar, aber die kosten dann halt auch einiges.
Oder es sind freie die nicht portiert sind bzw nicht den Umfang haben 
und somit wegfallen.
Auch der GCC ist dem Keil oder IAR unterlegen, aber ist auch wieder ein 
erheblicher Kostenunterschied.
Für privat zum spielen reicht mir FreeRtos und GCC.
Auch wenn ich damit regelmäßig einen Anfall bekomme, weil es nicht 
gleich funktioniert und ich erst Stunden suchen muss um das Problem zu 
lösen.

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.