Forum: Compiler & IDEs Avr Studio Simulator C Code


von Dirk (Gast)


Lesenswert?

Hi,

ich habe am Wochenende meine ersten richtigen Gehversuche in GCC und
AVR gemacht. Verschiedene Unterroutinen ohne Parameteruebergabe und mit
übergaben. Nun wollte ich gerne den Code per Avr Studio 4.08
Simulieren/Debuggen. Beim durch Steppen springt aber das Programm
unwillkürlich in die Main Prozedur.


Gibt es Probleme bei AVR Studio und GCC beim simulieren?

Ich hoffe jemand kann mir da weiterhelfen .


Mfg

Dirk

von Fiffi (Gast)


Lesenswert?

Hallo Dirk,

>Beim durch Steppen springt aber ds Programm unwillkürlich in die
> Main Prozedur.

Wie meinst du das ?

Beim laden der cof-datei ist das normal ...



Gruß

Fiffi

von Dirk (Gast)


Lesenswert?

Hi,

ja ich lade die ext. coff Datei mit AVR Studio .....

wie kann ich den meinen C Code richtig simulieren mit AVr Studio 4.08?

Mfg

Dirk

von Fiffi (Gast)


Lesenswert?

Hallo Dirk,

>wie kann ich den meinen C Code richtig simulieren mit AVr Studio
> 4.08?

Hast du ein konkretes Problem ?

>Gibt es Probleme bei AVR Studio und GCC beim silulieren ?

Nein, nur beim simuliern von Bootloadern, da das AVR-Studio nur die
.text section lädt.

Du must nur ein "make extcof" ausführen. (Sample-Makefile ...)


Gruß

Fiffi

von Dirk (Gast)


Lesenswert?

Hi,

ein aktuelles Prolembeispiel kann ich leider erst senden wenn ich
Feierabend habe. ;) Ich sende mal ein Beispiel heute abend .


Mfg

Dirk

von Dirk (Gast)


Lesenswert?

Hi,

so Feierabend ;) Es kann sich natuerlich auch um ein Codefehler
handeln, da ich noch blutiger C Anfaenger bin kann ich dieses leider
nicht ausschliessen. Bitte habt also Nachsicht.

Fehler: Das Programm arbeitet laut Simulator die Subs nicht ab ...
sondern springt sofort wieder in die Mainroutine.

MFG

dirk

Code:
#include "avr/io.h"
#include "avr/delay.h"
#include "inttypes.h"

uint8_t   INDATA;
uint8_t   OUTDATA;
uint8_t    NUMBITS;


void txbits(char OUTDATA)
{
char i;
for ( i = 0; i < 8; i++)
  {
  sbi(PORTC,1);
    _delay_loop_2(1122);
    cbi(PORTC,1);
    _delay_loop_2(1122);
    if((OUTDATA & 1) == 1)
    {
      _delay_loop_2(2244);
    }
  }
  return;
}

void command(char INDATA)
{
sbi(PORTC, 1);
_delay_loop_2(18000);
cbi(PORTC, 1);
_delay_loop_2(9000);
txbits(0x82);
txbits(0x17);
txbits(INDATA);
return;
}




int main(void)
{
  outp (0xFF, DDRC);



  sbi(PORTC,0);
  cbi(PORTC,0);
for (;;)
  {                           /* loop forever */
    cbi(PORTC,0);
    command(0x06);
    sbi(PORTC,0);
  }
}

von Dirk (Gast)


Lesenswert?

Hi,

hat den niemand eine Idee?


Mfg

Dirk

von Fiffi (Gast)


Lesenswert?

Hallo Dirk,

>Beim durch Steppen springt aber das Programm
>unwillkürlich in die Main Prozedur.

was meinst du damit ?


Poste bitte mal den Code, Makefile, cof-datei ...


Gruß

Fiffi

von Dirk (Gast)


Lesenswert?

Hi,

@Fiffi ok das mache ich ..... erstmal warten bis Feierabend ist.

Was ich damit meine ist: In der Main Procedure rufe ich die Funktion
Command mit dem Wert 0x06 auf.
Im Simulator springt er dann in die Funktion, sobald er aber ein Befehl
in der Funtkion abarbeiten soll springt er wieder in die
Endlossschleife von der Mainprozedure.
Er arbeitet garnicht die Befehle in den Unterprogrammen (command,
Txbits ab)

Aber ich sende heute abend mal meine Coff usw.


Mfg

Dirk

von Dirk (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

so endlich Feierabend .... anbei mal die Filez.


Mfg

Dirk

von Fiffi (Gast)


Lesenswert?

Hallo Dirk,

mach mal bitte ein Archiv daraus, was jeder öffnen kann ... (zip,
tar.gz, ...)


Gruß

Fiffi

von Dirk (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

sry... anbei das zip

von Fiffi (Gast)


Lesenswert?

Hallo Dirk,

bei mir verhält sich dein Programm genauso wie bei dir. Der "Unsinn"
kommt vom GCC. (bin mal im assembler durchgesteppt)

Der erzeugt Code ergibt überhaupt keinen Sinn ...

Das Problem kommt von den delay Routinen. Diese habe ich auch noch nie
verwendet.


Ich Anhang befindet sich eine Version (ohne delays) die bei mir
vernünfig läuft.

Ich würde Zip-Datei mal an die Entwickler senden...


Gruß

Fiffi

von Dirk (Gast)


Lesenswert?

Hi,

ich bedanke mich fuer deine Hilfe. Ich werde mal den Entwickler mein
zip file zukommen lassen.


Mfg

Dirk

von Jörg Wunsch (Gast)


Lesenswert?

Die delay()-Routinen sind inline-Funktionen.  Sowas kann COFF nicht
darstellen, da in diesem Falle Code generiert wird, der nicht mehr zur
C-Datei, sondern zu einer .h-Datei gehört.  Wenn Du mal ein
avr-objdump -g auf das ELF-File machst, müßtest Du das ganz gut
erkennen können, daß innerhalb einer Funktion zwischen verschiedenen
Dateien umgeschaltet wird.  COFF kann diese Umschaltung nicht, da sich
dort die Zeilennummern einer Funktion immer auf den Anfang der
Funktion beziehen und damit immer auf die Quelldatei, in der der
Funktionskopf stand.

von Dirk (Gast)


Lesenswert?

Hi,


wie kann man den sowas sonst Bewerkstelligen? oder gibt es da keine
Moeglichkeit?


Mfg

Dirk

von Jörg Wunsch (Gast)


Lesenswert?

Einen richtigen Debugger benutzen, der ein vernünftiges Objektformat
unterstützt. ;-)

(Ja, ich weiß, ist nicht ganz so einfach, wie sich das schreibt...)

von Dirk (Gast)


Lesenswert?

Hi,


so da ich ja noch leider blutiger Anfaenger bin und fuer ASM fand ich
AVR Studio Simulator extrem gut..... Welchen Debugger soll ich den
nutzen fuer meinen C Code ? Gdb insight ?

Mfg

Dirk

von Jörg Wunsch (Gast)


Lesenswert?

Zumindest unterstützt GDB das ELF-Format in vollem Maße. ;-)

Aber mir ist schon klar, daß die Wahl der möglichen Simulatoren und
Emulatoren für den GDB nicht sonderlich üppig ist (SimulAVR, AVaRICE).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.