Jump to content

Programm in C, was bedeutet eigentlich _wparam ?


ranger930
 Share

Recommended Posts

Moin,

kurze Frage:

im Quelltext der C- Programmbeispiele steht immer hinter dem void noch dieser Text:

__wparam

Bsp.:

#include "cmios.h"

#include "pic18f452.h"

/////////////////////////////////////////////////////////////////////////////

// This function is called by MIOS after startup to initialize the

// application

/////////////////////////////////////////////////////////////////////////////

void Init(void) __wparam

{

  MIOS_SRIO_UpdateFrqSet(2);

  MIOS_SRIO_NumberSet(12);

  MIOS_SRIO_DebounceSet(10);

}

Wozu ist er notwendig ?

MfG ranger930

Link to comment
Share on other sites

hallo ranger,

ich glänze wie immer mit halbwissen; aber soweit ich weiß dient dieses schlüsselwort dazu die übergebenen parameter sozusagen im "arbeitsspeicher" zu halten, damit der funktionsaufruf und die -bearbeitung beschleunigt werden.

bei dem beispiel Init(void) sollte __wparam releativ überflüssig sein, anders sieht es aus bei DIN_NotifyChange(pin, value) __wparam; wo es durchaus sinnvoll ist, den pin und den value im speicher bereit zu halten.

grüße,

Michael

Link to comment
Share on other sites

Stimmt nicht ganz - ohne __wparam werden saemtliche Parameter via Stack uebergeben, mit __wparam wird der erste Parameter im Arbeitsregister (WREG) uebergeben, und die restlichen im Stack.

__wparam ist also besonders praktisch fuer MIOS Funktionen, da sie den ersten Parameter im WREG erwarten - im Gegensatz zu den mehrparametrigen Funktionen ist somit keine Vorbehandlung notwendig.

Aus diesem Grund verwende ich konsequenterweise immer das __wparam Attribut, egal ob es Sinn macht oder nicht.

Gruss,

        Thorsten.

Link to comment
Share on other sites

Moin,

Danke für eure Info's.

Ich versuche mich gerade wieder in C einzulesen,

ist echt schon zu lange her,

ich würde mich sehr freuen, wenn es noch mehr Beispiele geben würde, wie man die spez. hardware- funktionen von Mios

und der vorhanden Hardware- Umgebung programmieren kann, einfache Sachen, wie werden einzelne Buttons abgefragt,

ein struturiertes Beispiel für die meist verwendeten Hardware- Lösungen programmiert in C.

Die Hardware zu bauen ist ja echt kein Thema ( finde ich ),

standard C- Hilfen gibt es auch sehr gute im Net,

aber die Beispiele in C für diese Hardware- Umgebung begreife ich insgesamt leider noch nicht so, dass ich sagen kann:

ja ich komme klar !.

mein Problem:

ich habe Buttons, Encoder und Poti's,

ich möchte in C proggen,

if .. then ... Kontrollstrukturen kann ich lernen,

try and error sozusagen, macht auch höllisch spass, ( der Lernerfolg ist da ),

heute wolte ich eine globale Variable definieren, nur zum testen,

da kam beim compilieren mit "make" die Fehlermeldung " old C style , error ",

jetzt such ich mir einen Wolf,

aber ich gebe nicht auf !

Es würde Anfängern sicherlich helfen, wenn alle User Beispiele posten würden, ich bin leider ich so weit.

TK hat mit mit Sicherheit genug um die Ohren, deshalb hier nochmal meine Bitte:

Bitte postet mehr Einstiegshilfen!

MfG

ranger930

Link to comment
Share on other sites

heute wolte ich eine globale Variable definieren,

da schrieb ich ganz oben in meinem text bei der main.c

Beispiel

unsigned char PlayPauseA;

Es würde Anfängern sicherlich helfen, wenn alle User Beispiele posten würden

auja

bitte bitte bitte bitte bitte  *ehrfürchtig aufdie Knie fall :'(  :'(  :D  :D  ;D

Link to comment
Share on other sites

heute wolte ich eine globale Variable definieren,

da schrieb ich ganz oben in meinem text bei der main.c

unsigned char PlayPauseA;
- Lokale / Block-Variablen: wenn eine Variable in einer Funktion deklariert wird (bei SDCC muss das am Anfang der Funktion passieren), haben wir eine lokale Variable, die nur innerhalb der Funktion gültig ist => block bzw. local scope (lokaler Gültigkeitsbereich). - Lokale Variablen: Wenn sie außerhalb der Funktion (z.B. ganz oben in der Datei) deklariert wird, wie in deinem Beispiel, handelt es sich um eine lokale Variable mit einem file scope (Datei Gültigkeitsbereich), die in der gesamten "Datei" zu verwenden ist. Eine Erweiterung wäre das Schlüsselwort "static" und "volatile", das an dieser Stelle bitte selbständig nachzuschlagen ist. - Globale Variablen: Wenn eine lokale Variable nun zusätzlich im Header (oder darüber) mit dem Schlüsselwort "extern" versehen wird, dann ist es eine globale Variable, die von überall, auch außerhalb dieser Quelldatei ansprechbar ist! also:
// declare myGlobalVar as global
extern unsigned char myGlobalVar
// declare myGlobalVar
unsigned char myGlobalVar

Allerdings sind solche Basics tatsächlich besser nachzulesen, und zwar hier:

http://www.galileo-press.de/openbook/c_von_a_bis_z/

=> Kapitel 11 (Funktionen), Abschnitt 11 (Geltungsbereich von Variablen)

ich würde mich sehr freuen, wenn es noch mehr Beispiele geben würde, wie man die spez. hardware- funktionen von Mios

und der vorhanden Hardware- Umgebung programmieren kann, einfache Sachen, wie werden einzelne Buttons abgefragt,

ein struturiertes Beispiel für die meist verwendeten Hardware- Lösungen programmiert in C.

Es gibt eigentlich nicht mehr, als in der Funktionsübersicht steht:

http://www.ucapps.de/cmios_fun.html

Wir hatten hier schön öfters Diskussionen darüber, dass Anfänger das nicht verstehen, aber meiner Meinung nach, liest das nur keiner richtig!

Die Funktionen sind geordet (DIN => Digial Input, AIN => Analog Input, AOUT => Analog Output usw...), also extrem übersichtlich und gut benannt! Es stehen Erklärungen dabei, was jede Funktion macht und ein Beispiel.

D.h. also, wenn du wissen möchtest, wie ein Button Pin abzufragen ist, dann schaust du einfach unter DIN nach, was es da gibt => da steht dann:

Class: MIOS_DIN

- MIOS_DIN_PinAutoRepeatDisable

- MIOS_DIN_PinAutoRepeatEnable

- MIOS_DIN_PinAutoRepeatGet

- MIOS_DIN_PinGet

- MIOS_DIN_SRGet

naja, ziemlich offensichtlich, dass es sich wohl um MIOS_DIN_PinGet() handelt, dort ist zu lesen:

C_DECLARATION :

unsigned char MIOS_DIN_PinGet(unsigned char pin)

DESCRIPTION:

returns value from a DIN Pin

sollte eigentlich ziemlich klar sein.

Was mir dazu einfällt ist höchstens, dass man mal eine Abkürzungs (Acronym-) Liste im Wiki erstellen könnte:

http://www.midibox.org/dokuwiki/doku.php?id=mbhp_acronyms

habe schon mal begonnen,

wäre nett, wenn alle mithelfen!

Es würde Anfängern sicherlich helfen, wenn alle User Beispiele posten würden

TK hat hervorragende Snippets veröffentlicht:

http://www.ucapps.de/mios_c.html -> ganz unten "C-Programming Examples"

Zusätzlich zu diesen Beispielen, gibt es ziemlich viele Projekte von TK unter den Downloads; v.a. die MF-Applikation (MotorFader) ist komplett in C geschrieben und sehr aufschlussreich:

http://www.ucapps.de/mios_download.html

Ich habe meinen Sensorizer unter GPL veröffentlicht, könnt ihr auch reinschauen; das meiste ist recht gut kommentiert:

http://www.midibox.org/dokuwiki/doku.php?id=acsensorizer

Natürlich gibt's im Forum auch jede Menge Beispiele!

Weiterhin gibt es eine mir sehr wichtige Seite im Wiki, die als Startpunkt für alle möglichen Tipps und Tricks rund ums Programmieren für MIOS steht, wäre super, wenn die noch weiter wächst, ich poste auch immer ganz fleißig:

http://www.midibox.org/dokuwiki/doku.php?id=application_development

;)

Grüße,

Michael

Link to comment
Share on other sites

Noch ein paar Tips:

1. Schau dir machmal das erzeugte *.asm-File im output-Folder an. Es ist gut kommentiert und du findest für jede Programmzeile den entsprechenden Code.  Du musst nicht verstehen, was da im einzelnen passiert, aber es gibt ein Gefühl für die Größe des Codes. Dieser kann sich u.U. mächtig aufblähen.

1a) benutze wenn möglich keine Intervariablen int, sondern char. Erspart ca. die Hälfte an Code.

1b) benutze falls möglich unsigned char statt char bei Vergleichen, der Code wird u.U. nochmals kleiner

1c) Vermeide Zugriff über Pointer!

1d) Vermeide Multiplikationen wenn möglich.

      c = a; for (i = 0; i < b; i++) a+=a; macht deutlich kleineren Code als c = a * b; vorallem wenn a ein

      Integer (z.B. eine Flash-Adresse ist). Ist auch für kleine b nicht langsamer.

2. Vermeide Arrays über 256 Elemente. Wenn du es dennoch willst: liess die entsprechenden Threads

3. Verzichte auf dynamischen Speicher, nimm ein fixes Array was lang genug ist.

4. SDCC-BUG1: Setze immer Klammern in Ausdrücken wie myarray[a+b]; -> myarray[(a+b)];

5. SDCC-BUG2: Vermeide Vergleiche von unsigned char mit 0. z.B.

  unsigned char i;

  for (i = 0; i < 0; i+ü) {

      //body

  } 

  Auch wenn das vielleicht komisch aussieht warum man sowas machen sollte.

  Aber die 0 könnte eine Konstante sein, die mit #define definiert wurde. Z.B. sie Anzahl der Motorfader.

  Und du hast gerade keine Motorfader.

Richtig fies an den Bugs ist (was der eigentliche Bug ist) dass der Code davon abhängt was du sonst noch so drumrum, vorher oder im Schleifen-Body machts. So kann der Code erst was völlig richtiges machen, bevor du auf die Nase fälltst...

6. SDCC-Bug3: Manchmal klappt die Ãœbergabe von Array (im anderen Modul) nicht richtig.

    Z.B.

//in Datei 1

unsigned char MIDIValues[8];

//in Datei 2

MIOS_MIDI_TxBufferPut(MIDIValues[1]);

Da muss man dann sowas stattdessen machen:

unsigend char value = MIDIValues[1]; //explicite temp variable

MIOS_MIDI_TxBufferPut(value);

Warum die Bugs auftreten und ob sie wirklich welche sind, habe ich noch nicht weiter recherchiert.

Vermutlich liegt es an diversen Optimierungen des Compilers.

Man möge mich korrigeren und/oder die Liste an Tipps ergänzen.

Link to comment
Share on other sites

Thomas,

this is an excellent (**an den kopf klatsch**, wir sind ja auf deutsch, brauch ich gar nicht überlegen, was Zusammenfassung heißt  ::) )

meinst du, du könntest das bei gelegenheit hier mit einfügen? :

http://www.midibox.org/dokuwiki/doku.php?id=c_tips_and_tricks_for_pic_programming

wäre super!  :-*

Grüße,

Michael

Link to comment
Share on other sites

  • 1 month later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

×
×
  • Create New...