Forum: Mikrocontroller und Digitale Elektronik Allgemeine Mikrocontroller Fragen (8051er) / Programmierung in C


von Felix W. (fele06)


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

von Max H. (hartl192)


Lesenswert?

Felix Wloka schrieb:
> Was meint man wenn man von einem 8 oder 16 Bit Mikrocontroller spricht ?
> Den Adressbus ?
Die breite des Datenbuses

: Bearbeitet durch User
von Felix W. (fele06)


Lesenswert?

Ja ok das macht Sinn.

Danke

von Fragen über Fragen;-) (Gast)


Lesenswert?

Max H. schrieb:
> Die breite des Datenbuses

Den internen oder den externen? Oder ist es doch eher die Breite der 
ALU?

von Max H. (hartl192)


Lesenswert?

Fragen über Fragen;-) schrieb:
> Den internen oder den externen?
In der Regel der interne.

von Georg G. (df2au)


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.

von Felix W. (fele06)


Lesenswert?

Vielen Dank für eure Antworten.

Kann mir jemand erklären was externe Funktionen sind und wie diese 
eingebunden werden ?

von Georg G. (df2au)


Lesenswert?

Felix Wlo schrieb:
> externe Funktionen

Such mal nach "compiler header files". Da findest du vieles zu diesem 
Thema. Ein gutes Buch über die Grundlagen der Programmierung hilft auch. 
Hier für das Forum ist das zu lang.

von Bernhard S. (b_spitzer)


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

von Hans (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.