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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.