mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem bei Funktionsaufruf und unsigned long Übergabeparameter (SiLabs F500)


Autor: Mr Bean (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Ich habe folgende Funktion um eine Zahl in einen String 
umzuwandeln:
int8_t num2string(unsigned int num, int size, char *retbuffer){
  int i;
      
  switch (size){
    case OBJ_UNSIGNED32:      
      // Zeichenkette erzeugen
      sprintf(retbuffer, "%2x%2x%2x%2x", (unsigned int) ((num& 0xff)),(unsigned int) ((num& 0xff00) >> 8),(unsigned int) ((num& 0xff0000) >> 16),(unsigned int) ((num& 0xff000000) >> 24) );
      break;
    case OBJ_UNSIGNED16 | OBJ_INDEX:      
      // Zeichenkette erzeugen
      sprintf(retbuffer, "%2x%2x", (unsigned int)((num& 0xff)), (unsigned int)((num& 0xff00) >> 8));
      break;           
    case OBJ_UNSIGNED8 | OBJ_SUBINDEX:      
      // Zeichenkette erzeugen
      sprintf(retbuffer, "%2x",(unsigned int) (num & 0xff) );
      break;
        default:
            return -1;       
  }
  
  for ( i = 0; i < strlends(retbuffer); i++)
  {
    if (retbuffer[i] == ' ')
    {
      retbuffer[i] = '0';
    }
  }   
  return SUCCESS;
}

wenn ich nun eine unsigned long Variable in eine String wandeln möchte, 
macht mir natürlich der Übergabeparameter (unsigned int) Probleme. Nun 
wollte ich den Aufruf der Funktion einfach in:
int8_t num2string(unsigned long num, int size, char *retbuffer){
ändern. Dann läuft mein Controller aber nichteinmal mehr los. Alle 
angeschlossenen LED`s sowie jedliche Kommunikation bleiben/bleibt aus.

Könnt ihr mir sagen woran das lieg? Oder mir einen anderen 
Lösungsvorschlag geben?

Grüße

Bean

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

Bewertung
0 lesenswert
nicht lesenswert
Mr Bean schrieb:

> wollte ich den Aufruf der Funktion einfach in:
>
> int8_t num2string(unsigned long num, int size, char *retbuffer){
> 
> ändern.

Und alles erneut durchcompilieren.

> Dann läuft mein Controller aber nichteinmal mehr los.

Dann musst du rauskriegen woran das liegt.
Speicher voll?
An der Funktion selbst liegt es erst mal nicht.

> Alle angeschlossenen LED`s sowie jedliche Kommunikation
> bleiben/bleibt aus.

Das ist zwar ein eindeutiges Symptom, allerdings zur Fehlerdiagnose 
nicht ausreichend. Da musst du schon ein wenig mehr Aufwand reinstecken, 
bis aus dieser Symptombeschreibung die Diagnose 'Controller läuft nicht 
mehr los' abgeleitet werden kann. Was passiert denn am Anfan des 
Programms? Lass doch mal am Anfang des Programms eine LED aufleuchten, 
gleich als allererstes, noch ehe irgendwas anderes passiert. Wenn die 
auch nicht mehr kommt, dann kann man darüber nachdenken warum dein 
'Controller nicht mehr losläuft'.


PS:
Den Teil hier
  for ( i = 0; i < strlends(retbuffer); i++)
  {
    if (retbuffer[i] == ' ')
    {
      retbuffer[i] = '0';
    }
  }   
kannst du dir sparen.
1) ist der strlends in der Abbruchbedingung nicht so glücklich, denn
   strlends wird dadurch bei jedem Schleifendurchlauf erneut
   aufgerufen. Die Länge des Strings ändert sich aber in der
   Schleife gar nicht.

2) kann die beabsichtigte Funktionalität (führende 0-en) auch das
   jeweilige sprintf übernehmen. Man muss es ihm im Formatstring nur
   sagen, dass es das tun soll:
      sprintf(retbuffer, "%02x",(unsigned int) (num & 0xff) );
   und schon macht sprintf anstelle der Leerzeichen da führende 0-en
   rein

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Könnt ihr mir sagen woran das lieg?

Ich vermute Programmierstil..

> Oder mir einen anderen Lösungsvorschlag geben?

Übergib die Daten per Adresse (vorzugsweise als void*), dann ersparst Du 
Dir die unanständigen Sachen.

Anmerken möchte ich noch folgende zwei Zeilen:

> case OBJ_UNSIGNED16 | OBJ_INDEX:
> case OBJ_UNSIGNED8 | OBJ_SUBINDEX:

Bist Du Dir bewusst, dass das binäre 'oder' hier zum umgangssprachlichen 
'und' mutiert?

Autor: Mr Bean (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Vielen Dank für die Tipps! Ich hab meine Funktion nun etwas 
umgeschrieben:
int8_t num2string(unsigned int num, int size, char *retbuffer){
  int i;
      
  switch (size){
    case OBJ_UNSIGNED32:      
      // Zeichenkette erzeugen
      sprintf(retbuffer, "%02x%02x%02x%02x", (unsigned int) ((num& 0xff)),(unsigned int) ((num& 0xff00) >> 8),(unsigned int) ((num& 0xff0000) >> 16),(unsigned int) ((num& 0xff000000) >> 24) );
      break;
    case OBJ_UNSIGNED16:
    case OBJ_INDEX:      
      // Zeichenkette erzeugen
      sprintf(retbuffer, "%02x%02x", (unsigned int)((num& 0xff)), (unsigned int)((num& 0xff00) >> 8));
      break;           
    case OBJ_UNSIGNED8:
    case OBJ_SUBINDEX:      
      // Zeichenkette erzeugen
      sprintf(retbuffer, "%02x",(unsigned int) (num & 0xff) );
      break;
        default:
            return -1;       
  }   
  return SUCCESS;
}

Allerdings hab ich das Problem mit dem nicht loslaufenden Code 
immernoch. Ich habe schon eine LED die zu allererst gesetzt wird (noch 
vor meiner whileschleife und den Initialisierungen). Auch diese LED 
macht keine Muckser.
Werde jetzt mal das mit dem void* probieren.

Grüße

Bean

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich habe schon eine LED die zu allererst gesetzt wird (noch
> vor meiner whileschleife und den Initialisierungen). Auch diese LED
> macht keine Muckser.

Setz bei der mal ein hinreichend langes sleep dazu, sodass Du 
entscheiden kannst ob die Kiste durchgehend resets macht (oder was 
anderes schief geht).

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

Bewertung
0 lesenswert
nicht lesenswert
Mr Bean schrieb:

> Allerdings hab ich das Problem mit dem nicht loslaufenden Code
> immernoch. Ich habe schon eine LED die zu allererst gesetzt wird (noch
> vor meiner whileschleife und den Initialisierungen). Auch diese LED
> macht keine Muckser.
> Werde jetzt mal das mit dem void* probieren.

Das wird nichts bringen.

Schau dir den Erstellprozess des Programms an.
Achte aucf Kennwerte wie Speicherauslastung. Alles was sich bedenklich 
den 90% nähert, sollte näher untersucht werden (Über 100% ist sowieso 
klar)

Autor: Mr Bean (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Wo kann ich sowas sehen?
In der *.l51 Datei!?
Oder gibt es irgendwelche anderen Möglichkeiten die 
Codegröße/Speicherauslastung zu untersuchen? Arbeite mit dem Tasking 
Compiler und der Tasking EDE.

Grüße

Bean

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

Bewertung
0 lesenswert
nicht lesenswert
Mr Bean schrieb:
> Hallo Wo kann ich sowas sehen?
> In der *.l51 Datei!?
> Oder gibt es irgendwelche anderen Möglichkeiten die
> Codegröße/Speicherauslastung zu untersuchen? Arbeite mit dem Tasking
> Compiler und der Tasking EDE.

Gibts da keine Statistik am Ende des Vorgangs?
Normalerweise wird während des Buildens auch ein 'Map-File' erzeugt, in 
dem die interne Struktur des Programms genauer aufgeschlüsselt ist.

Da musst du jetzt suchen gehen.

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
..üblicherweise(tm) [1] gibts auch einen extra (Kommandozeilen)Befehl à 
la 'size', der zu einer hex-/elf-/bin-/..datei deren Zusammensetzung 
ausspuckt.

[1] auf anständigen(tm) Systemen

Autor: Pieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
moin moin,

hole dir mal bei Silabs das Config-Tool.
Bei Dir wird der Watschen-Hund zubeissen;-)

Mit Gruß
Pieter

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.