Gast
#331517
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