mikrocontroller.net

Forum: Compiler & IDEs simulavr: invalid io reg


Autor: Marc (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich versuche gerade ein Programm in C für den ATMega16 zu schreiben und 
es vorher mit simulavr zu testen. Ich bekomme allerdings Fehlermeldungen 
in der Form "WARNING: **** Attempt to read invalid io reg:". Was mir 
dabei auffällt sind die Zeilen beim Starten von simulavr: "MESSAGE: 
TODO: attach IO Reg '<Registername>' at 0x00.." Ich habe den verdacht, 
dass hier noch irgendwas fehlt, aber ich weiß nicht was. Kennt hier 
jemand schon eine Lösung?

Ich verwende folgende Makefile: 
http://www.mikrocontroller.net/attachment/57243/Makefile
Habe auch schon simulavr-0.1.2.6 kompiliert und probiert.

Der Sourcecode für das Programm, das ich testen will:
#include <avr/io.h>
#include <avr/interrupt.h>

#define ADDITION 0
#define MULTIPLY 1

volatile struct
{
  unsigned operation:1;
} status;

typedef union {
        uint8_t i8;
        struct {
                uint8_t i4l;
                uint8_t i4h;
        };
} convert8to4;

ISR(INT0_vect)
{
  uint8_t tmp_sreg; // save global interrupt flag
  tmp_sreg = SREG;
  
  cli(); // disable interrupts
  
  if (PIND & (1 << PD2)) // is Pin 2 high level?
  {
    status.operation = MULTIPLY;
  }
  
  else
  {
    status.operation = ADDITION;
  }
  
  SREG = tmp_sreg; // restore global interrupt flag
}

void SystemInit(void)
{  
  DDRA = 0x00; // set Port A input
  DDRB = 0xff; // set Port B output
  DDRD &= 0xff & (0 << PD2); // set Pin 2 of Port D input
  status.operation = ADDITION;
  
  MCUCR |= (0 << ISC01) | (1 << ISC00); // any logical change triggers
  GICR |= (1 << INT0); // external interrupt enabled
  sei(); // global interrupt enable
}

int main(void)
{
  convert8to4 port_a;
  SystemInit();
  
  while (1)
  {
    port_a.i8 = PINA;
    
    if (status.operation == ADDITION)
    {
      PORTB = port_a.i4h + port_a.i4l;
    }
    
    else
    {
      PORTB = port_a.i4h * port_a.i4l;
    }
  }
  
  return 0;
}

simulavr shell Ausgabe
...
devsupp.c:354: MESSAGE: TODO: attach IO Reg 'GICR' at 0x005b
devsupp.c:354: MESSAGE: TODO: attach IO Reg 'OCR0' at 0x005c
devsupp.c:348: MESSAGE: attach: IO Reg 'SPL' at 0x005d: created
devsupp.c:332: MESSAGE: attach: IO Reg 'SPH' at 0x005e: ref = 0x005d
devsupp.c:348: MESSAGE: attach: IO Reg 'SREG' at 0x005f: created
avrcore.c:497: MESSAGE: attach: Internal SRAM from 0x0060 to 0x045f
decoder.c:3875: MESSAGE: generating opcode lookup_table
main.c:415: MESSAGE: Simulating clock frequency of 4000000 Hz
Waiting on port 1212 for gdb client to connect...
Connection opened by host 127.0.0.1, port -30333.
decoder.c:737: MESSAGE: BREAK POINT: PC = 0x00000065: clock = 37
memory.c:232: WARNING: **** Attempt to read invalid io reg: MCUCR at 0x0055
memory.c:267: WARNING: **** Attempt to write invalid io reg: MCUCR at 0x0055
memory.c:232: WARNING: **** Attempt to read invalid io reg: GICR at 0x005b
memory.c:267: WARNING: **** Attempt to write invalid io reg: GICR at 0x005b

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AFAIK simuliert simulavr nicht die (interne) Peripherie, sondern nur den 
AVR-Kern.

Autor: Marc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo nochmal,

hatte vergessen zu erwähnen, dass ich noch simulavr-disp verwende und 
eben nicht sehe, dass die Register MCUCR und GICR irgendwie gesetzt 
werden. Das kann man auch im Screenshot erkennen.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Diese beiden SFRs gehören zur Peripherie, und die wird nicht simuliert 
wie gesagt.

Autor: Marc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, danke Johann. Ich hatte gehofft wenigstens die Werte zu sehen.

Autor: Thomas K. (tomk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

mit dem "neuen" simulavrxx sollte das besser gehen, soviel zur guten 
Nachricht. ;-) Die schlechte: es gibt aktuell noch keine Release dafür, 
die nach 0.8.006 datiert und erst da ist der ATmega16 überhaupt erst mit 
drin. (d.h. für den, der sich's antun will: lesen Mailingliste, git-Repo 
clonen, selbst compilieren) Und die 2. schlechte Nachricht: 
simulavr-disp gibt es dafür nicht, geht nur eine Abfrage direkt im 
avr-gdb auf die entsprechende Stelle.

Nur mal so ... schönen Tag noch, Thomas

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.