mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik unerklärliche Änderung von Variablenwerten


Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

MENU_MACChange
(
)
/*****************************************************************************/
{
   EEPROM_Read(pu8Data,EEPROM_MAC_ADDRESS_LENGTH, EEPROM_MAC_ADDRESS_OFFSET );
   sprintf(cMAC,"%02x%02x.%02x.%02x.%02x.%02x",pu8Data[0],pu8Data[1],pu8Data[2]
           ,pu8Data[3],pu8Data[4],pu8Data[5]);
  LCD_Clear();
  LCD_Goto(0,0);
  LCD_PutS(cMAC);
  LCD_Goto(0,0);
  u8Cursor=0;
  
  while(u8ExitMAC!=1)
  {  
    xil_printf("%02x%02x.%02x.%02x.%02x.%02x\n\n",pu8Data[0],pu8Data[1],pu8Data[2]
           ,pu8Data[3],pu8Data[4],pu8Data[5]);
    KBD_Read(pu8Key);
    if(*pu8Key!=0x01) LCD_DelayMS(KBD_POLL_CYCLE);
    
    switch(*pu8Key){
      case 'R': 
      {  
        if(u8Cursor==15) LCD_Goto(0,0);
        u8Cursor++;
        LCD_Goto(0,u8Cursor);  
        break;
      }
      case 'L': 
      {
        if(u8Cursor==0) LCD_Goto(0,15);
        u8Cursor--;
        LCD_Goto(0,u8Cursor);        
        break;
      }
      case 'U':
      {
        switch(u8Cursor)
        {
        case 0:
        {        
          pu8Data[0] = pu8Data[0] + 0x10;
          LCD_Goto(0,0);
          sprintf(&cMACbyte,"%02x",pu8Data[0]);
          LCD_PutS(&cMACbyte);
          LCD_Goto(0,u8Cursor);
          break;
        }
        case 1:
        {        
          pu8Data[0] = pu8Data[0] + 0x01;
          LCD_Goto(0,0);
          sprintf(&cMACbyte,"%02x",pu8Data[0]);
          LCD_PutS(&cMACbyte);
          LCD_Goto(0,u8Cursor);
          break;
        }
        case 2:
        {        
          pu8Data[1] = pu8Data[1] + 0x10;
          LCD_Goto(0,2);
          sprintf(&cMACbyte,"%02x",pu8Data[1]);
          LCD_PutS(&cMACbyte);
          LCD_Goto(0,u8Cursor);
          break;
        }
        case 3:
        {        
          pu8Data[1] = pu8Data[1] + 0x01;
          LCD_Goto(0,2);
          sprintf(&cMACbyte,"%02x",pu8Data[1]);
          LCD_PutS(&cMACbyte);
          LCD_Goto(0,u8Cursor);
          break;
        }
        case 5:
        {        
          pu8Data[2] = pu8Data[2] + 0x10;
          LCD_Goto(0,5);
          sprintf(&cMACbyte,"%02x",pu8Data[2]);
          LCD_PutS(&cMACbyte);
          LCD_Goto(0,u8Cursor);
          break;
        }
        case 6:
        {        
          pu8Data[2] = pu8Data[2] + 0x01;
          LCD_Goto(0,5);
          sprintf(&cMACbyte,"%02x",pu8Data[2]);
          LCD_PutS(&cMACbyte);
          LCD_Goto(0,u8Cursor);
          break;
        }
        case 8:
        {        
          pu8Data[3] = pu8Data[3] + 0x10;
          LCD_Goto(0,8);
          sprintf(&cMACbyte,"%02x",pu8Data[3]);
          LCD_PutS(&cMACbyte);
          LCD_Goto(0,u8Cursor);
          break;
        }
        case 9:
        {        
          pu8Data[3] = pu8Data[3] + 0x01;
          LCD_Goto(0,8);
          sprintf(&cMACbyte,"%02x",pu8Data[3]);
          LCD_PutS(&cMACbyte);
          LCD_Goto(0,u8Cursor);
          break;
        }
        case 11:
        {        
          pu8Data[4] = pu8Data[4] + 0x10;
          LCD_Goto(0,11);
          sprintf(&cMACbyte,"%02x",pu8Data[4]);
          LCD_PutS(&cMACbyte);
          LCD_Goto(0,u8Cursor);
          break;
        }
        case 12:
        {        
          pu8Data[4] = pu8Data[4] + 0x01;
          LCD_Goto(0,11);
          sprintf(&cMACbyte,"%02x",pu8Data[4]);
          LCD_PutS(&cMACbyte);
          LCD_Goto(0,u8Cursor);
          break;
        }
        case 14:
        {        
          pu8Data[5] = pu8Data[5] + 0x10;
          LCD_Goto(0,14);
          sprintf(&cMACbyte,"%02x",pu8Data[5]);
          LCD_PutS(&cMACbyte);
          LCD_Goto(0,u8Cursor);
          break;
        }
        case 15:
        {        
          pu8Data[5] = pu8Data[5] + 0x01;
          LCD_Goto(0,14);
          sprintf(&cMACbyte,"%02x",pu8Data[5]);
          LCD_PutS(&cMACbyte);
          LCD_Goto(0,u8Cursor);
          break;
        }
        default: break;
        }/*switch Cursor*/
        break;
      }
      case 'D':
      {
        switch(u8Cursor)
        {
        case 0:
        {        
          pu8Data[0] = pu8Data[0] - 0x10;
          LCD_Goto(0,0);
          sprintf(&cMACbyte,"%02x",pu8Data[0]);
          LCD_PutS(&cMACbyte);
          LCD_Goto(0,u8Cursor);
          break;
        }
        case 1:
        {        
          pu8Data[0] = pu8Data[0] - 0x01;
          LCD_Goto(0,0);
          sprintf(&cMACbyte,"%02x",pu8Data[0]);
          LCD_PutS(&cMACbyte);
          LCD_Goto(0,u8Cursor);
          break;
        }
        case 2:
        {        
          pu8Data[1] = pu8Data[1] - 0x10;
          LCD_Goto(0,2);
          sprintf(&cMACbyte,"%02x",pu8Data[1]);
          LCD_PutS(&cMACbyte);
          LCD_Goto(0,u8Cursor);
          break;
        }
        case 3:
        {        
          pu8Data[1] = pu8Data[1] - 0x01;
          LCD_Goto(0,2);
          sprintf(&cMACbyte,"%02x",pu8Data[1]);
          LCD_PutS(&cMACbyte);
          LCD_Goto(0,u8Cursor);
          break;
        }
        case 5:
        {        
          pu8Data[2] = pu8Data[2] - 0x10;
          LCD_Goto(0,5);
          sprintf(&cMACbyte,"%02x",pu8Data[2]);
          LCD_PutS(&cMACbyte);
          LCD_Goto(0,u8Cursor);
          break;
        }
        case 6:
        {        
          pu8Data[2] = pu8Data[2] - 0x01;
          LCD_Goto(0,5);
          sprintf(&cMACbyte,"%02x",pu8Data[2]);
          LCD_PutS(&cMACbyte);
          LCD_Goto(0,u8Cursor);
          break;
        }
        case 8:
        {        
          pu8Data[3] = pu8Data[3] - 0x10;
          LCD_Goto(0,8);
          sprintf(&cMACbyte,"%02x",pu8Data[3]);
          LCD_PutS(&cMACbyte);
          LCD_Goto(0,u8Cursor);
          break;
        }
        case 9:
        {        
          pu8Data[3] = pu8Data[3] - 0x01;
          LCD_Goto(0,8);
          sprintf(&cMACbyte,"%02x",pu8Data[3]);
          LCD_PutS(&cMACbyte);
          LCD_Goto(0,u8Cursor);
          break;
        }
        case 11:
        {        
          pu8Data[4] = pu8Data[4] - 0x10;
          LCD_Goto(0,11);
          sprintf(&cMACbyte,"%02x",pu8Data[4]);
          LCD_PutS(&cMACbyte);
          LCD_Goto(0,u8Cursor);
          break;
        }
        case 12:
        {        
          pu8Data[4] = pu8Data[4] + 0x01;
          LCD_Goto(0,11);
          sprintf(&cMACbyte,"%02x",pu8Data[4]);
          LCD_PutS(&cMACbyte);
          LCD_Goto(0,u8Cursor);
          break;
        }
        case 14:
        {        
          pu8Data[5] = pu8Data[5] - 0x10;
          LCD_Goto(0,14);
          sprintf(&cMACbyte,"%02x",pu8Data[5]);
          LCD_PutS(&cMACbyte);
          LCD_Goto(0,u8Cursor);
          break;
        }
        case 15:
        {        
          pu8Data[5] = pu8Data[5] - 0x01;
          LCD_Goto(0,14);
          sprintf(&cMACbyte,"%02x",pu8Data[5]);
          LCD_PutS(&cMACbyte);
          LCD_Goto(0,u8Cursor);
          break;
        }
        default: break;
        }/*switch Cursor*/
        break;
      }
      case 'O':
      {
        EEPROM_Write( pu8Data,EEPROM_MAC_ADDRESS_LENGTH,EEPROM_MAC_ADDRESS_OFFSET );
        EEPROM_Read(pu8Data,EEPROM_MAC_ADDRESS_LENGTH, EEPROM_MAC_ADDRESS_OFFSET );
         xil_printf("%02x%02x.%02x.%02x.%02x.%02x",pu8Data[0],pu8Data[1],pu8Data[2]
           ,pu8Data[3],pu8Data[4],pu8Data[5]);
        
        u8ExitMAC=1;
        break;
      }
      case 'C':
      {
        u8ExitMAC=1;
        break;
      }
      default: break;
    }
    
  }
  
}



Sobald die while schleife augerufen wird ändenr sich die werte des 
pu8Data Feldes auf unerklärliche Weise. Hat jemand eien Idee hierzu?

danke

Autor: Lehrmann Michael (ubimbo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hans schrieb:
> Sobald die while schleife augerufen wird ändenr sich die werte des
> pu8Data Feldes auf unerklärliche Weise. Hat jemand eien Idee hierzu?

Du machst ja permanent was mit dem pu8Data - warum wundert es dich, dass 
sich das Array ändert. Die switch wird ja mit jedem Durchlauf des 
Main-Programms bearbeitet.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, *pu8Key enthält ein 'U' ein 'O' oder ein 'D'.
In diesen Fällen wird pu8Data potentiell geändert.

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja das problem ist das sich pu8Data auch ändert ohen das die Fälle 
'U''O' oder 'D' eintreten.

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

Bewertung
0 lesenswert
nicht lesenswert
Kannst du deinen Code nicht erst mal ein wenig bereinigen?
Diese Copy&Paste Programmierung ist doch unüberschaubar!

ZB
vereinfacht sich das hier
      case 'D':
      {
        switch(u8Cursor)
        {
        case 0:
        {        
          pu8Data[0] = pu8Data[0] - 0x10;
          LCD_Goto(0,0);
          sprintf(&cMACbyte,"%02x",pu8Data[0]);
          LCD_PutS(&cMACbyte);
          LCD_Goto(0,u8Cursor);
          break;
        }
        case 1:
        {        
          pu8Data[0] = pu8Data[0] - 0x01;
          LCD_Goto(0,0);
          sprintf(&cMACbyte,"%02x",pu8Data[0]);
          LCD_PutS(&cMACbyte);
          LCD_Goto(0,u8Cursor);
          break;
        }
        case 2:
        {        
          pu8Data[1] = pu8Data[1] - 0x10;
          LCD_Goto(0,2);
          sprintf(&cMACbyte,"%02x",pu8Data[1]);
          LCD_PutS(&cMACbyte);
          LCD_Goto(0,u8Cursor);
          break;
        }
        case 3:
        {        
          pu8Data[1] = pu8Data[1] - 0x01;
          LCD_Goto(0,2);
          sprintf(&cMACbyte,"%02x",pu8Data[1]);
          LCD_PutS(&cMACbyte);
          LCD_Goto(0,u8Cursor);
          break;
        }

zu dem hier
      case 'D':
      {
        if( u8Cursor % 2 == 0 )
          offset = 0x10;
        else
          offset = 0x01;

        index = u8Cursor / 2;

        pu8Data[index] = pu8Data[index] - offset;
        LCD_Goto( 0, 0 );
        sprintf( cMACbyte, "%02x", pu8Data[index] );
        LCD_PutS( cMACbyte );
        LCD_Goto( 0, u8Cursor );
      }

Ich hab jetzt nur die Fälle bis 3 durchgesehen, die restlichen hab ich 
nicht weiter genauer untersucht, aber beim schnellen hinschauen sind 
auch sie alle mit den paar Zeilen Code abgedeckt und wenn nicht müsste 
man sich ein kleines Array machen, welches zum Umsetzen des u8Cursor in 
die richtige Indexnummer benutzt wird.

Auf jeden Fall: Deine 25-tausend Seiten Code kann man auf ein paar 
wenige Zeilen eindampfen. Und dann verliert man auch nicht so schnell 
die Übersicht.

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

Bewertung
0 lesenswert
nicht lesenswert
Stutzig hat mich beim Umarbeiten auf den kleinen Code gemacht, dass du 
hier
          sprintf(&cMACbyte,"%02x",pu8Data[0]);
          LCD_PutS(&cMACbyte);

offenbar ein & brauchst:

Wie ist cMACbyte definiert?

Wenn hier ein & notwendig ist, dann ist da was faul.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann das Programm auf Stackoverflow abprüfen. Dein Code ruft viele 
"fette" Unterfunktionen auf, die den Stack in den Keller treiben können, 
d.h. in die Nähe von DATA und BSS Variablen.

Ein Hinweis ist die Anzeige des statischen SRAM-Bedarfs nach dem 
Kompilieren. Wenn das in Richtung 75% des vorhandenen SRAM geht, sollte 
eine Alarmglocke läuten.

Du könntest z.B. eine Kanarienvogel-Variable hinter deinen regulären 
Variablen platzieren, diese zyklisch prüfen und Alarm geben, wenn deren 
Inhalt verändert wird.

ADD: Geh dem Hinweis von Karl Heinz zuerst nach. Sieht 
vielversprechender aus!

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@karl heiz danke für den tipp mit dem verkleinern des codes.

die variabel ist so deklariert:  char cMACbyte;

irgendwie ändert sich pu8Data schon bei wenn ich die anderen fälle 
rauslasse.

void MENU_MACChange
(
)
/*****************************************************************************/
{
   EEPROM_Read(pu8Data,EEPROM_MAC_ADDRESS_LENGTH, EEPROM_MAC_ADDRESS_OFFSET );
   sprintf(cMAC,"%02x%02x.%02x.%02x.%02x.%02x",pu8Data[0],pu8Data[1],pu8Data[2]
           ,pu8Data[3],pu8Data[4],pu8Data[5]);
  LCD_Clear();
  LCD_Goto(0,0);
  LCD_PutS(cMAC);
  LCD_Goto(0,0);
  u8Cursor=0;
  
  while(u8ExitMAC!=1)
  {  
    xil_printf("%02x%02x.%02x.%02x.%02x.%02x\n\n",pu8Data[0],pu8Data[1],pu8Data[2]
           ,pu8Data[3],pu8Data[4],pu8Data[5]);
    KBD_Read(pu8Key);
    if(*pu8Key!=0x01) LCD_DelayMS(KBD_POLL_CYCLE);
    switch(*pu8Key){

      case 'C':
      {
        u8ExitMAC=1;
        break;
    }
      default: break;
    }
    
  }
  
}


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

Bewertung
0 lesenswert
nicht lesenswert
hans schrieb:
> @karl heiz danke für den tipp mit dem verkleinern des codes.
>
> die variabel ist so deklariert:  char cMACbyte;

Dachte ich mirs doch.

Und wie stellst du dir vor, dass zb ein String mit 3 Zeichen in so eine 
einsame klitzekleine char Variable mit gerade mal 8 Bit passt?

Zum Speichern von Strings benötigt man Arrays!

http://www.mikrocontroller.net/articles/FAQ#Wie_fu...


> irgendwie ändert sich pu8Data schon bei wenn ich die anderen
> fälle rauslasse.

Wer weiß, wo du sonst noch überall Arrays überläufst.

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok aber was ändert das daran das sich pu8Data ändert?

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

Bewertung
0 lesenswert
nicht lesenswert
hans schrieb:
> ok aber was ändert das daran das sich pu8Data ändert?

Du jubelst dem System eine einsame char Variabel als Array unter.
zb versucht sprintf dort 3 oder mehr Zeichen abzulegen. Die Variable hat 
aber nicht den Platz dafür. sprintf schreibt aber trotzdem. Es schreibt 
dann einfach beginnend mit der Startadresse die du angegeben hast im 
Speicher weiter. Und was immer dort im Speicher war .... wird 
überschrieben. Ohne Rücksicht auf Verluste.

Sei froh dass du jetzt drauf gekommen bist. Das hätte alles auch noch 
viel schlimmer ausgehen können, wenn du den Stack niedergebügelt 
hättest.

http://www.mikrocontroller.net/articles/FAQ#Wie_fu...

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja cool jetzt hab ich verstanden danke für die schnelle kompetente 
hilfe!


hans

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

Bewertung
0 lesenswert
nicht lesenswert
hans schrieb:
> ja cool jetzt hab ich verstanden danke für die schnelle kompetente
> hilfe!

Das muss allerdings nicht das einzige Problem gewesen sein.
Daher ist es meistens nicht sehr schlau wenn man Code schreibt, und Code 
schreibt und Code schreibt ... und nie zwischendurch mal testet.

Denn dann steht man am Ende mit einem Haufen Code da der nicht 
funktioniert. Und das ist so sicher wie das Amen im Gebet.

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

Bewertung
0 lesenswert
nicht lesenswert
hans schrieb:

> irgendwie ändert sich pu8Data schon bei wenn ich die anderen fälle
> rauslasse.
>
>
> 
> void MENU_MACChange
> (
> )
> /*****************************************************************************/
> {
>    EEPROM_Read(pu8Data,EEPROM_MAC_ADDRESS_LENGTH,
> EEPROM_MAC_ADDRESS_OFFSET );
>    sprintf(cMAC,"%02x%02x.%02x.%02x.%02x.%02x",pu8Data[0],pu8Data[1],pu8Data[2]
>            ,pu8Data[3],pu8Data[4],pu8Data[5]);
>   LCD_Clear();

Wie gross ist cMAC?


Nur damit das klar ist:
Es ist dein Bier dafür zu sorgen, dass die Arrays groß genug sind. Da 
gibt es kein Netz und keinen doppelten Boden, der dich hier schützt.

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja eigentlich hab ich es zwischendurch getestet und hatte schon so 
komische phänomene aber als anfänger kommt man schwer darauf das 
irgendwo speicher überschrieben wird.

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
cMAC ist jetzt 16 byte groß das war das problem vorher hatte ich es auf 
6 byte

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

Bewertung
0 lesenswert
nicht lesenswert
hans schrieb:
> cMAC ist jetzt 16 byte groß das war das problem vorher hatte ich es auf
> 6 byte

OK.
Lektion:
Solche Arrays definiert man nie zu knapp und niemals auf Knirsch!

Hier gilt die Devise: Nicht kleckern, klotzen!

Mach es 80 Byte groß

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

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> hans schrieb:
>> cMAC ist jetzt 16 byte groß das war das problem vorher hatte ich es auf
>> 6 byte
>
> OK.
> Lektion:
> Solche Arrays definiert man nie zu knapp und niemals auf Knirsch!
>
> Hier gilt die Devise: Nicht kleckern, klotzen!
>
> Mach es 80 Byte groß


ps: 16 ist schon wieder zu klein
%02x%02x.%02x.%02x.%02x.%02x
braucht 17 Bytes. Du hast auf das abschliessende \0 Byte vergessen.

Aber wie gesagt: Ordentlich überdimensionieren, damit dir bei der 
nächsten Formatänderung nicht schon wieder alles um die Ohren fliegt.

Der nächste macht daraus:
  sprintf( cMAC, "MAC: %02x%02x.%02x.%02x.%02x.%02x",  ...

  ...

  LCD_PutS( cMAC );
  ...

weil ihm das besser gefällt, und schon sind deine 17 Bytes schon wieder 
zu klein.

Und nein: Man braucht nicht für jeden String ein neues Array. SO wie du 
das hast, kannst du alle sprintf über denselben Buffer (dasselbe char 
Array) abwickeln. Und das dann dafür reichlich groß dimensionieren.

Und auch mal über den Einsatz von snprintf nachdenken.

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
alles kalr habs jetzt auf 80 hoffe jetzt gibs nie wieder probleme damit 
:D

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.