Hallo,
ich hab hier eine lib für einen ATMega8, die in CodevisionAVR
geschrieben wurde. Nun würde ich gerne diese lib auch mit AVR-GCC
verwenden.
Was muss ich bei der Portierung der lib nach AVR-GCC beachten?
Gibts da irgendwelche Stolperfallen, oder so?
Ich hab schon gelesen, dass es bei CodevisionAVR eben einige
Codegeneratoren gibt, die z.B. die Timer, UART, ADC usw. alles schon
vorkonfigurieren.
Aber ist der Code selber auch anders? Oder ist eben CodevisionAVR nur
ein Compiler, der dem Entwickler ein wenig Arbeit abnimmt, der Code ist
jedoch gleich wie bei AVR-GCC?
Vielen Dank schon einmal im Voraus!
Gruß, Steffen
Hallo,
ja es gibt einige Unterschiede, insbesondere das I/O pin handling (CV
erlaubt z.B. PORTD.0=1) außerdem ist die Behandlung von Interrupts
anders als bei GCC.
Bei der Library kommt es natürlich drauf an, was drin ist.
Lass sie halt mal durch den GCC laufen und dann eine Fehlermeldung nach
der anderen abstellen. Wenn Du Dich mit GCC auskennst, wird das
lediglich eine mehr oder weniger mühsame Fleißarbeit.
Probieren geht über studieren...
OK, ich habs jetzt mal durch Winavr rennen lassen. 44 Fehler, und 3
Warnings^^. Aber so wie ich das sehe, sind das eigentlich nur Fehler auf
Grung der anderen Portansprache.
Ach ja, geht sowas in gcc:
1
#define SPI_PORT PORTB
2
#define SPI_PORT_DIR DDRB
3
#define MISO 4
4
#define MOSI 3
5
#define SCK 5
6
#define CS 2
7
#define BLANK 0
8
#define MODE 1
Ich mein eben wegen den Zahlen hinter #define MISO, usw. Muss man da
nicht jedesmal neu schreiben PORTB, und dann die jeweilige Zahl?
Gruß, Steffen
>> Gruß, Steffen
Mit #define kann man fast alles auf die rechte Seite schreiben, es führt
ja nur zu textuellem Ersatz. Es kommt also auf die Verwendung an.
Ja, ok. Dann werd ich das also so lassen.
Ok sonst wäre dann alles geklärt, den Rest kann ich eigentlich alleine.
Vielen Dank an alle, die mir geholfen haben!
Gruß, Steffen
So, von den 44 Fehlern bin ich jetzt noch bei 2 und 4 Warnings. Und zwar
treten jeweils ein Fehler und zwei Warnings in den folgenden Zeilen auf:
1
interrupt[TIM1_COMPA];voidtimer1_compa_isr(void)
und
1
interrupt[TIM1_COMPB];voidtimer1_compb_isr(void)
Der Fehler jeweils lautet:
../RGBlib.c:245: error: 'TIM1_COMPA' undeclared here (not in a function)
bzw.
../RGBlib.c:313: error: 'TIM1_COMPB' undeclared here (not in a function)
Und die Warnings:
../RGBlib.c:245: warning: data definition has no type or storage class
../RGBlib.c:245: warning: type defaults to 'int' in declaration of
'interrupt'
bzw.
../RGBlib.c:313: warning: data definition has no type or storage class
../RGBlib.c:313: warning: type defaults to 'int' in declaration of
'interrupt'
Wenn ich das
1
interrupt[TIM1_COMPA];
weglasse, dann gibt es keine Compilerfehler mehr. Aber funktioniert das
dann auch richtig?
Wenn nicht, wie muss ich das dann schreiben, damit das mein AVR Studio
ordentlich compiliert?
Vielen Dank schon einmal im Voraus.
Gruß, Steffen
Steffen O. wrote:
> So, von den 44 Fehlern bin ich jetzt noch bei 2 und 4 Warnings. Und zwar> treten jeweils ein Fehler und zwei Warnings in den folgenden Zeilen auf:>
1
interrupt[TIM1_COMPA];voidtimer1_compa_isr(void)
> und>
1
interrupt[TIM1_COMPB];voidtimer1_compb_isr(void)
Schau Dir einfach im AVR-GCC-Tutorial an, wie Interrupt Handler
korrekt implementiert werden und welche Header dafür eingebunden werden
müssen. Da steht alles vorgekaut (und es wundert mich, dass Du nach drei
Wochen immer noch nicht bis dahin gekommen bist). Ansonsten kann ich
auch dringendst die Dokumentation der AVR-libc empfehlen.
> Wenn ich das
1
interrupt[TIM1_COMPA];
weglasse, dann gibt es
> keine Compilerfehler mehr. Aber funktioniert das dann auch richtig?
Nein.
> Wenn nicht, wie muss ich das dann schreiben, damit das mein AVR Studio> ordentlich compiliert?
Und AVRStudio compiliert gar nichts! Das tut der Compiler, und der
gehört nicht zum AVRStudio sondern muss als Plugin zusätzlich
installiert werden. AVRStudio ist in diesem Fall nur die
Entwicklungsumgebung.
Hallo,
Johannes M. wrote:
> Steffen O. wrote:>> So, von den 44 Fehlern bin ich jetzt noch bei 2 und 4 Warnings. Und zwar>> treten jeweils ein Fehler und zwei Warnings in den folgenden Zeilen auf:>>
1
interrupt[TIM1_COMPA];voidtimer1_compa_isr(void)
>> und>>
1
interrupt[TIM1_COMPB];voidtimer1_compb_isr(void)
> Schau Dir einfach im AVR-GCC-Tutorial an, wie Interrupt Handler> korrekt implementiert werden und welche Header dafür eingebunden werden> müssen.
Ok, werd ich dann mal machen.
Da steht alles vorgekaut (und es wundert mich, dass Du nach drei
> Wochen immer noch nicht bis dahin gekommen bist).
Ich war zwei Wochen im Urlaub, und hab mich so also erst ca. 1-2 Tage
mit dem Thema befasst.
>Ansonsten kann ich> auch dringendst die Dokumentation der AVR-libc empfehlen.
Gut, werde ich mir auch mal anschauen.
>> Wenn nicht, wie muss ich das dann schreiben, damit das mein AVR Studio>> ordentlich compiliert?> Und AVRStudio compiliert gar nichts! Das tut der Compiler, und der> gehört nicht zum AVRStudio sondern muss als Plugin zusätzlich> installiert werden. AVRStudio ist in diesem Fall nur die> Entwicklungsumgebung.
Ja, dann eben das WinAVR Plugin in der Entwicklungsumgebung AVR Studio.
Gruß, Steffen
OK, vielen Dank nochmal für den Tip, hab jetzt die zwei Fehler und vier
Warnings auch noch beseitigt. Jetzt kam ein neuer Fehler, und zwar in
der Zeile:
1
#define SPI_PORT PORTB
Da kommt folgender Fehler:
../../../../crt1/gcrt1.S:52: undefined reference to `main'
Die define ist doch richtig geschrieben, und es gibt im Mainteil auch
SPI_PORT, das durch PORTB ersetzt werden kann, also daran liegts nicht.
Was könnte dann den Compiler stören?
Vielen Dank schon mal im Voraus.
Gruß, Steffen
Da es in der Zeile gar keine "reference to main" gibt, dürfte der
eigentliche Fehler in einer anderen Zeile als der gezeigten liegen bzw.
sich aus dem hier nicht ersichtlichen Kontext ergeben.
Ich portiere ja gerade eine lib, da gibts doch gar keine main. Also der
Compiler kennt die main ja noch gar nicht, woher will er dann sagen dass
der Zusammenhang zur main undefiniert ist? Weil ich hab auch noch andere
defines in der lib, und die werden auch ordentlich compiliert.
Ach ja, noch ne andere Frage: Wie kann ich mit einer define machen, dass
der Präprozessor einen Namen durch eine Zahl ersetzt, dieser aber in
einer Variable steht. Also jetzt mal ein Beispiel wie ich es meine:
1
2
c=5;
3
#define Test "c"
Jetzt weiß ich eben nicht, wie ich da das c schreiben muss, dass es als
Variable angesehen wird. Weil wenn ich ja einfach c schreibe, dann
ersetzt er mir ja nur Test durch c. Aber Test soll ja durch 5 ersetzt
werden.
Vielen Dank schon einmal im Voraus.
Gruß, Steffen
> Jetzt weiß ich eben nicht, wie ich da das c schreiben muss, dass es als> Variable angesehen wird. Weil wenn ich ja einfach c schreibe, dann> ersetzt er mir ja nur Test durch c. Aber Test soll ja durch 5 ersetzt> werden.
Der Präprozessor kennt den Wert der Variable gar nicht (bzw. er
interessiert ihn nicht). Du bist Dir offensichtlich nicht im Klaren über
die Funktionsweise und die Aufgaben des Präprozessors. Den Präprozessor
interessieren ausschließlich Programmzeilen, die mit "#" anfangen. Alles
andere ignoriert er und gibt es 1:1 dem Compiler weiter. Deshalb kann
der Präprozessor den Wert der Variablen gar nicht einsetzen. Die
Zuweisung eines Wertes macht erst der Compiler, und der fängt erst an zu
arbeiten, wenn der Präprozessor mit seinem Part fertig ist.
Stimmt, du hast Recht! Hab ich gar nicht drübernachgedacht. Was der
Präprozessor macht, weiß ich eigentlich schon, das hab ich einfach nicht
beachtet!
Vielen Dank für deine Hilfe schonmal!!!
Jetzt muss ich nur noch den einen Fehler hinbekommen, und ich denke das
werde ich schon irgendwie schaffen.
Gruß, Steffen
Ich tippe mal, dass du in den AVRStudio projekt einstellungen auswählen
musst, dass du eine lib erstellen willst, denn woher soll das AVRStudio
wissen? ;-)
Außerdem verweißt die Fehlermeldung auf ein (temporäres??)assembler File
und nicht auf deinen C-Code
gast wrote:
> Ich tippe mal, dass du in den AVRStudio projekt einstellungen auswählen> musst, dass du eine lib erstellen willst, denn woher soll das AVRStudio> wissen? ;-)
Wie stelle ich in den Projekt options ein, dass ich eine lib mache?
Hab ich bis jetzt da noch nicht entdeckt.....
> Außerdem verweißt die Fehlermeldung auf ein (temporäres??)assembler File> und nicht auf deinen C-Code
Wie könnte ich das assembler File finden, um es zu untersuchen, bzw. wie
wird es überhaupt erstellt? Ich habe nirgends wissentlich ein assembler
File mit in das Projekt genommen, oder so.
Vielen Dank schon einmal im Voraus.
Gruß, Steffen