ein Paar dumme Fragen zur eingebetteten C Programmierung

Gast #249541
Lesenswert?

Hi,

Ich habe ein Paar Code gelesen. Da ich nur beim PC programmiert habe,
fällt mir schwer, solche Dinge zu verstehen.

1, pragma (z.B. #pragma combine fc=A0x0C10000)
  steht nicht in meinem C-Buch!

2, _far (z.B. volatile const _far int MQMAXN[2]={0x3c00,0x3C00};)
  hat das mit der Speicherzuweisung zu tun?

3, uword, uint32
  ich kann die gut verstehen, aber sind sie vom C-Standard?

4, huge (z.B. huge unsigned char *p1 = (huge unsigned char
*)CALROM_ADDR;)
  steht nicht in meinem C-Buch!

Soweit ich weiß gibt es keine eigentliche Unterschiede zw. ANSI C und
embedded C. Bitte nicht lachen!

Viele Grüße
Meyer
Gast #249542
Lesenswert?

#pragma ist eine compilerspezifische Erweiterung. Die steht daher aus
guten Gründen nicht im C-Buch, sondern in der Dokumentation des
jeweiligen C-Compilers, dem es ungenommen ist, das auf seine frei
individuelle Weise zu interpretieren.

_far ist ein "storage class specifier", der von
Microsoft/Borland/Intel zur Programmierung der segmentierten
Speicherverwaltung der x86-Prozessoren eingeführt wurde und besagt, daß
ein Pointer nicht nur aus dem Offset, sondern auch aus einer
Segmentadresse besteht.

uword, uint32 sind nicht Bestandteil von C89. Es kann aber sein, daß
vergleichbare Typen (uint8_t, uint32_t) als Bestandteil von C99
standardisiert sind. Da ich keinen C99-Compiler verwende, kann ich die
definitive Antwort nur den geneigten Kollegen überlassen, die sich
damit besser auskennen.

huge ist im Prinzip dasselbe wie far, nur wird hierfür zusätzlicher
Code erzeugt, der den Offsetanteil normiert, also auf Zahlenraum 0..F
beschränkt.

Also:
far/huge treten nur auf x86-Prozessoren auf.
#pragma ist jeweils ganz besonders compilerspezifisch und im Handbuch
nachzusehen.

Auf was für einem Prozessor/Controller möchtest Du mit welchem Compiler
arbeiten?
Gast #249543
Lesenswert?

>Es kann aber sein, daß vergleichbare Typen (uint8_t, uint32_t) als
>Bestandteil von C99 standardisiert sind.

Sind sie in der Tat. In der Headerdatei stdint.h wird man fündig.

>Da ich keinen C99-Compiler verwende

Benutzt Du nicht gcc?
Gast #249544
Lesenswert?

@Rufus T. Firefly
Kannst du ja nicht wissen, aber der Keil-C Compiler
kennt für die C16x-Prozessoren das "huge" (Also nicht nur x86).
Damit ist es dann möglich per Arrayzugriff oder Zeigeroperation
mehr als 10000h Bytes zuzugreifen.

Mann kann nicht alles wissen ... :-)

Gruss
Gast #249545
Lesenswert?

... mit den Biestern habe ich mich glücklicherweise noch nie
herumschlagen müssen und also hab' ich auch verdrängt, daß auch die
über diese Hauterkrankung namens Segmentitis verfügen. Yuck!

(Ich bin erkennbar Freund linear adressierbaren Speichers)
Gast #249548
Lesenswert?

@Gerhard Gunzelmann
Wie bitte ??? Wo hast du den Sch*ß her ?
Zeig mir bitte einen 286 der
- Registerbänke kann
- 16 Register (16Bit)
- Bit-Adressierbaren Speicher
- internes RAM
- einen Befehl innerhalbn EINES Taktes ausführt.

Das glaube ich ohne Quellenangabe NICHT !

Gruss
Gast #249549
Lesenswert?

mal eben ne kleine frage am rande.

wie sieht es eigentlich mit der ada unterstützung in den gcc`s aus?
im rahmen meiner ausbildung mußte ich in ada reinschnuppern. zu der
zeit habe ich es gehasst, da man sich echt wasserblasen beim
programmieren zugezogen hat (strenge typendefinierung), aber heute
misse ich genau diese des öfteren. (besonders dann, wenn man code von
dritten bekommt und erstmal nicht weiß, was der macht ;-) )

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