globalen Variablen unter Keil C51

OP #5929641
Lesenswert?

Ich arbeite gerne mit einem global.h was alle globalen Variablen des 
Projekts enthält, hauptsächlich weil ich die nur zentral in einem Platz 
deklarieren will. Wie gesagt es geht um globale Variablen die in 
mehreren Modulen sichtbar sein müssen. Das Problem ist, dass at nicht 
bei extern Deklarationen erlaubt ist.
Ich habe mir deshalb ein Macro geschrieben um mit extern und at 
umzugehen.

Ein gekürztes Beispiel:
1
#ifdef GLOBAL_EXTERN       
2
  #define EXTERN          // remove EXTERN
3
  #define _AT_ _at_       // replace with _at_
4
#else                     
5
  #define EXTERN extern   // replace with extern 
6
  #define _AT_ ;/ ## /    // replace _AT_  with ';//' 
7
#endif
8
...
9
EXTERN uint8_t xdata Buffer0 [64] _AT_ 0x0000; 
10
EXTERN uint8_t xdata Buffer1 [64] _AT_ 0x0040; 
11
...
In genau einem File wird dann GLOBAL_EXTERN definiert. Bei mir ist das 
meist das Modul welches Main enthält.
1
#define GLOBAL_EXTERN
2
#include "global.h"
3
....
Das funktioniert soweit auch wir gewünscht. Ich habe allerdings das 
Gefühl das man das auch anders (besser?) machen könnte.
Was meint ihr dazu? Wie macht ihr solche Sachen?

Thomas
Gast #5929646
Lesenswert?

Thomas Z. schrieb:
1
#define _AT_ _at_       // replace with _at_

Bezeichner die mit Unterstrich + Großbuchstabe oder 2 Unterstrichen 
beginnen sind reserviert und der Standard-Bibliothek bzw. 
Compiler-Erweiterungen vorenthalten. Allerdings ist es kurios dass 
"_at_" eine C51-Erweiterung ist, denn laut Standard-C muss der 
Bezeichner "_at_" zur freien Verwendung zur Verfügung stehen!
Gast #5929675
Lesenswert?

Thomas Z. schrieb:
> Das war aber nicht die Frage.

Ich hatte das Gefühl dass allgemein nach Verbesserungsmöglichkeiten 
gefragt war.

Ich würde nicht so viele globale Variablen verwenden, dass so etwas 
nötig ist. Dinge in structs verpacken und Zeiger darauf übergeben 
verbessert die Programmstruktur. Im Idealfall hat man in der main.c eine 
Hand voll globaler struct-Variablen, auf die man Zeiger an die 
jeweiligen Funktionen übergibt. So kann man zentral den Programm-Aufbau 
sehen und modifizieren.
OP #5929724
Lesenswert?

zum ersten mal gesehen hab ich das bei Cypress / Anchorchips die eine 
ganze Menge SFRs im xdata Bereich haben. Das Konstrukt hab ich dort 
geklaut.
Generell geb ich dir mit den Pointern recht. Wobei (generic) Pointer auf 
einem x51 teuer sind. Der c166 compiler von keil verwendet ebenfalls 
at. Wie das beim ARM Compiler ist kann ich nicht sagen den hab ich 
nicht.

Thomas
Gast #5931748
Lesenswert?

1
#define _AT_ ;/ ## /

Finde ich nicht so prickelnd. Ist eine super Stolperfalle, wenn mal nach 
dem At noch was Wichtiges kommt. Da sucht man sich dumm und dusselig.

Auch wenn Du Alles umschreiben musst, wäre es besser zu schreiben
1
#define AT(H) _at_ (H)
2
#else
3
#define AT(H)
Gast #5931835
Lesenswert?

Thomas Z. schrieb:
> #define AT ;/ ## /    // replace AT  with ';//'

Ein Compiler der das zulässt ist ohnehin nicht Standardkonform und 
sollte vermieden werden. Erstens gehört / nicht zu den Zeichen, die man 
mit ## an irgendwas anheften darf, und zweitens müssen Kommentare schon 
vor der Makroauswertung mit leerzeichen ersetzt werden, korrekterweise 
müsste ein Compiler wenn in der phase trotzdem noch ein // da ist also 
einen syntaxfehler werfen.
OP #5935737
Lesenswert?

Erst mal danke für eure Meinungen. Ich war leider zu sehr im Stress um 
früher zu antworten.
Ich hätte ja schon befürchtet dass ihr alle auf at anspringt. Das ist 
aber gar nicht der hauptsächliche Grund für mein Konstrukt. Das ist eher 
Keil spezifisch und somit auch in keiner Weise portable.
Die eigentliche Frage war eher Deklaration vs Definition in einem File. 
Das hätte ich genauer beschreiben sollen.

Thomas
#5978614
Lesenswert?

Dr. Sommer schrieb:
> […]Allerdings ist es kurios dass
> "_at_" eine C51-Erweiterung ist, denn laut Standard-C muss der
> Bezeichner "_at_" zur freien Verwendung zur Verfügung stehen!

Bei µC gibt es einige Compiler (z.B. Keil und Raisonance), die es mit 
dem Standard nicht so genau nehmen, von daher überrascht mich das nicht.
Bei SDCC war das bis vor 15 Jahren (SDCC 2.5.0) ähnlich.
Gast #5978619
Lesenswert?

Philipp Klaus K. schrieb:
> Bei µC gibt es einige Compiler (z.B. Keil und Raisonance), die es mit
> dem Standard nicht so genau nehmen, von daher überrascht mich das nicht.

Das stimmt wohl. Aber bei so etwas einfachem wie Benennung von 
Spezial-Schlüsselwörtern wäre das ja einfach korrekt zu machen... 
Vielleicht kann man die strikte Standard-Konformität ja einschalten?
OP #5981837
Lesenswert?

Philipp Klaus K. schrieb:
> Bei µC gibt es einige Compiler (z.B. Keil und Raisonance), die es mit
> dem Standard nicht so genau nehmen, von daher überrascht mich das nicht.
> Bei SDCC war das bis vor 15 Jahren (SDCC 2.5.0) ähnlich.

mir ist es ehrlich gesagt wichtiger effektiven Code zu erhalten. Ob sich 
der Compiler an die akademischen Standards hält ist zwar wünschenswert 
aber nicht alles.
Gerade der SDCC ist noch verbesserungswürdig in Bezug auf die Codegröße.
Keil und Raisonance haben die gleichen Wurzeln.

Thomas

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