Forum: Mikrocontroller und Digitale Elektronik Code von IAR-Compiler für GCC convertieren


von Hans R. (hansrichter)


Lesenswert?

Hallo Leute,

ich würde gerne den Code aus der AtmelAplication Note (AVR444) im 
AtmelStudio mittels GCC-Compiler zum Laufen bekommen.

Könnte mir jemand für den folgenden Auszug aus dem Quelltext sagen, 
wordurch ich die IAR Befehle ersetzen muss?

Im Grunde geht es um die Zeilen:

  __eeprom unsigned static int restartAttempts;

sowie

__disable_interrupt();
  __watchdog_reset();

Danke euch




Vollständige Funktion:

static void ResetHandler(void)
{
  __eeprom unsigned static int restartAttempts;
  // Temporary variable to avoid unnecessary reading of volatile 
register MCUSR.
  unsigned char tempMCUSR;

  tempMCUSR = MCUSR;
  MCUSR = tempMCUSR & ~((1 << WDRF) | (1 << BORF) | (1 << EXTRF) | (1 << 
PORF));

  // Reset watchdog to avoid false stall detection before the motor has 
started.
  __disable_interrupt();
  __watchdog_reset();
  WDTCSR |= (1 << WDCE) | (1 << WDE);
  WDTCSR = 0x00;

  // Examine the reset source and take action.
  switch (tempMCUSR & ((1 << WDRF) | (1 << BORF) | (1 << EXTRF) | (1 << 
PORF)))
  {
  case (1 << WDRF):
    restartAttempts++;
    if (restartAttempts >= MAX_RESTART_ATTEMPTS)
    {
      // Do something here. E.g. wait for a button to be pressed.
      for (;;)
      {

      }
    }

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Um dem Kompiler klarzumachen, das ein Byte im EEPROM landen soll, bzw, 
steht, geht in GCC sowas:
1
unsigned static int restartAttempts __attribute__((section(".eeprom"))) = 0;
Die Null am Ende kann dazu benutzt werden, um einmalig ins EEPROM 
geschrieben zu werden und landet im *.eep File des Projektes.
Das Schreiben ins EEPROM macht man bei der avrlibc mit den dafür 
vorgesehenen Funktionen.
Die Hilfe zu GCC gibt auch Tipps zur Portierung von IAR. Schau da mal 
rein.

: Bearbeitet durch User
von Hans R. (hansrichter)


Lesenswert?

Danke Matthias,

mittlerweile hab ich es fast soweit. Probleme macht nur noch die ISR.

Habe an entprechnenden Stellen

#pragma vector=WDT_vect
__interrupt void WatchdogISR()

auskommentiert und durch z.B. ISR(WDT_vect) ersetzt.

Nur an der Stelle (ISR(ANALOG_COMPARATOR_ENABLE) meckert der Compiler 
noch mit der Meldung:

Error: expected identifier or '(' before 'void'


#ifdef ANALOG_COMPARATOR_ENABLE
//#pragma vector=ANA_COMP_vect
//__interrupt void OverCurrentISR()
ISR(ANALOG_COMPARATOR_ENABLE)
{
  DISABLE_DRIVING;
  for(;;)
  {
    ;
  }
}
#endif

von m.n. (Gast)


Lesenswert?

Hans R. schrieb:
> ISR(ANALOG_COMPARATOR_ENABLE)

Da müßte ISR(ANALOG_COMP_vect) stehen, wenn ich nicht irre.

von Hans R. (hansrichter)


Lesenswert?

Ja, hast natürlich recht, danke

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.