Forum: Compiler & IDEs Was ändern um Winavr-Projekt in AVR-Studiuo zu builden?


von P-ter (Gast)


Lesenswert?

Hi, hab da mal ne Frage:

Was genau muß mann alles ändern bzw. beachten, um ein umfangreiches und 
bereits bestehendes WinAVR-Projekt ins AVR-Studio (GCC ist vorhanden) zu 
transferieren, damit man dort weiter damit arbeiten kann?

Danke im voraus!

mfg Peter

von iCarly (Gast)


Lesenswert?

Neues Projekt erstellen.
Dann Copy & Paste.

von P-ter (Gast)


Lesenswert?

Hmm so hatte ich es auch gedacht, aber es kommen sehr sehr viele Fehler 
compilieren.

Mal etwas genauer zum Projekt und zum Problem:

* FreeRTOS soll auf einen ATMEGA32
* FreeRTOS runtergeladen: es ist ein WinAVR-Projekt mit einem makefile
* Mit 'make all' im DOS-Fenster hat das kompilieren geklappt.
* Im AVR-Studio ein Projekt erstellt, auf externes makefile gestellt: 
hat auch geklappt.

Problem: ich will das Projekt über AVR-Studio weiterbearbeiten, aber es 
die Projektfiles werden auf der linken Seite nicht angezeigt. Ich muss 
alles manuell hinzufügen. Wenn ich ein neues *.c erstelle, dann müsste 
ich das manuell im makefile eintragen, was auf Dauer ziemlich 
umständlich ist.

Nun habe ich versucht ein Projekt in AVR-Studio zu erstellen und alle 
nötigen FreeRTOS-Daten manuell reinzukopieren. Auch die Pfade habe ich 
in den configuration options eingetragen. Trotzdem kriegt sich der 
Compiler fast nicht mehr ein vor lauter meckern. Inzwischen habe ich ihn 
auf ca 65 Fehler runter, aber die Fehler sind sehr kryptisch für mich 
und nicht kleinzukriegen.
Ich vermute, das die Reihenfolge beim Compilieren der Files nicht stimmt 
und somit einige defines noch nicht vorliegen wo sie es sollten, aber 
wie kommt man aus der Misere wieder raus?

Bsp.:
D:\AVRStudio\FreeRTOSV5.2.0\Demo\AVR_ATMega323_WinAVR\..\..\Source\inclu 
de/portable.h:303:  error: expected '=', ',', ';', 'asm' or 
'__attribute__' before '*' token

die Zeile 303 lautet:
portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, 
pdTASK_CODE pxCode, void *pvParameters );

Hat jemand von Euch ne Ahnung wie ich vorgehen könnte?

von P-ter (Gast)


Lesenswert?

Achso, habe ich oben noch vergessen: portSTACK_TYPE ist definiert und 
eingebunden.

von Karl H. (kbuchegg)


Lesenswert?

P-ter schrieb:
> Achso, habe ich oben noch vergessen: portSTACK_TYPE ist definiert und
> eingebunden.

Die Frage ist nur wie.
Das sind sicher irgendwo ein paar Makros mit im Spiel, die je nach 
verwendetem Prozessor richtig stehen müssen.

Nimm dir mal das alte Makefile her und durchsuch es nach 
Präprozessor-Direktiven. Also alles was mittels -D an den gcc übergeben 
wird. Da wird sicher irgendwas dabei sein, was an AVR oder Mega oder 
sowas erinnert. Diese Definements musst du noch im AVR Studio eintragen.

> Inzwischen habe ich ihn auf ca 65 Fehler runter,

Hast du im Code nachgebessert? Das war keine gute Idee. FreeRTOS läuft 
auf unterschiedlichen Plattformen. D.h. es gibt irgendeine Form der 
Konfiguration. Entweder über ein globales Konfig-Header File oder aber 
einige Präprozessordefinements, die dem Compiler vom Makefile aus direkt 
mitgegeben werden. Das Konfigfile ist das kleinere Problem. Die 
Definements aus dem Makefile musst du ins AVR-Studio mit übernehmen und 
dann sollte eigentlich wieder alles so laufen wie vorher. Ist ja 
schlieslich derselbe Compiler. Und wenn man ihn mit exakt der gleichen 
Commandline aufruft, wie aus dem Makefile heraus, muss auch das gleiche 
Ergebnis rauskommen.

von Oliver (Gast)


Lesenswert?

Viel steht da im makefile nicht drin.
1
CFLAGS = -D GCC_MEGA_AVR -I. -I../../Source/include -I../Common/include  \
2
$(DEBUG_LEVEL) -O$(OPT) \
3
-fsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \
4
$(WARNINGS) \
5
-Wa,-adhlns=$(<:.c=.lst) \
6
$(patsubst %,-I%,$(EXTRAINCDIRS))

davon sind
1
-D GCC_MEGA_AVR
 und die include-Pfade wichtig. Das define musst du im Studio-Projekt 
unter den configuration options/custom options für alle Dateien angeben, 
die include-Pfade eben bei include directories. Ausserdem muß noch das 
"..Demo\AVR_ATMega323_WinAVR" Verzeichnis als include-Pfad dazu.

Dazu müssen halt alle im makefile genannten source-files, incl. des 
passenden port.c:
1
PORT_DIR = ../../Source/portable/GCC/ATMega323
2
...
3
$(PORT_DIR)/port.c \

dem Studio-Source-Ordner hinzugefügt werden, und schon läuft build 
fehlerfrei durch.

Oliver

von Oliver (Gast)


Lesenswert?

Nachtrag:
1
AVR Memory Usage
2
----------------
3
Device: atmega32
4
5
Program:    9722 bytes (29.7% Full)
6
(.text + .data + .bootloader)
7
8
Data:       1749 bytes (85.4% Full)
9
(.data + .bss + .noinit)

Das data-Segment ist allerdings arg voll. Das sieht nach Ärger aus...


Oliver

von P-ter (Gast)


Lesenswert?

Juhuu, ich dachte ich bekomme das nie hin, aber es läuft jetzt 
fehlerfrei!

Karl heinz Buchegger schrieb:
> Hast du im Code nachgebessert? Das war keine gute Idee.

Um Himmels Willen, nein, ich hatte nihcts im Code verändert, wo denn 
auch :) Allein das Umstellen der "include directories" bewirkte eine 
Fehlerreduzierung. Das war es auch was mich sehr verwirrt hat.

> Nimm dir mal das alte Makefile her und durchsuch es nach
> Präprozessor-Direktiven. Also alles was mittels -D an den gcc übergeben
> wird. Da wird sicher irgendwas dabei sein, was an AVR oder Mega oder
> sowas erinnert. Diese Definements musst du noch im AVR Studio eintragen.

Volltreffer, das war der Schlüssel zum Erfolg.

Oliver schrieb:
> davon sind
> -D GCC_MEGA_AVR
> und die include-Pfade wichtig. Das define musst du im Studio-Projekt
> unter den configuration options/custom options für alle Dateien angeben,
> die include-Pfade eben bei include directories. Ausserdem muß noch das
> "..Demo\AVR_ATMega323_WinAVR" Verzeichnis als include-Pfad dazu.

Es lag an den -D Einstellungen die ich nicht in den "configuration 
options/custom options" angegeben hatte. Das hat also der Projektwizard 
nicht für mich erledigt ;)
Ich wäre von alleine nie auf diesen Fehler gekommen, denn schließlich 
ging ich davon aus mein Soll mit den Angaben in "include directories" 
erfüllt zu haben.

Ist das bei allen Compilern ähnlich bzw. standardisiert oder ist das was 
AVR-Studio spezifisches? Gibt es ein Tutorial (Anfängergeeignet :)) wo 
man speziell diese geheimnisvollen Compilereinstellungen und die Sache 
mit den Makefiles nachlesen kann?

Und nochmals an alle: Ein dickes Dankeschööööön!

von Oliver (Gast)


Lesenswert?

>Ist das bei allen Compilern ähnlich

Das hat mit dem Compiler überhaupt nichts zu tun.
1
-D GCC_MEGA_AVR
 als Comileroption macht schließlich nichts anderes, als ein
1
#define GCC_MEGA_AVR
 in jeder Source-Datei.  Das haben sich die Erbauer des FreeRTOS so 
ausgedacht, und das sollte auch irgendwo in der FreeRTOS-Doku 
beschrieben stehen.

>Gibt es ein Tutorial (Anfängergeeignet :))...
Bist du dir sicher, daß so etwas wie FreeRTOS das richtige für dich ist? 
Einen Mega32 kamm man wunderbar ohne RTOS programmieren, und damit 
hättest du eine (nicht unerheblich kleine) Einarbeitungs-Baustelle 
weniger.

Oliver

von P-ter (Gast)


Lesenswert?

Nachtrag und Frage:

Wenn man ein C-File/H-File aus einem neuen Verzeichnis über AVR-Studios 
"add existing ... File" in ein Projekt einbindet, muss man das 
Verzeichnis manuell in den "configuration options" bei "include 
directories" und "custom options" nachtragen. AVR-Studio ergänzt das 
eigene makefile nicht automatisch.

Habe ich das so richtig verstanden?

von Oliver (Gast)


Lesenswert?

In den custom options nicht, nur bei den include-directories.

Oliver

von P-ter (Gast)


Lesenswert?

Oliver schrieb:
> Das hat mit dem Compiler überhaupt nichts zu tun.
> -D GCC_MEGA_AVR
> als Comileroption macht schließlich nichts anderes, als ein
> #define GCC_MEGA_AVR
> in jeder Source-Datei.  Das haben sich die Erbauer des FreeRTOS so
> ausgedacht, und das sollte auch irgendwo in der FreeRTOS-Doku
> beschrieben stehen.

Ahhhh, jetzt habe ich es kapiert!
-D GCC_MEGA_AVR entspricht einem #define _GCC_MEGA_AVR. Dadurch wird dem 
Compiler in "portable.h" das Verzeichnis für das jeweils projekt- oder 
portierungsplattformeigene "portmacro.h" angegeben. Wegen der vielen 
Demos sparen die Macher von FreeRTOS so im Gesamtpaket von Freertos 
redundanden Code.

> Bist du dir sicher, daß so etwas wie FreeRTOS das richtige für dich ist?
> Einen Mega32 kamm man wunderbar ohne RTOS programmieren, und damit
> hättest du eine (nicht unerheblich kleine) Einarbeitungs-Baustelle
> weniger.
Da hast du vollkommen Recht :)

Viele Grüße und nochmals Danke.

Peter

von uC_Trottel (Gast)


Lesenswert?

Ich bin spät, fast ein Jahr nach dem letzten Beitrag. Aber vielleicht 
sind P-ter oder Oliver noch dabei...
Ich habe das gleiche Problem wie P-ter gehabt und konnte es mit der 
Hilfe von Oliver auch lösen.

Nun meine Frage an euch: habt ihr auch 3 warnings?
1
../tasks.c: In function 'xTaskGenericCreate':
2
../tasks.c:420: warning: cast from pointer to integer of different size
3
../tasks.c:420: warning: cast to pointer from integer of different size

Diese warnings habe ich sowohl wenn ich make in der DOS-Box benutze, als 
auch wenn ich AVR Studio 4 benutze.

Ich hab mich da ein bisschen gewundert, weil auf der FreeRTOS Seite 
steht, dass die Beispielprojekte ohne Warnings und Errors durchlaufen 
sollen...

von Karl H. (kbuchegg)


Lesenswert?

uC_Trottel schrieb:
> Ich bin spät, fast ein Jahr nach dem letzten Beitrag. Aber vielleicht
> sind P-ter oder Oliver noch dabei...
> Ich habe das gleiche Problem wie P-ter gehabt und konnte es mit der
> Hilfe von Oliver auch lösen.
>
> Nun meine Frage an euch: habt ihr auch 3 warnings?
>
1
../tasks.c: In function 'xTaskGenericCreate':
2
> ../tasks.c:420: warning: cast from pointer to integer of different size
3
> ../tasks.c:420: warning: cast to pointer from integer of different size
4
>
>
> Diese warnings habe ich sowohl wenn ich make in der DOS-Box benutze, als
> auch wenn ich AVR Studio 4 benutze.
>
> Ich hab mich da ein bisschen gewundert, weil auf der FreeRTOS Seite
> steht, dass die Beispielprojekte ohne Warnings und Errors durchlaufen
> sollen...

Das kann schon sein, meistens testet man nicht alles überall durch. 
Gerade bei Libraries, die auf vielen Plattformen laufen sollen, wird da 
schon mal was übersehen.
Zeig doch mal die betreffende Stelle. Der Fehler ist aber meistens 
keiner von der harmlosen Natur.

von uC_Trottel (Gast)


Lesenswert?

Hier ist die Codestelle:
1
#if( portSTACK_GROWTH < 0 )
2
{
3
  pxTopOfStack = pxNewTCB->pxStack + ( usStackDepth - 1 );
4
  pxTopOfStack = ( portSTACK_TYPE * ) ( ( ( unsigned long ) pxTopOfStack ) & ( ( unsigned long ) ~portBYTE_ALIGNMENT_MASK  ) );//<- diese Zeile macht den Fehler
5
}

Ich kann damit gerad nicht soviel anfangen. Hat offensichtlich was mit 
dem Stack zu zun und das ist bestimmt nicht so unwichtig.

Die LED blinken aber lustig und auf der seriellen Schnittstelle werden 
immer wieder die Buchstaben A-Z ausgegeben. Also funktionieren tut 
etwas.

von ... (Gast)


Lesenswert?

Hi,

in dem speziellen Fall sollte die Warnung harmlos sein.
Man könnte auch long durch int ersetzen, dann sollte die Warnung 
verschwinden. Pointer haben beim AVR halt nur 16 Bit.

Eigentlich müsste man beim AVR die Casts auch ganz weglassen können.
Die sollen wohl einige unschöne Effekte verhindern wenn sizeof(int) != 
sizeof(void*).

CU

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
Noch kein Account? Hier anmelden.