ein Paar dumme Fragen zur eingebetteten C Programmierung



  • 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



  • 1. ich war immer von ausgegangen, dass das ne Erfindung von M$ ist
    2. Ein Far-zugriff bedeutet, dass die Speicherstelle nicht im aktuellen Speichersegment ist. ein PC hat ja nunmal ursprünglich nur 16-BIT-Register und um auf mehr als 64KB zugreifen zu können hat man einfach gesagt, man Segmentiert den Speicher in 64KB-Teile und benutzt ein Register zum Angeben des Segments und eins zum Angeben der Adresse innerhalb des Segments. Das ist ein FAR-Zugriff
    3. nein
    4 das ist, wie der Name schon sagt ein großer unsigned char. hab ich auch grad nicht so den Plan, warum ein Char so viel Speicher braucht..

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

    Definiere embedded.. Auf was für ner Maschine läuft das denn? Ist ja nicht so, dass es da nur einen Controller gibt..
    Wenn ich beispielsweise PocketC sehe, was für Palmtops geschrieben wurde, dann gibts da tonnenweise Unterschiede..
    Was hast du eigentlich für nen C-Buch? Vielleicht solltest du dir einfach mal die Befehlsbeschreibung des Embedded C Compilers anschauen 😉



  • Meyer schrieb:

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

    Das ist eine Compileranweisung. Die ist nicht standardisiert, jeder Compiler interpretiert das anders, deshalb solltest du im entsprechenden Handbuch nachgucken was #pragma combine macht. In deinem C-Buch sollte aber in jedem Falle stehen, dass solche Anweisungen mit #pragma eingeleitet werden.

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

    Wie DocJunioR schon sagte, far bedeutet einen Zugriff in ein anderes Segment auf segmentierten Architekturen. Da es hier um ein Array und nicht um einen Zeiger geht, würde ich vermuten, dass der Compiler den Speicher dafür in einem anderen Segment alloziert.

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

    Huge ist ähnlich wie far, der Unterschied liegt AFAIK darin, dass bei Zeigerarithmetik bei far nur mit dem Offset-Anteil gerechnet wird, bei huge mit dem gesamten Wert, d.h. dass es Überträge in den Segment-Anteil gibt. Detailliert kann ich dir das jetzt nicht erklären, ist auch schon etwas her, dass ich damit mal zu tun hatte (DOS-Zeiten). Guck ins Compilerhandbuch. Da sollten Abweichungen zu ANSI-C auf jeden Fall dokumentiert sein.



  • Ich nutze CX167 und Tasking-C-Compiler. Im Handbuch von Tasking ist _huge zu sehen, also mit einem Unterstrich. Das sollte verschieden zu huge ohne Unterstrich, oder?

    MfG
    Meyer


Anmelden zum Antworten