PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Auslagern



noppf
31.05.2007, 21:56
Hallo,
kann man bei der Progammierung eines AVR Programmteile (Funktionen, Initialisirungen...) auslagern?
Bei Java kann man einfach Objektorientiert Programmieren und so das ganze Programm deutlich übersichtlicher machen. Ich weiß zwar das, dass auch mit C++ gehen soll, aber kann ich das auch auf µC anwenden?
Falls ja wüste ich gerne noch warum man nirgends Programmbeispiele in diese Richtung finded.
Falls nein wäre ich natürlich über Alternativen dankbar (evtl. mit eigenen headern?).
Danke für jede Hilfe

franzl
31.05.2007, 22:02
Hi,
ja das geht schon in C. Du kannst ja beliebig viele c und h Dateien erstellen und dann in deiner main aufrufen.
mfg franz

noppf
31.05.2007, 22:10
wie rufe ich eine andere .c Datei auf (einfach mit #include <name.c> geht das nicht)? Alles was ich über Dateien gefunden habe bezog sich auf das arbeiten am PC, also schreiben und lesen. Ich möchte aber das der Quellcode der sich in der entsprechenden Datei befinded an die Stelle geschrieben wird an der ich sie eingebunden habe. Ich benutze AVR Studio.
Geht das dann nur in main oder auch im oberen Teil des Programms?

franzl
01.06.2007, 08:28
Hallo,
ja genau du musst die Funktion oder was auch immer in die main mit #include einbinden dann sollts auch klappen. Musst aber drauf achent dass du bei den Funktionsvariablen externe Variablen benutzt.
mfg franz

askazo
01.06.2007, 08:42
Normalerweise sieht das ganze so aus:

main.c

#include <avr/io.h>
#include "init.h"

int main (void)
{
init_timer(); //includierte Funktion
//Weiter mit Hauptprogramm
}


init.c

void init_timer()
{
//Was auch immer Du hier machen möchtest
}


init.h


void init_timer(void); //Prototyp für die Funktion


Gruß,
askazo

noppf
04.06.2007, 14:32
Hey,
ich habe es wohl noch immer nicht verstanden.

Ich habe folgendes Testprogramm:

main.c:

#include <avr/io.h>
#include "incl.h"

int main (void)
{
DDRC |= (1<<PC0); //PortC 0 als Ausgang

while(1){
Modul();
}
}

incl.c:

void Modul (void){
PORTC = 0x01;
}

und incl.h:

void Modul(void);

Ich bekomme aber immer folgende Fehler:
../incl.c:2: error: 'PORTC' undeclared (first use in this function)
../incl.c:2: error: (Each undeclared identifier is reported only once
../incl.c:2: error: for each function it appears in.)
make: *** [incl.o] Error 1

Darf ich den Pin nicht im Modul auf eins setzen? Ich habe schon 3 Tutorials durchgelesen, es ffunzt aber noch immer nicht.
Ich bin für jeden Tipp dankbar.

p_mork
04.06.2007, 15:12
Hallo noppf,

Du musst auch in der incl.c die Datei <avr/io.h> includieren, Dort ist nämlich PORTC definiert. Am besten includierst Du auch die incl.h mit rein. Für Headers hat sich übrigens folgender Aufbau als günstig erwiesen:


#ifndef _HEADERNAME_H_
#define _HEADERNAME_H_

Deine defines und Prototypen

#endif


Durch die #ifndef..#define..#endif-Struktur werden Fehler verhindert, falls man aus Versehen die Datei mehr als einmal im selben Modul includiert.

MfG Mark

robocat
04.06.2007, 16:16
sehr "quick&dirty", sollte man auch nicht machen und entspricht auch keinem standard:

incl.c:

PORTC = 0x01;

dann in main.c an passender stelle ein #include"incl.c" rein. beim compilieren wird dann der inhalt von incl.c an der stelle eingefügt, was einem ein paar bytes spart, weil nichts auf den stack gepushed wird.

trotzdem nicht zu empfehlen! wollte es nur der vollständigkeit halber erwähnen. *kleinmachwegflitz*

gruesse

noppf
04.06.2007, 23:44
DANKE nun geht es :-) *freu*
Warum ist es nicht zu empfehlen? Was wäre denn die Alternative?

Ich würde nicht an jeder Stelle an der ich einen Pin setzen möchte ein #include "incl.c" einfügen sondern die Funktion Modul() aufrufen (natürlich etwas brauchbarer angepasst).

Sollte ich noch etwas ändern?

robocat
05.06.2007, 00:07
sobald du ein stück code auf diese weise öfter einbindest, wird dein programm auch dementsprechend grösser. man muss also abwägen, ob nicht eine funktion (die ja nur einmal im programm steht) besser geeignet ist, wenn der speicher knapp ist/wird.

ausserdem ist es, soweit ich weiss, nicht standardgemäss, es kann also bei einem anderen compiler schiefgehen (weiss ich aber selber nicht so ganz sicher - bisher hats immer geklappt).

auf jeden fall macht es den code schwerer lesbar, und die gefahr, dass sich irgendwann fehler einschleichen und man selbst nimmer durchblickt ist um einiges grösser als bei funktions-aufrufen.

guter stil ist es auf jeden fall auch nicht.. ^^
vielleicht kann jemand etwas genaueres dazu sagen.

gruesse von der katz

bluebrother
05.06.2007, 11:00
Warum ist es nicht zu empfehlen? Was wäre denn die Alternative?
Weil das nicht der Sinn von includes ist. C-Dateien werden nicht inkludiert. Punkt. (Ok, es gibt ein paar wenige Ausnahmen, aber im Allgemeinen ist das ein no-no. Es sei denn du weißt genau was du tust)

Wenn du aufteilst hast du mehrere Source-Dateien, die getrennt kompiliert werden. Anschließend werden die zusammen gelinkt und ergeben erst dann das vollständige Programm. Das bedeutet aber auch (weil jede Datei _einzeln_ kompiliert wird) dass incl.c und damit auch der Compiler wenn er incl.c kompiliert keine Ahnung hat was du in main.c einbindest. Jede Datei muss also soweit vollständig sein dass alles was du benötigst bekannt ist -- also muss du die Funktionen die du aufrufst über ein Header-File bekannt machen. Die Funktionen die du dann außerhalb verwenden willst machst du mit "extern" nach außen sichtbar. (Das Keyword extern ist nicht unbedingt notwendig, aber ich erspar mir hier die Details).

Ich empfehle mal den K&R zu lesen.

noppf
05.06.2007, 13:12
Kann man mit AVR Studio auch C++ Porgrammieren? Gibt es sonnst irgend eine "saubere" Möglichkeit das Programm für einen µC aufzuteilen (Objectorientiert, Module...)?
Für Java gibt es ja, meines Wissens nach, noch keine guten Möglichkeiten einen µC zu Programmieren, außer NanoVM, oder?

p_mork
05.06.2007, 16:06
Hallo noppf

mit AVR-Studio kann man kein C++ programmieren. Das geht nur mit WinAVR. Leider sind auch da nicht alle C++-Sprachmittel vorhanden(exceptions+new und delete gibts da nicht). Ein Programm in Module aufteilen geht mit AVR-Studio, Du musst einfach eine neue C-Datei erstellen und diese dann dem Projekt anfügen.

MfG Mark