...tritt folgender Fehler beim auf:
./header/stubs.h:18: warning: 'struct _reent' declared inside parameter
list
Toolchain ist codesourcery, ich hoffe jemand kann helfen.
Grüße,
Daniel
hat nur scheinbar
> geholfen. Ich musste stattdessen
1
#include<reent.h>
benutzen.
Um diesen Struct in Form eines Pointers zu verwenden brauchst du das
nicht.
Wenn du dann allerdings über diesen Pointer auf Member zugreifen willst,
muss klarerweise der exakte Aufbau der Strktur bekannt sein, da reicht
dann eine Forward Deklaration nicht.
>> Ein weiteres Problem habe ich nun mit errno: (habe ich mir im oben> verlinkten Artikel abgeschaut)>
1
>intrs232_close_r(struct_reent*r,intfd){
2
>/* return not supported */
3
>r->errno=ENOTSUP;
4
>return-1;
5
>}
6
>
> errno.h ist included. Compiler meckert:> "error: expected identifier before '(' token"
in welcher Zeile?
Poste bitte das komplette File und alles was dazu gehört.
Kann es sein, dass in der Zeile unmittelbar davor ein ';' fehlt?
Genau die drei Zeilen, die auf das member errno vom reent-struct
zugreifen, werden bei den drei Fehlermeldungen: "error: expected
identifier before '(' token" genannt.
Die Struktur reent hat kein Recht, eins ihrer Mitglieder "errno" zu
nennen. errno ist per C-Standard ein Makro, der auf unbestimmte
Weise so expandiert, dass ein `modifiable lvalue that has type int'
daraus entsteht. Ein solcher Makro kollidiert notwendigerweise mit
dem Versuch, ein Strukturelement `errno' zu benennen.
errno könnte ein Makro sein, das auf diese _reent struct zugreift. Wie
ist errno definiert und wie _reent?
Unabhängig davon mir fällt die antike K&R-Deklaration von _irq_xxx auf.
Da ich auch im Internet nichts gefunden habe, schreibe ich mal Bill
Gatliff, den Autor des Artikels, an. In der Newlib Doku steht auch nix.
_irq_xxx habe ich selbst in assembler geschieben. Also könnte die
Bezeichnung u.U. mit etwas kollidieren? Gibt es eine library funktion,
die interrupts ein und ausschaltet oder bliebe mir eh nichts anderes
übrig als selbst schreiben?
Grüße
Daniel
Daniel G. schrieb:
> _irq_xxx habe ich selbst in assembler geschieben. Also könnte die> Bezeichnung u.U. mit etwas kollidieren?
Nix dagegen. Nur hast du, möglicherweise ohne es zu wissen, eine
archaische Deklarationstechnik verwendet. So steht
void f();
für eine Funktion mit beliebigen Parametern, jedoch
void f(void);
für eine Funkion ohne Parameter. Es sei denn es ist C++.
Eine Idee ist mir noch gekommen:
Vielleicht ist Newlib ja gar nicht für reentrant functions compiliert.
Ich habe die Toolchain nicht selbst compiliert und den Quelltext nicht,
daher kann ich nicht im Makefile nachsehen.
Der Linker gibt folgende Fehler aus (Auszug), wenn ich ohne die
Stub-Dateien weglasse:
/local_data/dageri/bin/codesourcery-armgcc-2008q1/bin/../lib/gcc/arm-non
e-eabi/4.2.3/../../../../arm-none-eabi/lib/libc.a(lib_a-sbrkr.o): In
function `_sbrk_r':
sbrkr.c:(.text+0x18): undefined reference to `_sbrk'
/local_data/dageri/bin/codesourcery-armgcc-2008q1/bin/../lib/gcc/arm-non
e-eabi/4.2.3/../../../../arm-none-eabi/lib/libc.a(lib_a-writer.o): In
function `_write_r':
writer.c:(.text+0x20): undefined reference to `_write'
/local_data/dageri/bin/codesourcery-armgcc-2008q1/bin/../lib/gcc/arm-non
e-eabi/4.2.3/../../../../arm-none-eabi/lib/libc.a(lib_a-closer.o): In
function `_close_r':
Dort ist schon von xxx_r die rede, also ist Newlib für reentrant
functions compiliert!?! Oder wie kann ich es feststellen?
> "error: expected identifier before '(' token"
Schick den ganzen Kram mal nur durch den Präprozessor (-E statt -c
im Compileraufruf), und guck dir an, was der in diesen Zeilen dann
hinein übersetzt.