Forum: Mikrocontroller und Digitale Elektronik Programmieren mit/ohne vordefinierten Funktionen


von Mischa T. (misha_p)


Lesenswert?

Hallo liebe Profis,

bin beim Einstieg in die µC-Welt und gehe gerade die Theorie und einige 
Toutorials der Praxis durch. Ich entwickele mit dem STM8S und einem 
Steckboard.

Als erstes habe ich gemerkt, dass der µC gleich viele vordefinierte 
Funktionen mit sich in der FWLib trägt. Diese Funktionen, wie z.B.

// Reset ("de-initialise") GPIO port D.
GPIO_DeInit(GPIOD);
// Initialise pin 0 of port D.
GPIO_Init(GPIOD, GPIO_PIN_0, GPIO_MODE_OUT_PP_LOW_FAST);

lassen sich einfach ansprechen... jetzt meine Fragen:

 1. Ist es üblich in der Industrie, dass µC solche Blöcke von Funktionen 
mit sich tragen ?
 2. Kann man auf die Stabilität und efizienz von diesen Fnkt. vertrauen 
(sind die Platzsparend genung)?
 3. Wie programmiert Ihr normaleweise - mit diesen mitgelieferten, 
vordefinierten Funkt. oder schreibt Ihr eigene?

Danke vielmals im Voraus

Grüsse - Mischa

von Tobias Hagemeier (Gast)


Lesenswert?

Hallo Mischa,

nein, das ist nicht üblich - und auch hier nicht der Fall. Wenn du einen 
C-Quelltext schreibst wird der ja auch erst in Assembler übersetzt und 
dann irgendwann als Maschinencode auf den µC geladen.
Was du hier benutzt (davon gehe ich einfach mal aus, ist üblicherweise 
so) sind Makros die in irgendeiner externen Datei definiert sind. Diese 
Makros werden üblicherweise groß geschrieben. Sie werden noch bevor der 
Quelltext überhaupt kompiliert wird vom Präprozessor durch andere 
Programmfragmente ersetzt - eben anhand der Definition der Makros in 
irgendeiner externen Datei, die du in deinen Quelltext über #include 
o.ä. einbinden musst.
Aus deinem Beispiel

GPIO_DeInit(GPIOD);

wird dann z.B.

GPIOD &= 0xFE;
GPIOD |= 0x10;

Es werden also einfache Ersetzungen vorgenommen, wobei du Parameter (in 
den Klammern angegeben) benutzen kannst. Das Makro könnte dann also 
irgendwo so definiert sein:

#define GPIO_DeInit(x) x &= 0xFE; x |= 0x10

Dabei wird dann jetzt einfach jedes Vorkommen von x durch GPIOD ersetzt.
Das ganze ist dann nicht mehr oder weniger performant als wenn du den 
gleichen Quelltext selber hin geschrieben hättest. Beides wird 
irgendwann in das gleiche Ergebnis übersetzt. Um das rauszufinden kannst 
du dir das Makro ansehen; das zu finden ist aber manchmal garnicht so 
einfach, da durch ein einziges #include auch mal gerne ein paar mehr 
Dateien eingebunden werden können (nämlich dann, wenn die eingebundene 
Datei selbst wieder Dateien mit #include nachlädt..).
Der µC kann typischerweise solch spezialisierte Befehle wie 
"initialisiere Port" oder so garnicht. Guck einfach mal ins Datenblatt 
;)


Gruß,
Tobi

von Mischa T. (misha_p)


Lesenswert?

vielen Dank für die ausführliche Antwort - habe mittlerweile die vordef. 
Funktionen gefunden und verstanden - Danke nochmal

Grüsse - Mischa

von Bernhard B. (schluchti)


Lesenswert?

Das Problem mit der mitgelieferten Library von STM ist meines Erachtens, 
dass man teilweise den Bezug zur Hardware verliert. Prinzipiell wäre das 
ja noch kein Problem, so lange die Bibliothek das tut was du willst. 
Wenn aber mal etwas nicht so funktioniert, wie gewünscht dann musst du 
sowieso auf Register Ebene runter. Ich für meinen Teil bin daher gerade 
dabei die Library von STM zu zerlegen und mir wichtige Hardware Module 
(SPI, PWM, Timer, RTC..) selbst auszuprogrammieren. Dauert zwar um 
einiges länger, aber man weiß dann wenigstens ungefähr mit welchen 
Registern man welche Einstellungen ändern kann.

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.