Unterschiede CodevisionAVR und AVR-GCC

OP Persönliche Seite #942260
Lesenswert?

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
Gast #942321
Lesenswert?

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...
OP Persönliche Seite #942341
Lesenswert?

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
OP Persönliche Seite #959429
Lesenswert?

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]; void timer1_compa_isr(void)
und
1
 interrupt [TIM1_COMPB]; void timer1_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
#959486
Lesenswert?

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]; void timer1_compa_isr(void)
> und
>
1
 interrupt [TIM1_COMPB]; void timer1_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.
OP Persönliche Seite #959822
Lesenswert?

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]; void timer1_compa_isr(void)
>> und
>>
1
 interrupt [TIM1_COMPB]; void timer1_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
OP Persönliche Seite #959879
Lesenswert?

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
OP Persönliche Seite #959929
Lesenswert?

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
#959941
Lesenswert?

Steffen O. wrote:
>
1
> c=5;
2
> #define Test "c"
3
>
> 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.
Gast #960032
Lesenswert?

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
OP Persönliche Seite #960071
Lesenswert?

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

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