Verständnisproblem beim AVR GCC

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 25 11 2024  21:35:51      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte

Gehe zu Seite ( Vorherige Seite 1 | 2 )      


Autor
Verständnisproblem beim AVR GCC

    







BID = 751720

wulf

Schreibmaschine



Beiträge: 2246
Wohnort: Bozen
 

  


Hallo,
Sorry wegen der langen Pause, inzwischen hat das neue Semester angefangen und ich hatte bisher einiges an Stress.
Ich hab das jetzt mit volatile versucht und siehe da: es funktioniert.

Ich danke euch allen für eure Hilfe (und vor allem dir DonComi)

LG
Simon

_________________
Simon
IW3BWH

BID = 751727

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

 

  

Gerne.

Habe auch aktuell Klausuren (keine Scheinklausuren... ).


_________________

BID = 753079

wulf

Schreibmaschine



Beiträge: 2246
Wohnort: Bozen

Jetzt melde ich mich wieder mit einem Problem und der Titel von diesem Thread passt eh ganz gut.
Diesmal gehts darum, dass ich, der besseren Lesbarkeit willens, den Code gerne auf mehrere Dateien aufteilen möchte. Nur mein Standart C vorgehen hat da nicht wirklich was gebracht.
Ich habe die Makefile im Verdacht und auch schon etwaws recherchiert und experimentiert (z.B. unter SRC zusätzlich die beiden Dateien rs485_uart.h und .c angegeben. Dann hat er nicht emhr gemeldet dass er die Funktionen nicht kennt, sondern dass einige doppelt deklariert waren ... )

Leider komme ich nicht recht weiter, weil meine bisherige Logik versagt.

Hat jemand von euch eine Idee? Das Problem ist bestimmt sehr einfach zu lösen und ich sitz wieder mal aufm Schlauch

Im Anhang die Dateien.

LG
Simon


_________________
Simon
IW3BWH

BID = 753130

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

Hallo Simon,

normal ist folgendes:
Zusammengehöriger Programmcode kommt in eine C-Datei, Symbole, die nach Außen hin sichtbar sein sollen, kommen in einen C-Header, der die Definitionen Deklarationen enthält; Beispiel:

lcd.c:

static _lcd_write_byte(...);

void lcd_init(uint8_t arg)
{
...
}

lcd.h:

extern void lcd_init(uint8_t arg);

Den Namen des Argument kann man weglassen, es ist aber empfehlenswert, ihn anzugeben!

Alle Programmteile, die auf die Funktionen in lcd.c zugreifen möchten, binden nur den Header lcd.h ein, mehr nicht. C-Dateien, also Programmcode, bindet man niemals per include ein, auch wenn das häufig gemacht wird.


So, der nächste Schritt ist dann, dass aus allen C-Dateien Objektkode erzeugt wird, man erhält also zusätzlich eine lcd.o, die den ausführbaren Code aus lcd.c enthält. Man hat nun einen Haufen Objektdateien, die am Ende alle verlinkt werden, z.B. so:

avr-gcc $(OPT) -o main lcd.o main.o uart.o


So, was passiert aber, wenn sowohl lcd.c als auch main.c Funktionen aus der uart.c verwenden? Genau, beide binden den Header lcd.h ein. Dabei kann es aber dazu kommen, dass dieser Header wiederum andere Header einbindet, und dabei Header doppelt eingebunden werden.
Man behilft sich nun folgendermaßen:
Man prüft in jedem eigenen Header, ob ein bestimmtes Symbol (Präprozessorsymbol!) definiert ist, wenn ja, macht man einfach nichts, wenn nein, definiert man dieses Symbol und dann folgt der Headerinhalt. Beim nächsten Einbinden würde dann alles ignoriert werden.
Die gesamte C-Std macht das so und es wird auch so empfohlen; Beispiel:

Header uart.h

#if !defined(UART_H)
#define UART_H

#include <inttypes.h>

extern void uart_init(uint16_t bps);
extern void uart_putc(uint8_t ch);

...

#endif

Ende Header uart.h


Das war es schon

Im Makefile muss dann für jede Objektdatei ein Eintrag, z.B. für lcd.c:

lcd.o: lcd.c
<TAB> avr-gcc $(OPT) -c -o lcd.o lcd.c

-c gibt an, dass nur assembliert wird, kein Linken.

main.out: main.o lcd.o uart.o ...
<TAB> avr-gcc $(OPT) -o main.out main.o lcd.o uart.o


Je nach Projekt schleppt man auch mal fünf, 30 oder 200 Objektdateien herum und so nutzt man bestimmte Make-Regeln, wie folgende:

OBJ=lcd.o uart.o main.o vfd.o std.o

%.o: %c
<TAB> avr-gcc $(OPT) -o $@ $<

sprich: jede .o-Datei hängt von einer .c-Datei ab (Regel) und sie werden wie in der nächsten Zeile angegeben erzeugt, wobei $@ die Ausgabedatei ist (wird von make ersetzt) und $< der Platzhalter für die Eingabedatei ist.

Am Ende noch die Regel zum Erzeugen des Programms:

main.out: $(OBJ) # sprich: main.out hängt von allen angegeben Objektdateien ab
<TAB> avr-gcc $(OPT) -o main.out $(OBJ)

So kann ein Makefile mit dreieinhalb Zeilen riesige Projekte erzeugen (wobei das meist nicht reicht, aber theoretisch schon!)

P.S.: nur so kurz zusammengefasst - komme grad von einer Klausur wieder und wollte eigentlich ins Bett

_________________


[ Diese Nachricht wurde geändert von: DonComi am 15 Mär 2011 20:13 ]

BID = 753582

wulf

Schreibmaschine



Beiträge: 2246
Wohnort: Bozen

So jetzt melde ich mich endlich wieder.

Nach langem hin und her und nach einiger Recherche im Internet hab ichs hinbekommen.

Habe dann über mikrocontroller.net diesen Link gefunden:
http://www.avrfreaks.net/index.php?.....r=asc

Das Problem war leider nicht nur die Makefile sondern auch das "Was kommt wohin in der .c und .h".
Die Makefile war eigentlich schon super vorbereitet und hat deine beschriebene Regel bereits enthalten. Ich musste nur noch unter SRC die zusätzlichen .c Dateien angeben.

Danke für deine Geduld.

LG
Simon

Edit und P.S.: Hoffentlich sind deine Klausuren gut ausgegangen.

[ Diese Nachricht wurde geändert von: wulf am 10 Mär 2011 19:25 ]

BID = 754610

Berndotech

Gerade angekommen


Beiträge: 8
Wohnort: Fürth

Krass O.O danke^^



Vorherige Seite      
Gehe zu Seite ( Vorherige Seite 1 | 2 )
Zurück zur Seite 1 im Unterforum          Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 20 Beiträge im Durchschnitt pro Tag       heute wurden bisher 12 Beiträge verfasst
© x sparkkelsputz        Besucher : 182399645   Heute : 6843    Gestern : 7548    Online : 1021        25.11.2024    21:35
4 Besucher in den letzten 60 Sekunden        alle 15.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0269961357117