Error: predefs.h / Umzug AVR-Studio-CodeBlocks + Win-Ubuntu

Gast #2822989
Lesenswert?

Hallo,

bin neu von AVR-Studio unter Windows jetzt auf Code::Blocks in Ubuntu 
umgestiegen.
Mein C-Code für AVR lässt sich nicht mehr Compilieren.

Error:
/usr/include/features.h|324|fatal error: bits/predefs.h: No such file or 
directory|

es geht hier wohl um #define

allerdings habe ich selbst features.h und predefs.h nie eingebunden 
(höre ich zum ertsen mal)

Suche in Google ergibt dass es an der libc6-dev liege. Ist bei mir 
allerdings installiert. Und läuft alles auf meinem 32-Bit Linux.

Kann mir jemand von euch helfen?
Walter
#2823045
Lesenswert?

walter schrieb:
> Error:
> /usr/include/features.h|324|fatal error: bits/predefs.h: No such file or
> directory|

walter schrieb:
> jemand eine Idee was ich ausprobieren könnte?

Wenn da was aus /usr/include inkludiert wurde, dann wurde von 
Code::Blocks sicher nicht der avr-gcc aufgerufen, sondern der gcc des 
Host-Systems. Du musst Code::Blocks schon mitteilen, welchen Compiler es 
benutzen soll.
Gast #2823093
Lesenswert?

> von
> Code::Blocks sicher nicht der avr-gcc aufgerufen, sondern der gcc des
> Host-Systems

Habe aber AVR-GCC eingestellt.  Und sogar versucht ein neues AVR-Projekt 
zu erstellen, meinen C-Code rein kopiert und es kommt die gleiche 
Fehlermeldung.

Ist es sicher, dass es am AVR-GCC liegt?  XUbuntu 12.04 32bit, 
Codeblocks 10.05

dies sind die Includes des Codes:

#include <avr/io.h>
#include <avr/sleep.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
#include <util/delay.h>
#include <avr/pgmspace.h>

(also kein features.h und keinpredefs.h)



und das ist der Build-Log von Codeblocks:
-------------- Build: Release in test ---------------

Compiling: main.c
main.c:39:0: warning: "F_CPU" redefined
<command-line>:0:0: note: this is the location of the previous 
definition
In file included from /usr/include/inttypes.h:26:0,
                 from 
/usr/lib/gcc/avr/4.5.3/../../../avr/include/avr/sfr_defs.h:126,
                 from 
/usr/lib/gcc/avr/4.5.3/../../../avr/include/avr/io.h:99,
                 from main.c:63:
/usr/include/features.h:324:26: fatal error: bits/predefs.h: No such 
file or directory
compilation terminated.
Process terminated with status 1 (0 minutes, 0 seconds)
1 errors, 1 warnings
Gast #2823148
Lesenswert?

habe das hier gemacht:
http://lovingthepenguin.blogspot.fr/2012/01/fixing-codeblocks-avr-build-problems-on.html
und die Fehlermeldung ist weg.

allerdings gibts jetzt mehr errors and warnings:
-------------- Build: Release in test ---------------

Compiling: main.c
main.c:39:0: warning: "F_CPU" redefined
<command-line>:0:0: note: this is the location of the previous 
definition
main.c: In function ‘clockinit’:
main.c:904:5: warning: pointer targets in passing argument 1 of 
‘__eerd_word_m168’ differ in signedness
/usr/lib/gcc/avr/4.5.3/../../../avr/include/avr/eeprom.h:520:1: note: 
expected ‘const uint16_t *’ but argument is of type ‘int16_t *’
Linking console executable: bin/Release/test.elf
Output size is 8.59 KB
Running project post-build steps
avr-objcopy -O ihex -R .eeprom -R .eesafe bin/Release/test.elf 
bin/Release/test.elf.hex
avr-objcopy --no-change-warnings -j .eeprom --change-section-lma 
.eeprom=0 -O ihex bin/Release/test.elf bin/Release/test.elf.eep.hex
avr-objdump -h -S bin/Release/test.elf > bin/Release/test.elf.lss
Process terminated with status 0 (0 minutes, 0 seconds)
1 errors, 2 warnings
-----------------------------------------

Fehler:
/usr/lib/gcc/avr/4.5.3/../../../avr/include/avr/eeprom.h|520|note: 
expected ‘const uint16_t *’ but argument is of type ‘int16_t *’|

Zeile 520:
uint16_t eeprom_read_word (const uint16_t *__p) _ATTR_PURE_;


warning:
main.c|905|warning: pointer targets in passing argument 1 of 
‘__eerd_word_m168’ differ in signedness|

Zeile 905:
rtc_cal= eeprom_read_word(&ee_rtc_cal); // EEPROM Werte auslesen


In Win AVR-Studio 4 hat alles problemlos funktioniert. Soll ich einen 
neuen Thread aufmachen??
Gast #2823168
Lesenswert?

walter schrieb:
> was ist Grundsätzlich bei meinem Umzug vin Win AVR-Studio 4 nach Ubuntu
> 12.04 Code::Blocks zu beachten?  Müsste doch eigendlich problemlos
> funktionieren????

Zuerst einmal feststellen ob es nur ein Konfigurationsproblem ist, oder 
ob Canonical mal wieder die Debian Pakete soweit verbessert hat bis es 
nicht mehr läuft ;-)

Mit anderen Worten, ab in's source Verzeichnis und von Hand make 
aufrufen.
Vorher vielleicht noch überprüfen ob von Windows irgendwelche '\' in den 
Pfaden geblieben sind.

Wenn make problemlos läuft kann man in C::B suchen.
Gast #2823251
Lesenswert?

danke für den Tip!

habe make im Terminal ausgeführt und erhalte die gleichen warnigs und 
errors. (alle meldungen genau gleich  s.o.)
Es werden sowohl in C::B als auch beim Von-Hand-Make .hex .elf und alles 
drum und dran erstellt. Die .hex allerdings etwas größer als es bem 
AVR-Stduio war.

Aber mit der warning und dem error, die es vorher nicht gab.

> Vorher vielleicht noch überprüfen ob von Windows irgendwelche '\' in den
> Pfaden geblieben sind.
was meinst du damit genau? Wo soll ich nach Backslashes suchen??

> oder
> ob Canonical mal wieder die Debian Pakete soweit verbessert hat bis es
> nicht mehr läuft ;-)
ist das jetzt der Fall??  Bin ich der erste dem das auffällt????
Das ist ja schon seltsam!"§$/$/§$&//)()=(&%$§
was ist jetzt angesagt? Debian Pakete installieren?
Gast #2823347
Lesenswert?

walter schrieb:
> was ist jetzt angesagt? Debian Pakete installieren?
Ne,ne, auf gar keinen Fall Pakete von versch. Distributionen mischen.
Das ist ein Rezept für Desaster.

> was meinst du damit genau? Wo soll ich nach Backslashes suchen??
Falls sich in den Sourcen oder Headerdateien DEINES Projektes so etwas 
wie:
#include <arv\interrupt.h>
befände, würde sich ein Linux System damit unwohl fühlen.
1
#define F_CPU 16000000
2
#include <avr/io.h>
3
#include <avr/sleep.h>
4
#include <avr/interrupt.h>
5
#include <avr/eeprom.h>
6
#include <util/delay.h>
7
#include <avr/pgmspace.h>
8

9
int main()
10
{
11
  uint16_t ee_rtc_cal, rtc_cal;
12
  const uint16_t *p = &ee_rtc_cal;
13

14
  rtc_cal = eeprom_read_word(p); // EEPROM Werte auslesen
15
  rtc_cal++;
16
}
1
avr-gcc -Wall -O2 -mmcu=atmega16 -o simple.elf simple.c

kompiliert hier auf Debian Wheezy sauber und ohne warnings/errors

Ich vermute das irgendetwas in deinen sources nicht ganz sauber ist 
und die Win-gcc Version das vielleicht nicht gesehen hat.
Gast #2823575
Lesenswert?

Ja, kompiliert bei mir auch sauber und ohne Probleme:
> #define F_CPU 16000000
> #include <avr/io.h>
> #include <avr/sleep.h>
> #include <avr/interrupt.h>
> #include <avr/eeprom.h>
> #include <util/delay.h>
> #include <avr/pgmspace.h>
>
> int main()
> {
>   uint16_t ee_rtc_cal, rtc_cal;
>   const uint16_t *p = &ee_rtc_cal;
>
>   rtc_cal = eeprom_read_word(p); // EEPROM Werte auslesen
>   rtc_cal++;
> }

Norbert schrieb:
> Ich vermute das irgendetwas in deinen sources nicht ganz sauber ist
> und die Win-gcc Version das vielleicht nicht gesehen hat.
Diese Vermutung hatte ich auch schon, allerdings ist der betroffene 
Code nicht von mir sondern von Peter Dannenberger's "Die genaue 
Sekunde": 
http://www.mikrocontroller.net/articles/AVR_-_Die_genaue_Sekunde_/_RTC#Beispielprogramm

Wenn ich diesen unmodifiziert kompiliere, erhalte ich genau die gleichen 
Error/Warnings.

Woran liegt es nun? Am Code oder AVR-GCC Ubuntu? Was bedeuten die 
Meldungen überhaupt? Und warum läuft Norberts Code rund aber Peters 
nicht?

Danke  Walter
#2823715
Lesenswert?

walter schrieb:
> main.c:39:0: warning: "F_CPU" redefined

Entweder du hast ein "#define F_CPU" doppelt in deinem Code, oder bei 
Code::Blocks kann man den Takt irgendwo einstellen und es "injiziert" 
dann ein F_CPU bereits über die Kommando-Zeile.


walter schrieb:
> main.c|905|warning: pointer targets in passing argument 1 of
> ‘__eerd_word_m168’ differ in signedness
1
rtc_cal= eeprom_read_word(&ee_rtc_cal);
->
1
rtc_cal= eeprom_read_word((uint16_t*)&ee_rtc_cal);

walter schrieb:
> 1 errors, 2 warnings

Was ist denn der "1 errors"? Ich sehe nur die "2 warnings".
Gast #2823729
Lesenswert?

Hmm, hab's gerade noch einmal mit EEMEM versucht, geht aber auch ohne 
Probleme
1
#include <avr/eeprom.h>
2

3
// avr-gcc -Wall -O2 -mmcu=atmega16 -o tst tst.c
4

5
uint16_t EEMEM ee_rtc_cal;
6

7
int main(void)
8
{
9
  uint16_t rtc_cal;
10

11
  rtc_cal = eeprom_read_word(&ee_rtc_cal);
12

13
  rtc_cal++;
14
  return 0;
15
}

Und der von dir erwähnte code kompiliert mit nur einer *Warnung*:
tst.c: In function ‘main’:
tst.c:81: warning: pointer targets in passing argument 1 of 
‘__eerd_word_m88’ differ in signedness

das liegt daran,
1
int16_t ee_rtc_cal EEMEM = (F_CAL-12800000)*256/100;
2
rtc_cal= eeprom_read_word(&ee_rtc_cal);
ee_rtc_cal ist signed und die Funktion erwartet unsigned.
Ansonsten keine Probleme.
Gast #2823935
Lesenswert?

Stefan Ernst schrieb:
> bei
> Code::Blocks kann man den Takt irgendwo einstellen
genau so ist es, diese Warnung ist mir klar

> rtc_cal= eeprom_read_word(&ee_rtc_cal);
>->
> rtc_cal= eeprom_read_word((uint16_t*)&ee_rtc_cal);
Durch diese Änderung gibts hier keine Warnungen/Errors. Weder in meinem 
Code, noch in eeprom.h
Ist das so also korrekt und Peter Dannenberg's Programm fehlerhaft?

> Was ist denn der "1 errors"? Ich sehe nur die "2 warnings".
Wundert mich auch schon die ganze Zeit. Da stehen immer nur die 2 
Warnings und das "Note:" in rot. Kompiliert jedoch alles. Bei einem 
Error würde ja alles stoppen!?
Scheinbar ist das AVR-GCC oder make irgendwo doch Fehlerhaft.

Norbert schrieb:
> Hmm, hab's gerade noch einmal mit EEMEM versucht, geht aber auch ohne
> Probleme
hier auch ohne Probleme

......
> das liegt daran,int16_t ee_rtc_cal EEMEM = (F_CAL-12800000)*256/100;
> rtc_cal= eeprom_read_word(&ee_rtc_cal);
> ee_rtc_cal ist signed und die Funktion erwartet unsigned.
ich ändere
int16_t ee_rtc_cal EEMEM = 1;
der Fehler ist immer noch da!
.....

Aber wie gesagt läuft alles gut durch wenn ich Stefans Änderung
> rtc_cal= eeprom_read_word((uint16_t*)&ee_rtc_cal);
mache. Ist das richtig so? Habe Pointer immer noch nicht verstanden :(
Gast #2824013
Lesenswert?

walter schrieb:
>> das liegt daran,int16_t ee_rtc_cal EEMEM = (F_CAL-12800000)*256/100;
>> rtc_cal= eeprom_read_word(&ee_rtc_cal);
>> ee_rtc_cal ist signed und die Funktion erwartet unsigned.
> ich ändere
> int16_t ee_rtc_cal EEMEM = 1;
> der Fehler ist immer noch da!
> .....
>
> Aber wie gesagt läuft alles gut durch wenn ich Stefans Änderung
>> rtc_cal= eeprom_read_word((uint16_t*)&ee_rtc_cal);
> mache. Ist das richtig so? Habe Pointer immer noch nicht verstanden :(

Im Grunde genommen musst du nur
1
int16_t ee_rtc_cal EEMEM = 1;
ändern in:
1
uint16_t ee_rtc_cal EEMEM = 1;

dann brauchst du den cast beim Funktionsaufruf auch nicht mehr.
1
rtc_cal = eeprom_read_word(&ee_rtc_cal);
#2824040
Lesenswert?

Norbert schrieb:
> Im Grunde genommen musst du nur
1
int16_t ee_rtc_cal EEMEM = 1;
> ändern in:
1
uint16_t ee_rtc_cal EEMEM = 1;

Na, ich weiß nicht. Schließlich ist die Variable, die hier im EEPROM 
gespiegelt werden soll, ja tatsächlich (und mit Absicht) signed. Die 
EEPROM-Variable im Gegensatz zum RAM-Pendant unsigned zu machen, würde 
zwar auch funktionieren, aber der Cast beim Funktionsaufruf ist hier
meiner Meinung nach die sauberere Lösung.

walter schrieb:
> Ist das so also korrekt und Peter Dannenberg's Programm fehlerhaft?

Nicht fehlerhaft, nur etwas unsauber.

walter schrieb:
> Wundert mich auch schon die ganze Zeit. Da stehen immer nur die 2
> Warnings und das "Note:" in rot. Kompiliert jedoch alles. Bei einem
> Error würde ja alles stoppen!?
> Scheinbar ist das AVR-GCC oder make irgendwo doch Fehlerhaft.

Das geht weder auf das Konto von AVR-GCC, noch auf das von Make. Das ist 
dann ein Problem der IDE (Code::Blocks), die anscheinend den 
Build-Output falsch interpretiert (nämlich eine Fehlermeldung entdeckt, 
wo keine ist).
Gast #2824055
Lesenswert?

Stefan Ernst schrieb:

> uint16_t ee_rtc_cal EEMEM = 1;

> Na, ich weiß nicht. Schließlich ist die Variable, die hier im EEPROM
> gespiegelt werden soll, ja tatsächlich (und mit Absicht) signed. Die
> EEPROM-Variable im Gegensatz zum RAM-Pendant unsigned zu machen, würde
> zwar auch funktionieren, aber der Cast beim Funktionsaufruf ist hier
> meiner Meinung nach die sauberere Lösung.

Das ist aber die Adresse im EEPROM und die werden unglaublich ungern 
negativ;-)

> rtc_cal = eeprom_read_word(&ee_rtc_cal);

rtc_cal erhält die Daten welche im EEPROM gespeichert sind.
#2824151
Lesenswert?

QNorbert schrieb im Beitrag #2824055
> Das ist aber die Adresse im EEPROM und die werden unglaublich ungern
> negativ;-)

Nein, das ist es eben nicht. Es ist eine Variable im EEPROM, von der 
dann beim Funktionsaufruf die Adresse gebildet wird. Mit dieser Adresse 
hat die signed/unsigned-Sache hier überhaupt nichts zu tun.
Gast #2824173
Lesenswert?

Stefan Ernst schrieb:
> Nein, das ist es eben nicht. Es ist eine Variable im EEPROM, von der
> dann beim Funktionsaufruf die Adresse gebildet wird. Mit dieser Adresse
> hat die signed/unsigned-Sache hier überhaupt nichts zu tun.

uint16_t ee_rtc_cal EEMEM = 1;

ee_rtc_cal zeigt auf das zweite Byte im EEPROM.
(Von mir aus auch: ist ein Offset zum Start des EEPROMS.)
 0 wäre das erste Byte, wird aber aus bekannten Gründen ungern genommen. 
Man darf dies durchaus als Adresse *im* EEPROM ansehen.

Die Funktion eeprom_read_word() liest ab der angegebenen 
Position/Adresse zwei Bytes aus und gibt sie als Rückgabewert zurück. 
Diese Position ist immer ein positiver Integerwert, darum uint16_t.
Selbst wenn das EEPROM >32767 wäre und man auf Byte 32768 zugreifen 
würde, wäre der Wert den ich der Funktion übergebe nicht negativ.


Aus der eeprom.h:
1
/** \ingroup avr_eeprom
2
    Read one 16-bit word (little endian) from EEPROM address \a __p.
3
 */
4
uint16_t eeprom_read_word (const uint16_t *__p) __ATTR_PURE__;
Gast #2824202
Lesenswert?

Vielleicht noch einmal anders ausgedrückt:
ee_rtc_cal beinhaltet den Wert der in die EEPROM Adressregister 
EEARH/EEARL geschrieben werden. Diese Werte sind niemals negativ.

Der Parameter __p erwartet etwas das unsigned ist. Wenn da ein signed 
ankommt gibt's die Warnung.
#2824205
Lesenswert?

Norbert schrieb:
> uint16_t ee_rtc_cal EEMEM = 1;
>
> ee_rtc_cal zeigt auf das zweite Byte im EEPROM.
> (Von mir aus auch: ist ein Offset zum Start des EEPROMS.)
>  0 wäre das erste Byte, wird aber aus bekannten Gründen ungern genommen.
> Man darf dies durchaus als Adresse *im* EEPROM ansehen.

Das ist komplett falsch. Die Variable ee_rtc_cal liegt irgendwo im 
EEPROM (die Adresse wird vom Linker vergeben und könnte hier auch 42 
sein). Die 1 ist der initiale Inhalt für das EEPROM an dieser 
unbekannten Adresse.

Norbert schrieb:
> Die Funktion eeprom_read_word() liest ab der angegebenen
> Position/Adresse zwei Bytes aus und gibt sie als Rückgabewert zurück.

Und diese Adresse ist in diesem Fall die Adresse von ee_rtc_cal, nicht 
der Inhalt.
Gast #2824253
Lesenswert?

Stefan, du hast absolut Recht, Asche auf mein Haupt.

Ich habe vor vielen, vielen Jahren mit dem ICC compiler arbeiten müssen 
(damals noch unter Win) und dort gabe es, wenn ich mich recht erinnere 
zwei verschiedene Möglichkeiten auf das interne EEPROM zuzugreifen. 
Wahrscheinlich hatte ich das noch irgendwo im Langzeitspeicher.:-)
(Löschprozedur ist eingeleitet)

Nun habe ich Aufgrund von Platzbedarf immer separate EEPROM Bausteine 
und nutze demzufolge die Standardroutinen nicht mehr.

Sorry for the confusion.
Gast #2824366
Lesenswert?

Vielleicht sollte man hier zum Abschluss noch Folgendes erwähnen:

Wenn man sich eine Firmware baut und *.hex sowie *.eep in den
controller brennt und dann nicht mehr anfasst, so ist alles in Ordnung.

Dieser Mechanismus ist aber brandgefährlich, wenn man sich darauf
verlässt das bestimmte Werte an bestimmten Positionen im EEPROM
stehen. ZB. wenn man nachträglich bzw. als Update einen Satz Werte
mit dem Brenner oder per eingebautem Upload nur ins EEPROM schieben 
will.

Wurde die Firmware zwischenzeitlich neu kompiliert/gelinkt und die
Reihenfolge der EEPROM Definitionen geändert, so schreibt man dann an
falsche Positionen.

Sobald Zeilen wie
uint16_t EEMEM ee_3 =  8;
uint16_t EEMEM ee_4 =  4;
getauscht werden (was an der Funktion des Programms
absolut nichts ändert), vielleicht sogar wenn mehrere Objektdateien 
mit solchen Definitionen vorhanden sind, was passiert dann beim linken 
bzw. objcopy?
Ist das (die Reihenfolge/Absolute Adresse im EEPROM) irgendwo definiert, 
bzw. kann man darauf Einfluss nehmen oder müssen externe Programme, die 
Updates als *.eep Dateien erstellen, jedesmal komplett neu gebaut 
werden?

Hier:
http://www.nongnu.org/avr-libc/user-manual/group__avr__eeprom.html
konnte ich nichts zu diesem Thema finden.
Persönliche Seite #2824377
Lesenswert?

Norbert schrieb:
> Vielleicht sollte man hier zum Abschluss noch Folgendes erwähnen:
>
> Wenn man sich eine Firmware baut und *.hex sowie *.eep in den
> controller brennt und dann nicht mehr anfasst, so ist alles in Ordnung.
>
> Dieser Mechanismus ist aber brandgefährlich, wenn man sich darauf
> verlässt das bestimmte Werte an bestimmten Positionen im EEPROM
> stehen.

Ja, auf nicht-spezifizierte Features zu bauen ist immer eine schlechte 
Idee.
Gast #2824389
Lesenswert?

Johann L. schrieb:
> Ja, auf nicht-spezifizierte Features zu bauen ist immer eine schlechte
> Idee.

Du möchtest möglicherweise ein oder zwei posts rückwärts lesen, in denen 
ich ausführte das ein anderer Compiler genau so etwas erlaubte.
Ich möchte mich also nicht blind auf irgendetwas verlassen sondern 
fragte explizit:
> Ist das (die Reihenfolge/Absolute Adresse im EEPROM) irgendwo definiert,
> bzw. kann man darauf Einfluss nehmen oder müssen externe Programme, die
> Updates als *.eep Dateien erstellen, jedesmal komplett neu gebaut
> werden?

Das war doch nicht schwer, oder?
#2824406
Lesenswert?

Norbert schrieb:
> Ist das (die Reihenfolge/Absolute Adresse im EEPROM) irgendwo definiert,
> bzw. kann man darauf Einfluss nehmen oder müssen externe Programme, die
> Updates als *.eep Dateien erstellen, jedesmal komplett neu gebaut
> werden?

Wenn du alle EEPROM-Variablen in einer einzigen Struktur zusammenfasst, 
dann hast du quasi die Kontrolle über die Platzierung.
Gast #2824418
Lesenswert?

Stefan Ernst schrieb:
> Norbert schrieb:
>> Ist das (die Reihenfolge/Absolute Adresse im EEPROM) irgendwo definiert,
>> bzw. kann man darauf Einfluss nehmen oder müssen externe Programme, die
>> Updates als *.eep Dateien erstellen, jedesmal komplett neu gebaut
>> werden?
>
> Wenn du alle EEPROM-Variablen in einer einzigen Struktur zusammenfasst,
> dann hast du quasi die Kontrolle über die Platzierung.

Ja, aber größere Projekte, die in versch. Sourcedateien EEPROM Var. 
verwenden, würden jedoch das komplette 'Umarrangieren' erfordern und den 
Code definitiv nicht lesbarer werden lassen.

Also dann doch lieber die avr-libc Funktionen verwerfen und ein paar 
eigene Dreizeiler schreiben. Ist ja kein Hexenwerk.

Trotzdem, Danke!
Persönliche Seite #2824433
Lesenswert?

Norbert schrieb:
> Stefan Ernst schrieb:
>> Wenn du alle EEPROM-Variablen in einer einzigen Struktur zusammenfasst,
>> dann hast du quasi die Kontrolle über die Platzierung.
>
> Ja, aber größere Projekte, die in versch. Sourcedateien EEPROM Var.
> verwenden, würden jedoch das komplette 'Umarrangieren' erfordern und den
> Code definitiv nicht lesbarer werden lassen.

Weitere Möglichkeiten sind beschrieben in
http://lists.gnu.org/archive/html/avr-gcc-list/2012-08/msg00056.html
#2824450
Lesenswert?

Norbert schrieb:
> Ja, aber größere Projekte, die in versch. Sourcedateien EEPROM Var.
> verwenden, würden jedoch das komplette 'Umarrangieren' erfordern und den
> Code definitiv nicht lesbarer werden lassen.

So unlesbar finde ich ein zentrales EEPROM-Modul nun nicht.

> Also dann doch lieber die avr-libc Funktionen verwerfen und ein paar
> eigene Dreizeiler schreiben. Ist ja kein Hexenwerk.

Was haben diese Funktionen mit der Platzierung zu tun? Du kannst sie ja 
auch mit eigenen Adressen benutzen.
Davon abgesehen, händische Adressen bedeuten ja nicht, dass die 
einzelnen Module dann voneinander unabhängig wären.
Gast #2824487
Lesenswert?

@Johann L.
Danke für den Link. Der vierte Vorschlag:
- Use hard-coded addresses like eeprom_read_byte ((const void*) 1);
  this is not nice, not recommended and hard to maintain.
käme meinen Vorstellungen am nächsten.
Seitdem ich auf Linux umstellte, stehen mir leistungsfähige Mechanismen 
(sed/grep/awk) zur Verfügung, die solche Probleme ('hard to maintain') 
für meine Anwendungen auf Null reduzieren würde.

@Stefan Ernst
Letzten Endes wären bei einer erneuten Umstellung auf einen anderen 
Compiler
wiederum ähnliche Probleme zu erwarten. Jedoch einige wenige Dreizeiler, 
sauber dokumentiert, kurze Referenz auf das jeweilige Datenblatt, sowie 
einem /*HARDWARE*/ Tag würden solche Probleme in der Zukunft für mich 
deutlich transparenter machen.
Persönliche Seite #2824601
Lesenswert?

Norbert schrieb:
> @Johann L.
> Danke für den Link. Der vierte Vorschlag:
> - Use hard-coded addresses like eeprom_read_byte ((const void*) 1);
>   this is not nice, not recommended and hard to maintain.
> käme meinen Vorstellungen am nächsten.
> Seitdem ich auf Linux umstellte, stehen mir leistungsfähige Mechanismen
> (sed/grep/awk) zur Verfügung, die solche Probleme ('hard to maintain')
> für meine Anwendungen auf Null reduzieren würde.

Naja, ob sed- Kommandos einfach zu lesen und zu maintenieren sind sei 
mal dahingestellt.

Was spricht gegen --sort-section=name nebst
1
#define EE(X) __attribute__((section (".eeprom." #X)))
2

3
int ee_x EE(x);
4
int ee_y EE(y);
 
oder
 
1
#define EE_DECL(X) X __attribute__((section (".eeprom." #X)))
2

3
int EE_DECL (ee_a);
4
int EE_DECL (ee_b);
#2847696
Lesenswert?

walter schrieb:
> danke für den Tip!
>
> habe make im Terminal ausgeführt und erhalte die gleichen warnigs und
> errors. (alle meldungen genau gleich  s.o.)
> Es werden sowohl in C::B als auch beim Von-Hand-Make .hex .elf und alles
> drum und dran erstellt. Die .hex allerdings etwas größer als es bem
> AVR-Stduio war.
>
> Aber mit der warning und dem error, die es vorher nicht gab.
>
>> Vorher vielleicht noch überprüfen ob von Windows irgendwelche '\' in den
>> Pfaden geblieben sind.
> was meinst du damit genau? Wo soll ich nach Backslashes suchen??
>
>> oder
>> ob Canonical mal wieder die Debian Pakete soweit verbessert hat bis es
>> nicht mehr läuft ;-)
> ist das jetzt der Fall??  Bin ich der erste dem das auffällt????

Hallo walter,

ich hatte das gleiche Problem mit dem
/usr/include/features.h|324|fatal error: bits/predefs.h: No such file or
directory|
aber erst heute und suchte jetzt im Forum.
Ich arbeite ebenfalls mit Code::Blocks für die AVR und hatte bis vor 
kurzem Ubuntu 10.04. Jetzt mit 12.04 trat dieses Problem auf.
In den Antworten fand ich die Bemerkung von Stefan Ernst gut: "Du musst 
Code::Blocks schon mitteilen, welchen Compiler es benutzen soll."
Und in der Fehlermeldung steht der Pfad drin, wo er suchen möchte! In 
Code::Blocks kann man nicht nur den Compiler einstellen, sondern 
natürlich auch alles mögliche Andere. Da fand ich unter 'Compiler and 
debugger settings' den Reiter 'search directories', dort war bei mir der 
Pfad '/usr/include' eingetragen, wieso auch immer. Das Verzeichnis 
enthält nichts mit dem AVR.
Ich habe dort den Pfad '/usr/lib/gcc/avr' eingetragen und jetzt 
compiliert Code::Blocks wieder alles richtig.
Ich vermute, dass Code::Blocks auto-detecting auf das Verzeichnis das 
erste Verzeichnis mit 'avr' hereinfällt und einen anderen Pfad nicht 
weiter sucht. Der andere Pfad ist ja auch etwas versteckt.
Vielleicht muss man auch in dem Reiter 'Toolchain executables' den Pfad 
eintragen, der klingt wichtiger. Ich habe aber momentan keine Lust das 
auszuprobieren, mit dem richtigen Suchpfad bin ich momentan glücklich

> Das ist ja schon seltsam!"§$/$/§$&//)()=(&%$§
> was ist jetzt angesagt? Debian Pakete installieren?

Grüße,
microkirsche

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