C — Änderungen 8327 → 8328

Zeile 2: Zeile 2:
 
|Name = C
 
|Name = C
 
|Inlineassembler = Ja
 
|Inlineassembler = Ja
−
|Compiler = [[gcc]], icc, ...
+
|Compiler = [[GCC]], icc, ...
 
|Plattformen = Alle
 
|Plattformen = Alle
−
|Kernel = [[C-Kernel mit GRUB]]
+
|Kernel = [[:Kategorie:OS-Dev für Einsteiger | Tutorialserie OS-Dev für Einsteiger]]
 
|Homepage = [http://www.open-std.org/jtc1/sc22/wg14/ The C Standards Committee]
 
|Homepage = [http://www.open-std.org/jtc1/sc22/wg14/ The C Standards Committee]
 
}}  
 
}}  
Zeile 21: Zeile 21:
 
* <p>'''Inline-Assembler''': Assemblercode wird direkt in den C-Code eingebettet. Die konkrete Syntax dafür unterscheidet sich von Compiler zu Compiler, im Allgemeinen wird der Assemblercode durch das Schlüsselwort ''asm'' eingeleitet. Ein Vorteil dieser Methode ist, dass ein direkter Zugriff auch auf lokale C-Variablen möglich ist. Sie eignet sich daher für sehr kleine Codestücke besonders gut.</p><p>Siehe auch [[Inline-Assembler mit GCC]]</p>
 
* <p>'''Inline-Assembler''': Assemblercode wird direkt in den C-Code eingebettet. Die konkrete Syntax dafür unterscheidet sich von Compiler zu Compiler, im Allgemeinen wird der Assemblercode durch das Schlüsselwort ''asm'' eingeleitet. Ein Vorteil dieser Methode ist, dass ein direkter Zugriff auch auf lokale C-Variablen möglich ist. Sie eignet sich daher für sehr kleine Codestücke besonders gut.</p><p>Siehe auch [[Inline-Assembler mit GCC]]</p>
 
* '''Externe Assemblerdatei''': Der Assemblercode wird in eine eigene Datei ausgelagert und vom C-Code als eigenständige Funktion aufgerufen. Die Übergabe von Parametern und des Rückgabewerts wird im Artikel [[Aufrufkonventionen]] beschrieben.
 
* '''Externe Assemblerdatei''': Der Assemblercode wird in eine eigene Datei ausgelagert und vom C-Code als eigenständige Funktion aufgerufen. Die Übergabe von Parametern und des Rückgabewerts wird im Artikel [[Aufrufkonventionen]] beschrieben.
 +
 +
=== ''volatile'' ===
 +
''volatile'' ist ein ''type-qualifier'' in C. Falls ein Typ T ''volatile''-qualifiziert ist, dann bedeutet das, dass sich der Wert einer Variable vom Typ T durch Instruktionen, die außerhalb der momentanen Befehlssequenz stehen (z.B. in einem [[Interrupt]]handler), verändern kann. Dazu folgender Beispielcode:
 +
<c>
 +
// 1 falls next_char ein gültiges Zeichen enthält, 0 sonst
 +
int char_valid;
 +
 +
// Falls gültig, das zuletzt von der Tastatur gelesene Zeichen,
 +
char next_char;
 +
 +
// Wartet auf einen Tastendruck
 +
char get_char()
 +
{
 +
  // Auf den nächsten Tastendruck warten
 +
  while (char_valid == 0);
 +
 +
  char_valid = 0;
 +
  return next_char;
 +
}
 +
</c>
 +
Die Variable ''char_valid'' und ''next_char'' sollen außerdem in einem Interrupthandler entsprechend gesetzt werden. Bei dem obigen Code kann es nun sein, dass der Compiler "optimiert" hat, indem die while-Schleife wie folgt abgeändert wird:
 +
<c>
 +
if (char_valid == 0)
 +
  while (1); // Endlosschleife
 +
</c>
 +
Dies ist eine korrekte Optimierung da der Compiler bei ''char_valid'' - da es nicht ''volatile''-qualifiziert ist - annehmen darf, dass es nicht durch den Interrupthandler (oder irgendwelchen Code der nicht in get_char steht) verändert werden kann. Insofern reicht es aus einmal ''char_valid'' zu lesen. Mit dieser "Optimierung" liefert der Code natürlich nichtmehr das gewünschte Resultat. Um das zu korrigieren muss ''char_valid'' und ''next_char'' ''volatile''-qualifiziert werden.
 +
 +
Aus analogem Grund sollte auch auf [[Hardware Abstraction Layer#Memory-mapped I/O | Memory-mapped I/O]]-Bereich nur über Zeiger auf ''volatile''-qualifizierte Datentypen zugegriffen werden.
  
 
== Bekannte C-Compiler ==
 
== Bekannte C-Compiler ==
Zeile 34: Zeile 62:
 
* [http://www.c-howto.de/ C-Tutorial]
 
* [http://www.c-howto.de/ C-Tutorial]
 
* [http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1494.pdf Draft des nächsten C Standards (C1x)]
 
* [http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1494.pdf Draft des nächsten C Standards (C1x)]
 +
* [http://www.unix.org/single_unix_specification/ Single UNIX Specification] und [http://www.opengroup.org/onlinepubs/9699919799/ POSIX]: auf dem C-Standard aufbauende Spezifikationen für unixoide Betriebssysteme
  
 
[[Kategorie:Programmiersprache]]
 
[[Kategorie:Programmiersprache]]