Wäre es nicht besser, das irgendwie mit #define als Makro zu schreiben
und sich diesen umständlichen und CPU-Zeit fressenden Funktionsaufruf zu
sparen?
Was sagt dein Profiling?
Ist die Zeit ein Problem?
Wenn nicht, dann lass es so.
Oder schreib dir Einzelmakros für jeden Port
Ob du an der verwendenden Stelle
Port_tgl( 1, 5 );
schreibst, oder gleich
GP1DAT ^= 1 << 5;
oder
TOGGLE_BIT( GP1DAT, 5 );
ist gehupft wie gesprungen. Aber da du von alleine nicht auf die Idee
kommst, lass es erst mal so, solange keine Notwendigkeit besteht.
Andi D. schrieb:> deklarier die funktionen als inline und schau dir an was dein compiler> raus baut
Der Compiler ist der Realview von Keil, der µC ist der ADµC7126.
Ok sorry hier ist das GCC-Forum, mein Fehler...
Wenn ich der Funktionsdefinition ein inline voranstelle gibt's
Fehlermeldungen zuhauf...
wegen der Lesbarkeit raushaben.
Bei diesem ADµC ist es so:
Table 87. GPxSET MMR Bit Descriptions
Bit Description
[31:24] Reserved.
[23:16] Data Port x set bit.Set to 1 by the user to set
a bit on Port x;
also sets the corresponding bit in the GPxDAT MMR.
Cleared to 0 by the user; does not affect the data output.
[15:0] Reserved
Im Code soll einfach nur sowas wie
> stehen
Das soll dort SO überhaupt nicht stehen. Die direkten Zahlen willst du
DA nämlich überhaupt nicht haben.
Wenn schon, dann soll da stehen
Port_set( LED_PORT, ERROR_LED );
Und ob da dann eine Funktion aufgerufen wird, oder ein Makro expandiert
wird
Peter Zz schrieb:> Wenn ich der Funktionsdefinition ein inline voranstelle gibt's> Fehlermeldungen zuhauf...
Ach, und der Compiler gibt kein weiteres Indiz dafür, um welche Fehler
es sich handeln könnte oder wo die aufgetreten sind?
Peter Zz schrieb:> Wenn ich der Funktionsdefinition ein inline voranstelle gibt's> Fehlermeldungen zuhauf...
Finde ich auch sonderbar, warum immer derartige Aussagen mit null Inhalt
gepostet werden.
Hat exakt die gleiche Aussagekraft wie dieser Wetterbericht:
"Auch heute ist im Verlaufe des Tages mit Wetter zu rechnen."
Ein simples copy&paste der ersten Fehlermeldung scheint ja höllisch
kompliziert zu sein.
Peter
Peter Dannegger schrieb:> Ein simples copy&paste der ersten Fehlermeldung scheint ja höllisch> kompliziert zu sein.
Leider geht unter µVision3 ein "Copy and paste" nicht,
nur als Screenshoot, siehe Dateianhang
Peter Zz schrieb:> Leider geht unter µVision3 ein "Copy and paste" nicht,
Dann wäre das das erste Windowsprogramm, wo es nicht geht.
Außerdem werden Fehlermeldungen vom Compiler in ein Textfile
geschrieben. Such mal im Projekt nach einem File, das diesen Text
beinhaltet.
Peter
Peter Dannegger schrieb:> Dann wäre das das erste Windowsprogramm, wo es nicht geht.
Ist z.B. AVRStudio 4.xx kein Windowsprogramm?
> Außerdem werden Fehlermeldungen vom Compiler in ein Textfile> geschrieben. Such mal im Projekt nach einem File, das diesen Text> beinhaltet.
Das werd ich machen.
Aber eigentlich sollte dieser Thread nicht in Richtung inline Funktion
gehen, sondern mir geht es eher um Makros.
Ich habe jetzt:
dies funktioniert auch, allerdings würde ich das lieber ohne diesen
Register-Namen (GPxDAT, GPxSET, GPxCLR) haben.
Das folgende Beispiel sollte das so machen, aber funktioniert nicht:
> error #77-d this declaration has no storage class or type specifier
Die Fehlermeldung sagt mir nichts, klingt aber interessant.
Google findet da einiges, muß irgendwie mit ARM7 und C++ zu tun haben.
Da ist wohl irgendne Schweinerei in den Macros GPxSET.
Peter
> dies funktioniert auch, allerdings würde ich das lieber ohne diesen> Register-Namen (GPxDAT, GPxSET, GPxCLR) haben.
Du hast den entscheidenden Witz an der Sache
noch nicht verstanden. Lass das mal auf dich wirken und überleg dir,
worin wohl der programmtechnisch strategische Unterschied zwischen den
folgenden beiden Zeilen besteht
> Das folgende Beispiel sollte das so machen,
Nein. Das sollte es nicht.
Wie schon geasgt: Du brauchst ein C-Buch.
Ohne wird das nichts
Für Puristen: Das wäre ein Einsatzfall für den Preprozessor Tokenize
Operator ##
Aber wie schon ausgeführt: Es gibt eine WESENTLICH bessere Möglichkeit.
Und die solltest du auch gehen! Dein Programmierstil und die Wartbarkeit
deines Programmes wird es dir danken.
Peter Dannegger schrieb:> Die Fehlermeldung sagt mir nichts, klingt aber interessant.> Google findet da einiges, muß irgendwie mit ARM7 und C++ zu tun haben.
ich will dieses inline im Moment nicht vertiefen
Lieber die Makro's
> Da ist wohl irgendne Schweinerei in den Macros GPxSET.
Meinst du in dem von mir geschriebenen Makros?
Peter Zz schrieb:> Die sind tatsächlich vorhanden, keine Makros!
Das sind mit einiger Sicherheit irgendwelche Makros, mit denen die Namen
auf Adresspointer umgemappt werden.
Die haben garantiert ihren Compiler nicht dahingehend erweitert, dass er
diese Namen als Schlüsselwörter kennt.
Karl Heinz Buchegger schrieb:> BIT_SET( LED_PORT, ERROR_LED );>> und warum das sehr viel besser ist als> BIT_SET( 1, 5 );>> noch nicht verstanden. Lass das mal auf dich wirken und überleg dir,> worin wohl der programmtechnisch strategische Unterschied zwischen den> folgenden beiden Zeilen besteht> BIT_SET( LED_PORT, ERROR_LED );> BIT_SET( 1, 5 );
Doch doch, schon verstanden, schon gewusst.
Ich würde dann sogar noch weiter gehen:
Karl Heinz Buchegger schrieb:> Peter Zz schrieb:>>> Die sind tatsächlich vorhanden, keine Makros!>>> Das sind mit einiger Sicherheit irgendwelche Makros, mit denen die Namen> auf Adresspointer umgemappt werden.> Die haben garantiert ihren Compiler nicht dahingehend erweitert, dass er> diese Namen als Schlüsselwörter kennt.
Moment mal.
Da steckt noch mehr dahinter.
Wenn das hier
case 3: GP3CLR = 1 << bit;break;
korrekt ist (das ist eine einfache Zuweisung!), dann muss da mehr
dahinter sein.
Such doch mal deine System Include Files durch. Die Grossschreibung von
GP3CLR weißt darauf hin, dass es sich da um ein Makro handelt. In
irgendeinem System Header File wird es da einen #define dafür geben.
(Ich schätze mal, dass da eine ähnliche Technik dahinter steckt, wie die
Bitunion, die PeDa gerne verwendet)
Karl Heinz Buchegger schrieb:> Die Grossschreibung von> GP3CLR weißt darauf hin, dass es sich da um ein Makro handelt.
Ne, schau mal ADuC7126 POrt-Register.pdf
Peter Zz schrieb:> Karl Heinz Buchegger schrieb:>> Die Grossschreibung von>> GP3CLR weißt darauf hin, dass es sich da um ein Makro handelt.>> Ne, schau mal ADuC7126 POrt-Register.pdf
Uninteressant.
Beim AVR heissen die Dingeer im Datenblatt auch PORTA. Trotzdem ist
PORTA in der Programmiersprache als #define realisiert.
Die Frage ist nicht, wie das am Prozessor heißt, die Frage ist: Wie ist
es dem Compiler beigebracht worden! Das sind 2 Paar verschiedene Schuhe.
Der COmpiler kennt von Haus aus nur ein paar Schlüsselwörter
if, while, do, goto, int, long, double, float, struct, union, ... und
natürlich die ganzen Operatoren.
Alles andere wird in den Systemheaderfiles aus diesen Bausteinen
zusammengebaut.
Zum PDF.
Ein GP1SET könnte zb so in einem Header File stehen
#define GP1SET (*(volatile unsigned char*)0xFFFFF434)
könnte so sein. Muss aber nicht.
pic tech schrieb:> Alles ungeprüft, aber theoretisch:>> #ifndef CONCAT> #define CONCAT(x,y) x##y> #endif> #define Bit_Port_(x,y) (CONCAT(x,y))> #define Bit_Port(x,y) Bit_Port_(CONCAT(GP,y),x)> #define Bit_(u,v,x,y,z) (Bit_Port(u,x) CONCAT(v,=) ( 1 << ((y) + z)))>> #define Bit_set(x,y) Bit_(SET,|,x,y,16)> #define Bit_clr(x,y) Bit_(CLR,|,x,y,16)> #define Bit_tgl(x,y) Bit_(DAT,^,x,y,16)
Ich hab da, glaub ich, einen Fehler gemacht.
Wir von der AVR Fraktion sind daran gewöhnt, dass wir uns um die
Bitverknüpfung selbst kümmern müssen. Bei diesem µC scheint es aber so
zu sein, dass alleine die Zuweisung an zb ein xxxCLR Register reicht, um
das "Bit Clearing" (schreckliches Wort) auszulösen.
D.h. die Operation braucht man gar nicht. Die ist implizit im
'Register'-Namen schon drinnen.
So gesehen muss ich zurückrudern.
Die Sache mit dem Tokinize ist doch nicht so schlecht.
Auf die einfachste Lösung ist noch keiner gekommen: Der Compiler kennt
schlicht und ergreifend das Schlüsselwort 'inline' nicht.
Und es ist egal, da die korrekte Lösung, die das Anliegen des TO und die
Belange der Wartbarkeit erfüllt, bereits gepostet wurde.
Was die Fehlermeldung angeht, wird da sicherlich folgendes passieren:
Der Compiler stößt in Zeile 114 auf das Wörtchen 'inline'. Die Zeile
compilierte vorher fehlerfrei (nehme ich an), daher kann nur das
'inline' der Verursacher sein. Nun ist dem Compiler dieses Schlüsselwort
unbekannt, das ist ja auch kein Bestandteil älterer C-Standards. Also
interpretiert er 'inline' als Deklaration einer Variablen eben dieses
Namens. Und weil da kein Typ davor stand, kommt die Fehlermeldung "this
declaration has no type". Stimmt ja auch.
Die restlichen Fehlermeldungen sind ohnehin Grütze, verlässilch ist ja
immer nur die erste Fehlermeldung.
Sam P. schrieb:> Auf die einfachste Lösung ist noch keiner gekommen: Der Compiler kennt> schlicht und ergreifend das Schlüsselwort 'inline' nicht.
Mir ist diese Idee auch gekommen, aber erst nach dir. ;-)
Vermutlich wird der Compiler nicht ISO-C-konform sein, sondern nur
dessen Vorgänger implementieren. Da gab es noch kein inline.
Ich verstehe nicht, was die ARM-Entwickler sich bei diesen umständlichen
Set- und Clear-Registern bloß gedacht haben.
Da hat man nun 4 Miliarden Befehle, aber für ein paar Bitbefehle hats
nicht mehr gereicht.
Jeden 8-Bitter ohne Bitbefehle würde man sofort in die Tonne kloppen.
Aber nur weil 32 Bit ja so hip ist, toleriert man bei denen diesen Mist.
Ich bleib da lieber bei 8 Bit und kann dann bequem und gut lesbar
schreiben: