Unterschiede CodevisionAVR und AVR-GCC

OP Persönliche Seite #942260
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
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
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
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
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
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
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.