Forum: Mikrocontroller und Digitale Elektronik SAMD21 Kompilerfehler in Timer-Routine


von Alexxx (Gast)


Lesenswert?

Hallo,

ich bin gerade dabei mir Timer-Routinen (ohne ASF) selbst zu schreiben.
Dabei sind jetzt - mir unerklärliche - Compilerfehler aufgetreten:

void TcTimerStop(const Tc* tctimer)
{
  TC_CTRLBSET_Type  tc_ctrlbs;

// folgende Zeilen sind OK
  tc_ctrlbs.reg= tctimer->COUNT8.CTRLBSET.reg;
  tc_ctrlbs.bit= TC_CTRLBSET_CMD_STOP_Val;

// folgende Zeile liefert Err.:
// "assignment of member 'CTRLBSET' in read-only object
  tctimer->COUNT8.CTRLBSET.reg=  tc_ctrlbs.reg;

// direkter Bit-Zugriff: Folgende Zeile liefert Err.:
// "assignment of member 'CMD' in read-only object
  tctimer->COUNT8.CTRLBSET.bit.CMD= TC_CTRLBSET_CMD_STOP_Val;
}

Ich habe keine Ahnung, warum die Register read-only sein sollen.
Im Datenblatt (und in tc.h) sind sie als R/W deklariert.
Weis jemand die richtige Syntax? Wo liegt mein Fehler?

von Alexxx (Gast)


Lesenswert?

Oh mann, ich habe den Fehler jetzt selbst gefunden:
Meine const-Definition war falsch!
Richtig: void TcTimerStop(Tc* const tctimer).
Konstanter Pointer auf nicht const-Regs

von Jim M. (turboj)


Lesenswert?

Schau Dir mal den Funktionskopf an.
1
void TcTimerStop(const Tc* tctimer)

Zeiger auf konstantes Objekt? Nö, passt nich.

Konstanter Zeiger auf variables Objekt passt besser:
1
void TcTimerStop(Tc* const tctimer)

Allerdings macht der Compiler bei Bitfields gerne mal Dinge die man 
nicht haben will und unerwünschte Nebenwirkungen erzeugen könnten 
(Read-Modify-Write).

Registerzugriffe sind mit expliziten Bitmasken besser bedient, und ich 
habe bei Peripherial->Set =(Wert << Bitpos) & Mask; am Ende auch nur 
einen Schreibzugriff auf die Hardware.

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.