Sprungtiefe verringern

Gast #2121796
Lesenswert?

Hi,

Ich weiß nicht, ob ich im richtigen Unterforum gepostet habe. Falls 
nicht, bitte entsprechend verschieben.

Jetzt zu meinem Anliegen. Ich habe aktuell ein komplexeres 
Firmware-Projekt, in dem ich einen Hardware-Abstraction-Layer 
implementiert habe. Dieser dient zum softwareseitigen Verknüpfen der 
einzelnen Module.
Der Code sieht, wie nachfolgend dargestellt, aus:
1
/*----------------------------------------------*/
2
/* modul_1.c
3
uint16_t func1(uint16_t param1, uint16_t param2)
4
{
5
   ...
6
}
7

8
uint16_t func2(uint16_t param1, uint16_t param2)
9
{
10
   ...
11
}
12
/*----------------------------------------------*/
13

14
/*----------------------------------------------*/
15
/* Abslayer.c
16
uint16_t layer_func1(uint16_t param1, uint16_t param2)
17
{
18
   return func1(param1, param2);
19
}
20

21
uint16_t layer_func2(uint16_t param1, uint16_t param2)
22
{
23
   return func2(param1, param2);
24
}
25
/*----------------------------------------------*/

Wie man erkennt, wird im Abstraktionslayer nur die eigentliche Funktion 
aus dem Hardwaremodul aufgerufen. Dies hat aber zur Folge, dass sich 
dadurch die Sprungtiefe erhöht und somit die Stackbelastung steigt.

Meine Frage ist, kann man dies "eleganter" lösen und somit die 
Sprungtiefe reduzieren? Die Hardwareabstraktionschicht möchte ich aber 
belassen.

Danke Nobbie
Moderator (Firma: Titel) Persönliche Seite #2121808
Lesenswert?

Nobbie schrieb:
> Die Hardwareabstraktionschicht möchte ich aber belassen.
Das ist das, was dein Nachfolger 10 Jahre später verfluchen und 
herausbasteln wird. Garantiert...
Und: du wirst dein Programm trotzdem nicht so abstrakt hinbekommen, dass 
du alle Hardwarebezüge gekapselt bekommst...

BTW:
> Ich habe aktuell ein komplexeres Firmware-Projekt, in dem ich einen
> Hardware-Abstraction-Layer implementiert habe.
Es kann nicht komplex sein, wenn du einen so kleinen Prozessor 
verwenden mußt, dass der Stack keinen Platz hat  ;-)
Gast #2121825
Lesenswert?

Hi,

genau das sind die Sprüche, die ich von Kollegen auch höre und dann 
schaue ich manchmal in deren Code und schlage die Hände über den Kopf 
zusammen (Übrigens sind das auch die, die dann zur Fehlersuche Hilfe 
benötigen und von Dingen wie atomare Zugriffe, usw... höchstens mal was 
gehört haben).
Ich möchte und werde hier jetzt aber keine Grundsatzdiskussion über die 
Sinnhaftigkeit meiner Struktur durchführen.

Nur soviel, durch die Abstraktionsschicht kann und konnte ich sehr 
einfach Softwaremodule austauschen (z.T. auch durch Softwaretestmodule).

@Lothar:
naja, komplex ist relativ, da gebe ich dir Recht ;-). Aber für meine 
Verhältnisse ist dieses Projekt schon komplexer (manch anderer würde 
sicherlich drüber lachen)

@Jan und Mike:
inline wird meines Wissens nach nicht von allen C-Compiler unterstützt 
(kommt eigentlich von C++, C99-Standard)
mit dem #define funktioniert das super.

Danke an alle
Nobbie
Gast #2121869
Lesenswert?

A. K. schrieb im Beitrag #2121831:
> Die Chancen stehe nicht schlecht, dass der Compiler aus dem
> Unterprogrammaufruf einen schlichten Sprungbefehl macht.

Wenn die Funktionen, wie oben gezeigt, über drei Sourcedateien verteilt 
sind, hat der Compiler keine Chance.


Plan B wären Funktionspointer:
1
uint16_t (*layer_func1)(uint16_t, uint16_t)= func1;

Das geht aber nur, wenn die Parameter bei Layer- und Modulfunktion 
identisch sind.

Oliver

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren