Forum: Projekte & Code MicroC/OS mit ICC auf ATMega128 portieren


von Jürgen H. (juergen)


Lesenswert?

Hi,
hat jemand Erfahrung mit dem RTOS: MicroC/OS-II (uCOS/OS-II), mit dem
Compiler: ImageCraft (ICC) for AVR und dem Mikrocontroller ATMega128?

Mein Problem:
Der Hersteller von MicroC/OS hat bereits eine Beispiel-Portierung, mit
dem ICC, auf den ATMega128 zur Verfügung gestellt. Dieses Beispiel ist
auf seiner Homepage downloadbar. Es enthält alle notwendigen Dateien und
sogar die Projektfiles für den ICC. Eigentlich sollte es kein Problem
sein dieses Beispiel zu kopieren, mit dem ICC zu Compilieren, um eine
hex-File zu erhalten, die auf dem ATMega128 ausführbar ist.
Wenn es so einfach wäre?!?
Das Compilieren machte schon einige Problem läuft aber. Beim Linken
allerdings, komme ich nun nicht weiter! Momentan bekomme ich den
Linkerfehler: "multiple define:"!

Meine Frage:
Hat schon jemand die gleiche Portierung versucht und ist auf das
gleiche Problem gestossen? Oder hat jemand eine Idee, was dieser
Linkerfehler zu bedeuten hat?

Das habe ich schon versucht:
Habe es schon mit anderen Libs vom ICC versucht, habe selber ein
Projekt erstellt in dem alle Source-Files liegen, habe sämtliche
Compiler-Einstellungen (für den Linker gibts ja nicht wirklich welche)
ausprobiert, habe Pfade für den Linker kontrolliert/hinzugefügt, habe
nach mehrfach eingebunden *.h gesucht und mit #defines
verhindert....hat alles nichts gebracht!

Arbeite mit: MicroC/OS-II Verion 252 (Book Edition), ICC for AVR
Version 7, STK500/STK501 + ATMega128

bin für jeden Rat dankbar!

thx
juergen

von Cathrel (Gast)


Lesenswert?

Wenn die Meldung lautet:
multiple define: __depi

dann handelt es sich um einen Fehler in der Library, Abhilfe findest du
hier (von Imagecraft):

http://dragonsgate.net/pipermail/icc-avr/2004-January/002984.html

von Jürgen H. (juergen)


Lesenswert?

Hi Cathrel,

danke für deinen Tipp! Die Libs bzw. diesen Link habe ich schon
ausprobiert! Meine aktuellen Libs von ICCV7 sind aktueller wie die von
diesem Link!

meine Linkerfehler sind z.B.:
!E uCOS_II.o(824): multiple define: '_OS_EventTO'
!E uCOS_II.o(825): multiple define: '_OSStart'
!E uCOS_II.o(826): multiple define: '_OSTaskCreateExt'
!E uCOS_II.o(827): multiple define: '_OSTimeTick'
!E uCOS_II.o(828): multiple define: '_OS_EventTaskRdy'
!E uCOS_II.o(829): multiple define: '_OS_EventWaitListInit'
!E uCOS_II.o(830): multiple define: '_OSIntEnter'
usw.....

Gruß
juergen

von Asterix-007 (Gast)


Lesenswert?

Hallo Jürgen,

ich habe gerade das gleiche vor. Was für eine Hardwarekonfig hast du in
deinem Projekt?
Gib mir doch bitte mal Bescheid, wenn es funktioniert.

mfg

ASterix-007

von Asterix-007 (Gast)


Lesenswert?

noch etwas:

die angemeckerten defines sind welche vom µC-OS.
Du solltest alle .h-Dateien und andere Quellcodes auf doppelte defines
durchsuchen.
Abhilfe schafft hier u.U. etwas wie "
#ifndef  xxxx
  #define xxxx " !

Kann auch sein, das du etwas doppelt eingebunden hast.

Ich werde mich am WE mal hinsetzen und versuchen das µC-OS auf dem
128er zu implementieren.
Mal sehen, ob ich Erfolg habe......

Viel Erfolg beim Suchen!!!

Asterix

von Jürgen H. (juergen)


Lesenswert?

Hi Asterix,

sollte es mal funktionieren, kann ich dir gerne bescheid geben! Kein
Problem!

Das mit den defines habe ich schon probiert! habe jede *.h Datei mit
defines versehen, die mehrfach Einbindungen verhindern sollen. Kann
schon sein, dass ich etwas falsch gemacht habe?! Muss nochmal kucken!

Wie meinst du das mit "andere Quellcodes" auf doppelte defines
durchsuchen? Sind das *.c Dateien, die z.B.

#define IRGENDWAS
#define IRGENDWAS

oder

#include "IRGENDWAS.h"
#include "IRGENDWAS.h"

enthalten. Weißt du wie ich meine? Also das 2mal die gleiche Header
eingebunden wird bzw. 2mal die gleichen defines!

thx
juergen

von Asterix-007 (Gast)


Lesenswert?

Hallo Jürgen,

Also, dein Projekt besteht aus mehreren Dateien, alle die mit #include
eingebunden sind. Dabei ist es egal ob *.c oder *.h !
In diesen Dateien sind anscheinend diese #defines doppelt vorhanden!!
Wenn ja, meckert der Compiler oder hier der Linker.
Mit ifndef .. define ... verhinderst du solche Doppelzuweisungen weil
die Anweisung hier nur bedingt ausgeführt wird.
Wichtig für die Fehlersuche ist, daß du dir alle involvierten, mit
#include eingebundenen,  Dateien anschaust, was machnmal ganz schön
viele sind!!

Also lass dein Projekt nach z.B. : "#define _OS_EventTO"
durchsuchen.
Bei mehrfachen #defines einfach die letzen auskommentieren und noch
einmal kompilieren und linken!
Ich glaub das sollte helfen...

von Jürgen H. (juergen)


Lesenswert?

Hallo nochmal,

das war ne sehr gute Idee! Jedoch stellt dieses komische
"_OS_EventTO" eine Funktion dar! D.h. sie wird einmal bekanntgegeben
und einmal ausimplementiert (habe mein Projekt durchsucht) und zwar in
den Prozessor unabhängigen Dateien.
Und jetzt kommts: die Funktion steht im orginal Sourcecode vom
Hersteller, den ich eigentlich nicht modifizieren sollte. Also wirklich
das orginal von der Book Edition. Somit denke ich mal wird der schon
korrekt sein...sonst ist des ja Pfusch?!?

thx für deine hilfe!!
juergen

von Asterix-007 (Gast)


Lesenswert?

Hallo Jürgen,

das die Funktion im Sourcecode steht ist richtig und notwendig, aber
sie muß, genau wie die anderen, nur EINMAL mit #define definiert
werden.
Dein Linker sagt dir nur, daß in Zeile xy die Definition doppelt
vorhanden ist. => Also DOPPLUNGEN beseitigen und dein System sollte
funktionieren!

Viel Spaß!

Asterix

von Cathrel (Gast)


Lesenswert?

Hallo nochmal,

Die Version V2.8x (aktuelleste) enthält bereits einen Port für den
Imagecraftcompiler, dass heisst es sollte auf Anhieb klappen.

http://www.ucos-ii.com/contents/support/downloads/AN-1128.ZIP

von Jürgen H. (juergen)


Lesenswert?

Hi Cathrel,

das ist noch ne möglichkeit! werde es gleich mal ausprobieren!

thx

juergen

von Jürgen H. (juergen)


Lesenswert?

Also,
so wie es aussieht ist die Portierung unter ICC eine bleibende
Baustelle! Es sind immer noch die gleichen Linkerfehler "multiple
define" vorhanden!
Jedoch unter Linux mit avr-gcc scheint die Portierung zu funktionieren.
Auch hier habe ich eine Beispielportierung gefunden, mit der es nach
einiger Tüftelei geklappt hat, die Applikation zu compilieren bzw. zu
linken.
Jetzt fehlt nur noch eine Beispielapplikation, mit der die Echtzeit
bewiesen werden kann.
Hätte neben mir ein Oszi stehen mit dem ich die Taskzeiten messen
könnte. Also wenn zufällig jemand ein Beispielprogramm hätte, würde ich
mich freuen. Müsste dann das Rad nicht neu erfinden!!

@Cathrel: Habe unter ICC mit der V2.76 gearbeitet. Leider ohne
Erfolg=>Linkerfehler. Habe dann uC/OS angeschrieben, um die aktuellen
Sourcen zu erhalten. Bis jetzt noch keine Rückmeldung. Darum habe ich
es mal unter Linux versucht! Könnte schon sein, dass es mit V2.8x
funktioniert, habe aber die V2.8x Sourcen noch nicht testen können!

@Asterix: Habe bei meinem besten Willen KEINE Doppelungen gefunden!!

@all: Die Linkerfehler könnten aus der Reihenfolge, der zu linkenden
(vielleicht auch aus den zu compilierenden) Dateien liegen. Unter Linux
ist dies unter Verwendung von Makefiles ohne weiteres möglich. Im ICC
habe ich leider keine Einstellmöglichkeit gefunden, in der man die
Reihenfolge beeinflussen könnte. Allerdings hat dies der Hersteller bei
seiner Portierung auch nicht erwähnt! Naja, is ja auch nur ne
Vermutung!

thx
juergen

von pittbull (Gast)


Lesenswert?

hi,
ich benutze (zum glück nur zeitweise) diese imagecraft-grütze für den
hcs12. der compiler ist total mies! machmal kann er konstrukte a'la
  x = y[z++];
nicht zu lauffähigem code compilieren. als
  y = y[z];
  z++;
geht's dann, wie durch ein wunder!!!
ich weiss, das hilft euch nicht weiter, aber ich wollte euch nur davor
warnen wie schlecht der icc ist.

von Jens (Gast)


Lesenswert?

Das scheint dann aber nur bei der Version für die Freescale-Controller
so zu sein, bei der AVR-Version habe ich das Problem nicht beobachtet.
Unabhängig davon kannst du bei Imagecraft wenigstens davon ausgehen,
dass die zeitnah Bugs beheben, bei dem GCC wartet man u. U. ewig
darauf.

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.