Forum: Mikrocontroller und Digitale Elektronik UCOSII mit M16C Problem


von Thomas B. (Gast)


Lesenswert?

Hallo !

Ich probiere derzeit mit dem UCOSII-RTOS auf einem M16C/62P herum und
bin da jetzt auf ein Problem gestossen, bei dem ich nicht weiß wie ich
es beheben soll.

Im Prinzip läuft das Teil; ein Task der mir ne LED toggelt macht was er
soll. Probleme gibts jetzt aber wenn ich vom Empfangsinterrupt eines
UARTs aus ein Semaphor setze und in einem Task darauf warte.

<c>
#pragma INTERRUPT  uart2_ISR
void  uart2_ISR (void)
{
  OSIntEnter();

  while (ri_u2c1 == 0); // make sure receive is complete
  u2in = u2rb;

  OSSemPost(uart2_rcv);

  OSIntExit();
}

.
.
.

void UART2_Task (void *pdata)
{
  unsigned char err;

  uart2_init(19200);
  uart2_rcv = OSSemCreate(0);

  while (1)
  {
    OSSemPend(uart2_rcv, 0, &err);
    uart2_put(u2in);

    p6_1 = ~p6_1;
  }
}

</c>

Dabei stürzt mir dann das Teil regelmässig ab. Wobei der Zeitpunkt
nicht wirklich vorhersagbar ist. D.h. die Anzahl der Zeichen die ich
eintippen kann bevor er sich verabschieded ist unterschiedlich. (meist
aber schon nach den erste paar)

Konnte das Problem inzwischen schon soweit eingrenzen, daß es am
"OSIntExit()" liegt, welches ein ReScheduling vornimmt, wenn Nesting
auf 0 ist (also der "letzte" Interrupt behandelt ist). Entferne ich
die Befehle "OSIntEnter()" und "OSIntExit()" ,läuft das Teil.
Allerdings befürchte ich, daß damit spätestens dann Probleme
auftauchen, wenn ich wirklich verschachtelte Interrupts habe. (Was mich
verwundert ist, daß das in dem Beispiel das bei der Portierung dabei war
diese Funktionen auch nicht benutzt werden)

Als M16C Portierung verwendet ich bei den jetzigen Tests die Version
von der Micrium-Seite, zuvor hatte ich aber auch schon die Version von
der Seite http://ucos-ii.develop4u.de/ gestestet; mit dem selben
Resultat.

Hatte die ISR auch schon in Assembler verfasst (so wie von ucosii
empfohlen), aber auch das hilft nix: (die Präprozessor anweisung
"#pragma INTERRUPT uart2_ISR" fällt dann natürlich weg)

<c>
_OSUART2:

  PUSHM    R0,R1,R2,R3,A0,A1,SB,FB
  JSR    _OSIntEnter
  JSR    _uart2_ISR
  JSR    _OSIntExit
  POPM    R0,R1,R2,R3,A0,A1,SB,FB

  REIT
</c>

Hat jemand ne Idee was da falsch läuft ?? Überseh ich etwas ? Oder hat
vielleicht sogar jemand UCOSII am M16C laufen und kann mir die Files
für die Portierung (os_cpu_a.a30, ...) schicken ?

Schöne Grüße,
Thomas

von Thomas B. (Gast)


Lesenswert?

So, möglich daß ich den Fehler gefunden hab.
Habe nun die ISR für den UART genau so aufgebaut wie die Funktion
OSTickISR und siehe da es funktioniert.

Ich vermute mal, daß es etwas mit dem Context-Switch in der OSIntExit
zu  tun hatte, denn dieser führt den Asm Befehl "REIT" aus, was ich
bei der UART ISR aber explizit auch noch mal mache (bzw. machen muss).
Das heißt dann aber, daß die Version von micrium, wo ganz normal mit
"#pragma INTERRUPT .." gearbeitet wird in dieser Hinsicht fehlerhaft
ist, oder ?

Hat eigentlich schon mal jemand die beiden von mir angegebenen Ports
für den M16C angeschaut ? Was mich etwas irritiert ist, daß die Version
von http://ucos-ii.develop4u.de/ in den Assembler Funktionen
(OSCtxSwitch, ...) mit dem Stackpointer SP arbeitet, während die
Version von micrium mit dem Interrupt-Stack Pointer ISP läuft. Auch die
Funktion "OSTaskStkInit" ist anders aufgebaut (unter anderem wird bei
der micrium Version ein 8bit breiter Stack verwendet, während dieser
bei der andren 16Bit breit ist.

Schöne Grüße,
Thomas

von Florian S. (Gast)


Lesenswert?

Hallo Thomas,

hier ein bischen Erklaerung zum USP/ISP:

Den Userstack habe ich benutzt, weil es bis dahin keine Portierung gab,
die es so gemacht hat. Alle haben aus "Faulheit" den ISP benutzt,
wodurch nur ein Stackpointer im System vorkommt. Das macht die Sache
einfacher.
Wenn ich nur einen Stackpointer habe, muss ich den Platz, den ich fuer
Interrupts brauche, auf jedem Taskstack freihalten. Mit einem
speziellen Interrupt-SP brauche ich diesen nur einmal.
Allerdings verlangt der ISP das Kopieren von Daten bei einem
Taskwechsel, was die Umschaltzeiten erhoeht.
Aber wie gesagt, war der USP mehr ein Experiment von mir.

Bis die Tage
Florian

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.