Hallo Gemeinschaft, ich möchte in einer C-Datei (BLA.C) konstante Werte ablegen, etwa const char CBlaBla[] PROGMEM = {"Hallo"}; ...und in einer anderne Datei (MAIN.C) nutzen. Die Files werden individuell compiliert (ohne Link), Optionen -c -Wall -Os -mmcu=atmega32 -g (Klappt, kleine Objects erblicken das Licht dieser Welt ;-) Zum Linken rufe ich den AVR-GCC mit den Optionen -mmcu=atmega32 -combine BLA.OBJ Main.OBJ -o GO.ELF auf, der meckert aber: Main.C:(.text+0x6de): undefined reference to `CBlaBla' Schon ein kleiner Hinweis wäre traumhaft, die Forum-Suche war bei mir leider erfolglos... mfg Harry
muss man nicht variablen und/oder funktionen von anderen files als "extern" definierren ??? dh: im main.c "extern const char CBlaBla[];" Neubi
Hallo, wie wäre es mit
1 | extern const char CBlaBla[] PROGMEM; |
(nicht getestet und ohne Gewähr ;o) ) in main.c? Idealerweise hat man für sowas eine Headerdatei, die das beinhaltet und inkludiert wird (z.B. "bla.h"). Gruß David Edit: war wohl wieder jemand schneller...
Ändere .C in .c Im Moment benutzt du wegen der Endung der Quelltexte den C++ Compiler compile.bat
1 | avr-gcc -c -Wall -Os -mmcu=atmega32 -g main.c |
2 | avr-gcc -c -Wall -Os -mmcu=atmega32 -g bla.c |
3 | avr-gcc -mmcu=atmega32 -combine bla.o main.o -o go.elf |
main.c
1 | #include <avr/io.h> |
2 | #include <stdio.h> |
3 | |
4 | extern const char CBlaBla[]; |
5 | |
6 | int main(void) |
7 | {
|
8 | // irgendwas machen, damit es nicht wegoptimiert wird
|
9 | // zur Sicherheit im ASM-Listing nachsehen (s.u. Anm.)
|
10 | return *CBlaBla; |
11 | }
|
bla.c
1 | #include <avr/io.h> |
2 | #include <avr/pgmspace.h> |
3 | |
4 | const char CBlaBla[] PROGMEM = {"Hallo"}; |
Anm.: Du solltest auf make und Makefiles umstellen. Du erhälst weitere Ausgaben z.B. mit einem ASM-Listing, MAP-Dateien usw. und kannst bequemer Libaries einbinden.
Hallo Neubi + David, genau diese extern-Deklaration habe ich in MAIN.C (sonst würde das nicht compilieren). Der Linker meckert trotzdem!? Kann evtl. mal einer gegenchecken, ob solche externen PROGMEM-Geschichten bei ihm klappen? mfg Harry
Harry wrote: > Kann evtl. mal einer gegenchecken, ob solche externen > PROGMEM-Geschichten bei ihm klappen? Das habe ich gemacht. Wie ich es gemacht habe, steht in meinem vorhergehenden Beitrag. Ich kann nur deinen Fehler provozieren, wenn ich .C statt .c benutze.
Harry wrote: > Die Files werden individuell compiliert (ohne Link), Optionen > -c -Wall -Os -mmcu=atmega32 -g Und warum nicht compilieren und linken in einem Rutsch? Ich machs immer so: avr-gcc.exe -xc -Os -mmcu=atmega32 -Wall -g -o test.out *.c avr-objcopy.exe -O ihex test.out test.hex avr-objdump.exe -t -h -S test.out >test.lst avr-size.exe -B test.out Die Aufrufe avr-objdump und avr-size sind nur zur Information. Ich guck mir gerne mal das Code-Listing mit den C-Zeilen an. Peter
Hallo, erstaunlicherweise hast du Recht, das Ganze benimmt sich bei mir (WinAVR mit avr-gcc 4.1.1 + AVR-Studio) genauso. (Ich habe die Filenamen exakt so übernommen -> C++) Abhilfe schafft zB Folgendes (hab' ich Headerfiles nicht schon mal erwähnt? :-) ): BLA.H
1 | #include <avr/pgmspace.h> |
2 | |
3 | extern const char CBlaBla[] PROGMEM; |
BLA.C
1 | #include "BLA.H" |
2 | |
3 | const char CBlaBla[] PROGMEM = {"Hallo"}; |
MAIN.C
1 | #include <avr/io.h> |
2 | |
3 | #include "BLA.H" |
4 | |
5 | int main() { |
6 | PORTD = pgm_read_byte(CBlaBla); |
7 | return 0; |
8 | }
|
(hier ist das Ausgeben recht sinnfrei und nur zum Umgehen etwaiger Optimierungen gedacht) P.S. an einen der "Profis": könnt ihr erklären, warum das so ist? Edit: hat sich das erledigt, ist anscheinend eine Macke von C++. Edit2 Das Wörtchen extern in BLA.C macht's. Anscheinend wird das Symbol nur in diesem Fall global exportiert. Gruß David
Da hätte ich mich ja schwarz gesucht! Vielen Dank für die Unterstützung!!! Harry
Stefan "stefb" B. wrote: > Das habe ich gemacht. Wie ich es gemacht habe, steht in meinem > vorhergehenden Beitrag. Ich kann nur deinen Fehler provozieren, wenn ich > .C statt .c benutze. Man kann mit dem Schalter -xc erzwingen, daß die Files nur als c compiliert werden, nicht als C++. Dann könnte man sogar die hier haufenweise geposteten txt-Files compilieren. Peter
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.