Studio 6.2 Simulator

Gast #3617527
Lesenswert?

Habe Probleme mit Simulator. Habe das Programm mit zahlreichen 
Breakpoints durchlaufen lassen. Beim ersten Programmdurchlauf wird die 
erste und dritte for-schleife durchlaufen, die Zweite wird übersprungen:

#define   F_CPU 8000000
#include  <avr\io.h>
#include  <stdio.h>
#include   <limits.h>
#include   <stdlib.h>
#include   <util\delay.h>

int ZeilenVektor[8];
int co;
int z1;
int z2;
int z0;
int i;
double BRENNDAUER;


int main ()
{

   DDRB  = 0xFF;
   PORTB = 0xFF;

   DDRD  = 0xFF;
   PORTD = 0x00;
   BRENNDAUER = 50;


   for (z0=0;z0<=7;z0++)      // wird durchlaufen
   ZeilenVektor[z0] = 0;

   while(1)
   {

      for (z1=0;z1<=7;z1++)  // wird übersprungen
      {
  PORTD = ZeilenVektor[z1];
  PORTB &=~(1<<z1);              void _delay_ms(double BRENNDAUER);
  PORTB |= (1<<z1);
  PORTD = 0x00;
      };

      co = 1; // wird übersprungen
      for (z2=0;z2<=7;z2++)// wird durchlaufen
      {
         ZeilenVektor[z2]=ZeilenVektor[z2]+co;
         if (ZeilenVektor[z2]==256)
            ZeilenVektor[z2]=0;
         else
      co=0;
       };
   };
};
Gast #3617610
Lesenswert?

Turmburger schrieb:
> for (z0=0;z0<=7;z0++)      // wird durchlaufen
>    ZeilenVektor[z0] = 0;
ok, ein array das mit nullen gefuellt wird...

Turmburger schrieb:
> for (z1=0;z1<=7;z1++)  // wird übersprungen
>       {
>   PORTD = ZeilenVektor[z1];
jetzt gehst du in das array rein, um daraus eine null zu lesen...
wie waere es einfach mit "PORTD = 0" ?

Turmburger schrieb:
> PORTD = 0x00;
ergibt keinen sinn, weil eh schon ne null drin steht

Turmburger schrieb:
> for (z2=0;z2<=7;z2++)// wird durchlaufen
>       {
>          ZeilenVektor[z2]=ZeilenVektor[z2]+co;
Ok, vom prinziep steht da: ZeilenVektor[z2] = 0 + co
Wie waere es mit ZeilenVektor[z2] = co

Turmburger schrieb:
> co = 1; // wird übersprungen
Wird wegoptimiert weil es sich nie aendert!

Turmburger schrieb:
> Habe Probleme mit Simulator. Habe das Programm mit zahlreichen
> Breakpoints durchlaufen lassen. Beim ersten Programmdurchlauf wird die
> erste und dritte for-schleife durchlaufen, die Zweite wird übersprungen:
Wenn da was nicht funktioniert, dann weil der Compiler Dinge 
wegoptimiert, und das zu recht!

An deinem Problem ist weder der Compiler, noch der Simulator, noch die 
Tatsache das es sich um eine Beta-Version handelt schuld.
Schalte die optimierung ab, oder programmiere ordentlich!
Gast #3617624
Lesenswert?

Kaj schrieb:
> Turmburger schrieb:
>> for (z1=0;z1<=7;z1++)  // wird übersprungen
>>       {
>>   PORTD = ZeilenVektor[z1];
> jetzt gehst du in das array rein, um daraus eine null zu lesen...
> wie waere es einfach mit "PORTD = 0" ?
>
> Turmburger schrieb:
>> PORTD = 0x00;
> ergibt keinen sinn, weil eh schon ne null drin steht
Aber ist PORTD nicht volatile? Theoretisch könnte es einen Interrupt 
geben, welcher zwischen den beiden Zuweisungen PORTD ändert...
Gast #3617641
Lesenswert?

Jay schrieb:
> Theoretisch könnte es einen Interrupt
> geben, welcher zwischen den beiden Zuweisungen PORTD ändert...
Theoretisch ja, praktisch nein, da der TO keine Interrupts benutzt. 
Ausgehend von dem Stueck Code da oben, werden keine Interrupts benutzt 
und damit aendert sich der Port auch nicht.
Ansonsten hast du recht.

Gruesse
Gast #3617752
Lesenswert?

Kaj schrieb:
> Jay schrieb:
>> Theoretisch könnte es einen Interrupt
>> geben, welcher zwischen den beiden Zuweisungen PORTD ändert...
> Theoretisch ja, praktisch nein, da der TO keine Interrupts benutzt.
> Ausgehend von dem Stueck Code da oben, werden keine Interrupts benutzt
> und damit aendert sich der Port auch nicht.
> Ansonsten hast du recht.
Mein theoretisch bezieht sich (wie du richtig anmerkst) eben darauf, 
dass im Quellcode des TOs keine Spuren eines Interrupts gibt.
Aber der Compiler muss doch trotzdem davon ausgehen, dass sich PORTD in 
der Zwischenzeit geändert haben könnte und kann die Zeilen nicht einfach 
wegoptimieren.


Bei genauerer Betrachtung des Codes sehe ich aber du hast unrecht:

Das ist die Initialisierung:
1
for (z0=0;z0<=7;z0++)      // wird durchlaufen
2
   ZeilenVektor[z0] = 0;

Danach kommt eine grosse while Schleife als Mainloop(neu formatiert):
1
while(1)
2
{
3
  for (z1=0;z1<=7;z1++)  // wird übersprungen
4
  {
5
    PORTD = ZeilenVektor[z1];
6
    PORTB &=~(1<<z1);
7
    void _delay_ms(double BRENNDAUER);
8
    PORTB |= (1<<z1);
9
    PORTD = 0x00;
10
  }
11

12
  co = 1; // wird übersprungen
13
  for (z2=0;z2<=7;z2++)// wird durchlaufen
14
  {
15
    ZeilenVektor[z2]=ZeilenVektor[z2]+co;
16
    if (ZeilenVektor[z2]==256)
17
      ZeilenVektor[z2]=0;
18
    else
19
      co=0;
20
  }
21
}

Beim ersten Durchlauf hast du recht, da sind alle Werte von ZeilenVektor 
== 0. Aber im unteren Teil wird ZeilenVektor verändert(sieht ein bischen 
aus wie ein, ziemlich schräger, 64bit Counter). Danach beginnt die while 
Schleife wieder von vorne.

Ich glaube also nicht, dass der Compiler hier grossartig etwas weg 
optimieren kann. Jedenfalls nicht so wie du es oben beschreibst.

> Gruesse
Gruesse zurueck...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren