mikrocontroller.net

Forum: Compiler & IDEs Commands effektiv verarbeiten


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute, ich habe eine I2C Kommunikationsschnittstelle, die schnell 
reagieren muss. So dachte ich mir, es wäre effizienter CMD-Byte aus dem 
Datenstream zu extrahieren und gezielt eine entsprechende Funktion 
ausführen, ohne dabei viel Zeit mit IF oder SWITCH- Abfragen zu 
verlieren.

Mach es Sinn sich was in diese Richtung zu überlegen? Also ich habe mir 
vorgestellt, zu jedem CMD eine entsprechende Funktion zu erstellen und 
diese  dann aufzurufen, z.B. CMD "0x0A" wird in der Funktion 
translate_cmd() erkannt und ruft folglich die Funktion f_A() auf. Geht 
sowas überhaupt?

Autor: iaby (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du könntest dir ein Array mit Function-Pointern anlegen!
Das 0x0A wäre dann der Index für das Array, wo der Pointer auf die 
entsprechende Funktion hinterlegt ist!

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Gast (Gast)

>Hallo Leute, ich habe eine I2C Kommunikationsschnittstelle, die schnell
>reagieren muss.

Naja, hast du schonmal über die Relationen nachgedacht?

I2C arbeitet mit 100..400 kbit/s, macht ~11..44 kBytes/s, sprich 
23..90us/Byte. Eine CPU mit beispielsweise 8 MHz macht in der Zeit 
~184..736 Takte. Das sollte reichen, um einen normalen switch() 
auszuwerten.

MFG
Falk

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gast wrote:
> Hallo Leute, ich habe eine I2C Kommunikationsschnittstelle, die schnell
> reagieren muss. So dachte ich mir, es wäre effizienter CMD-Byte aus dem
> Datenstream zu extrahieren und gezielt eine entsprechende Funktion
> ausführen, ohne dabei viel Zeit mit IF oder SWITCH- Abfragen zu
> verlieren.
>
> Mach es Sinn sich was in diese Richtung zu überlegen?

Ja.
Macht nicht nur wegen der gesparten Auswertezeit sinn, sondern,
du wirst es gleich sehen, man dadurch eine sehr wartungsfreundliche
Struktur bekommt.

Voraussetzungen:
Deine CMD-Bytes sollten aufsteigend vergeben werden.

> Also ich habe mir
> vorgestellt, zu jedem CMD eine entsprechende Funktion zu erstellen und
> diese  dann aufzurufen, z.B. CMD "0x0A" wird in der Funktion
> translate_cmd() erkannt und ruft folglich die Funktion f_A() auf. Geht
> sowas überhaupt?
typedef void (*Function)( void );

void process_00()    // Bearbeitet das Commando mit Cmd Code 0x00
{
}

void help()          // Bearbeitet das Commando mit Cmd Code 0x01
{
}

void shutdown()      // Bearbeitet das Commando mit Cmd Code 0x02
{
}

void stop()          // Bearbeitet das Commando mit Cmd Code 0x04
{
}

Function CmdFunctions[] = 
{
   process_00,       // Commando = 0x00
   help,             //            0x01
   shutdown,         //            0x02
   NULL,             //  für 0x03 gibt es keine Behandlung
   stop              //            0x04
};

#define ARRAY_SIZE(X) ( sizeof(X) / sizeof(*(X)) )

void translate_cmd( uint8_t Code )
{
  if( Code > ARRAY_SIZE( CmdFunctions ) )
    return;

  Function Fnc = CmdFunctions[ Code ];    // Funktion bestimmen
  if( Fnc != NULL )
    (*Fnc)();                    // Funktion aufrufen
}

Siehe auch:
http://www.mikrocontroller.net/articles/FAQ#Funktionszeiger

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ iaby: ich schaue, ob es dadurch schneller wird
@ falk: das ist mir klar, doch bin ich in der Situation, wo ich es 
nöttig habe und ab 115 Abfragen nichts mehr geht.
@ Karl: vielen Dank für die Anregung

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner wrote:
> Naja, hast du schonmal über die Relationen nachgedacht?
>
> I2C arbeitet mit 100..400 kbit/s, macht ~11..44 kBytes/s, sprich
> 23..90us/Byte. Eine CPU mit beispielsweise 8 MHz macht in der Zeit
> ~184..736 Takte. Das sollte reichen, um einen normalen switch()
> auszuwerten.

Wie schon gesagt, wenn du richtig viele Befehle hast? Außerdem heißt I2C 
nicht automatisch immer 100 oder 400kbit/s. Das originale I2C 
vielleicht.

Aber man kann ja den I2C Bus auch mit höheren Frequenzen betreiben.

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
I2C - gepollt oder per IRQ?
Polling frisst natürlich gewaltig viel Rechenzeit wenn die CPU auf die 
daten warten muss.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.