Allgemeine Mikrocontroller Fragen (8051er) / Programmierung in C

OP #4139661
Lesenswert?

Hallo Leute,

ich habe schon einige Beiträge gelesen und bin mir sicher, dass ihr mir 
helfen könnt.

Programmierung in C:

Wie unterscheiden sich
unsigned char bit@0x00;
unsigned char pbit@0x00;
unsigned char sbit@0x00;

(Bitte vernachlässigt die Adressierung)

Werden externe Funktionen nicht über Bibliotheken eingebunden ?


Was meint man wenn man von einem 8 oder 16 Bit Mikrocontroller spricht ?
Den Adressbus ?


Ich Danke euch vielmals
#4139696
Lesenswert?

Felix Wlo schrieb:
> unsigned char bit@0x00;
> unsigned char pbit@0x00;
> unsigned char sbit@0x00;

Du definierst in jedem Fall eine Variable vom Typ unsigned char. Die 
drei Definitionen unterschieden sich nur im Namen der Variablen.

Sollte es dir bei der Frage um adressierbare Bits gegangen sein, dann 
lies bitte 
http://www.keil.com/support/man/docs/c51/c51_le_bitaddrobj.htm

Zu 8/16 Bit:
Wenn die Breite der ALU ausschlaggebend wäre, wäre der Z80 eine 4 Bit 
Maschine.
Wäre es die Breite des (externen) Datenbusses, wäre der 8088 eine 8 Bit 
Maschine.
Es ist also etwas komplexer. Als Kompromiss vielleicht: Die Breite der 
Standard Register ist maßgebend.
#4163693
Lesenswert?

Funktionen können im Projekt an mehreren Stellen stehen.
- in der selben Datei wie die main()-Funktion
- in einer weiteren .C-Datei im selben Verzeichnis
- in einer weiteren .C-Datei in einem anderen Verzeichnis
- in einer vorcompilierten Bibliothek

Einfachster Fall für Anfänger:
- die Funktion steht in der selben Datei vor der main()-Funktion
  dann kennt der Compiler die Argumente und den Typ des Rückgabewertes,
  wenn die Funktion dann z.B. in main() aufgerufen wird

- die Funktion steht in der selben Datei nach der main()-Funktion
  dann meckert der Compiler und man braucht oben einen 
Funktionsprototyp.
  Wenn es zu viele Prototylen werden, kann man die auch in eine .h-Datei
  auslagern.

- die Funktion steht in einer weiteren .C-Datei
  Funktionsprototyp notwendig und damit der Compiler nicht verzweifelt 
in
  der Hauptdatei sucht, steht 'extern' davor.
  Meist hat man bei eigenen Funktionssammlungen eine .C und eine 
.h-Datei.
  Wenn die Dateien in einem anderen Pfad stehen, dann kann man den bei
  der #include-Zeile mit angeben:
1
#include <tolle_funktionen.h> // sucht die h-Datei im Such-Pfad 
2
#include "./lib/wichtige_funktionen.h" // in Unterverzeichnis lib ist die Datei
Gast #4163733
Lesenswert?

Bernhard Spitzer schrieb:
> - die Funktion steht in einer weiteren .C-Datei
>   Funktionsprototyp notwendig und damit der Compiler nicht verzweifelt
>   in der Hauptdatei sucht, steht 'extern' davor.

Das "extern" hat nichts damit zu tun, in welcher Datei etwas definiert 
ist, sondern es dient dazu, eine Definition und eine Deklaration zu 
unterscheiden.

Eine Deklaration sagt dem Compiler "Es gibt irgendwo ein Objekt eines 
bestimmten Typs mit einem bestimmten Namen".
Eine Definition sagt dagegen "Lege ein Objekt eines bestimmten Typs mit 
diesem Namen im Speicher an".

Beispiel:
1
extern int i; // Deklaration: Es gibt irgendwo eine Variable i vom Typ int
2
int k;        // Definition: Lege eine Variable k vom Typ int im Speicher an

Eine Definition ist automatisch auch eine Deklaration, umgekehrt gilt 
das nicht. Damit man im Code eine Variable verwenden kann, muss der 
Compiler vorher eine passende Deklaration sehen. In welcher Datei und an 
welcher Stelle die Variable definiert wird, spielt keine Rolle.

Das gleiche gilt für Funktionen: Bevor man sie verwendet, muss* der 
Compiler eine Deklaration sehen. Definiert werden darf sie in einer 
beliebigen Datei.

Im Gegensatz zu Variablen kann der Compiler eine Funktionsdeklaration 
und -definition auch ohne "extern" unterscheiden: Wenn ein 
Funktionsrumpf (geschweifte Klammern) dahinter steht, ist es eine 
Definition, ansonsten eine Deklaration. Man darf das "extern" trotzdem 
dazu schreiben, es ändert aber nicht die Bedeutung.

Beispiel:
1
// Deklaration: Es gibt irgendwo eine Funktion mit Namen f,
2
// die keinen Parameter nimmt und einen Wert vom Typ int zurückgibt
3
int f(void);
4

5
// Deklaration: Identische Bedeutung
6
extern int f(void);
7

8
// Definition: Lege diese Funktion mit Namen g im Programmspeicher an
9
int g(void) 
10
{
11
  return 5;
12
}

* Genau genommen kann man aus historischen Gründen in C eine Funktion 
auch ohne vorherige Deklaration aufrufen, allerdings oft mit 
unerwünschten Effekten. Der Compiler wird davor normalerweise zu Recht 
warnen.

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