Variable im Code deklariert, aber nicht im Arbeitsspeicher vorhanden

Ich habe einige Variablen und Matrizen global im PIC16F887A-Code deklariert, aber wenn ich diesen Code auf Proteus simuliere, existiert eine der Matrizen nicht im Fenster "PIC-CPU-Variablen", während alle anderen Variablen und Matrizen vorhanden sind. Warum ist das?

void burnLEd(unsigned char,unsigned char);
void display();
void find_Dir();
unsigned char matrix[8][8];
unsigned char len=4;
unsigned char max_len=32;
unsigned char btn=6;
unsigned char v_c=1;
unsigned char v_r=0;
unsigned char i=0;
unsigned char j=0;
char pos_c[10];
char pos_r[10];


void main()
{
    TRISB=0;                              //output for matrix rows
    TRISD=0;                              //output for matrix cols
    TRISA=0;                              //output for keypad rows
    TRISC=255;                            //input from kepad cols
    PORTA=255;
    PORTB=255;
    PORTD=0;
//Matrix initial values to zero == all LEDs off
    for(i=0; i<8; i++)
    {        for(j=0; j<8; j++)
             {        matrix[i][j]=0;
             }
    }
//Snake's initial configuration_________________________________________________
//setting its positions
    for(i=0; i<len; i++)
    {        pos_r[i]=7;
             pos_c[i]=3-i;
    }
//putting points onto Matrix
    for(i=0; i<len; i++)
    {        matrix[pos_r[i]][pos_c[i]]=1;
    }
//main LOOP_____________________________________________________________________
    while(1)
    {      find_Dir();
//updating position of the head
           pos_c[0]=pos_c[0]+v_c;
           pos_r[0]=pos_c[0]+v_r;
//checking if snake's beyond the Screen
           if(pos_c[0] > 7)
           {           pos_c[0]=0;
           }
           else if(pos_c[0] < 0)
           {    pos_c[0]=7;
           }
           if(pos_r[0] > 7)
           {           pos_r[0]=0;
           }
           else if(pos_r[0] < 0)
           {    pos_r[0]=7;
           }
//updating rest of the body of snake
           for(i=1; i<len; i++)
           {        pos_c[i]=pos_c[i-1];
                    pos_r[i]=pos_r[i-1];
           }
//putting positions on the Matrix
          matrix[pos_r[0]][pos_c[0]]=1;
          matrix[pos_r[len-1]][pos_c[len-1]]=0;
//Displaying on Matrix
           for(i=0; i<2; i++)
           {        for(j=0; j<2; j++)
                    {        display();
                    }
           }
    }
    while(1);
}

void find_Dir()
{    PORTA=1;
     if(PORTC == 2)
     {       btn=2;
              v_c=0;
              v_r=-1;
              return;
     }
     PORTA=2;
     if(PORTC == 1)
     {        btn=4;
              v_c=-1;
              v_r=0;
              return;
     }
     if(PORTC == 4)
     {        btn=6;
              v_c=1;
              v_r=0;
              return;
     }
     PORTA=4;
     if(PORTC == 2)
     {        btn=8;
              v_c=0;
              v_r=1;
              return;
     }
     PORTA=0;
}

void display()
{   for(i=0; i<8; i++)
     {       for(j=0; j<8; j++)
             {      if(matrix[i][j] == 1)
                    {               burnLED(i,j);
                    }
             }
     }
}

void burnLED(unsigned char row,unsigned char col)         //PORTB=rows,PORTD=cols
{    PORTB=255 ^ (1<<row);
     PORTD=0 | (1<<col);
     Delay_ms(1);
}
Weil es nach der Definition unbenutzt und vom Compiler optimiert wurde?
nein, es wird viel im Code verwendet,,
Hier ist ein Screenshot, i.imgur.com/PUw2tpa.png?1
Kannst du uns den Quellcode zeigen?
Veraltete Objektdateien in Bezug auf die Quelle?
Daten, die nicht ausdrücklich als "flüchtig" oder gleichwertig gekennzeichnet sind, können in einem Register gehalten oder nur dort berechnet werden, wo sie verbraucht werden - zusätzlich zu der Möglichkeit, vollständig optimiert zu werden, wenn sie nie auf eine Weise verbraucht werden, die Nebenwirkungen hat. Compiler-Autoren nehmen sich die Idee "Wenn ein Baum in einen Wald fällt und niemand da ist, um es zu hören ..." zu Herzen.
Ich habe gerade die Optimierungsstufe auf Null gesetzt und es funktioniert jetzt :-) Vielen Dank für Ihre Vorschläge!
Posten Sie Ihre Antwort als Antwort und akzeptieren Sie sie, damit die Frage ordnungsgemäß geschlossen werden kann.

Antworten (2)

Obwohl Sie das unmittelbare Problem behoben haben, indem Sie die Optimierung deaktiviert haben (was beweist, dass sie herausoptimiert wurde), überlegen Sie, was später passieren würde, wenn Sie den Code optimieren müssen. Sie werden dies wahrscheinlich vergessen haben und die Einstellungen ändern. Oder jemand anderes könnte kommen und es ändern, oder vielleicht erstellen Sie ein Projekt mit neuen Einstellungen.

Der beste Ansatz besteht, wie Chris sagte, darin, diese Variable als flüchtig zu deklarieren. Dies teilt dem Compiler mit, dass die Variable in einer ISR geändert werden kann, und verhindert, dass der Compiler sie entfernt.

Ein kleines Wort kann Ihnen später eine Menge Kopfschmerzen ersparen.

Die unentgeltliche Verwendung von volatile ist nicht unbedingt erforderlich - wenn es tatsächlich einen ISR oder einen bestimmten Thread gibt, der auf die Variable zugreifen kann, ist dies sinnvoll. Andernfalls ist es ziemlich verschwenderisch – das Problem war hier die Sichtbarkeit für einen Debugger, nicht irgendetwas Operatives, daher ist das vorübergehende Deaktivieren von Optimierungen, um den Algorithmus zu debuggen, ebenfalls ein gültiger Ansatz.

Es ist nichts falsch daran, Optimierungen während der Entwicklung zu deaktivieren und sie für den Release-Code wieder zu aktivieren.