Hallo Leute! Ich hoffe, dass mir hier jemand helfen kann. Ich habe ein Studienprojekt mit OSEK, wo es eine Task(Background) mit niedriger Priorität und eine Task(4msTask) mit Hochpriorität. Die Task(Background) ist unterbrechbar. In der Task(Background) enthält ein kritisches Codesegment, das nicht unterbrechbar sein soll. Vor dem Codesegment ist der globale Interrupt (kein API von OSEK, sondern assembler) deaktiviert und danach wieder aktiviert. Meiner Vorstellung nach wird die Task(4msTask) nicht aufgeruft, wenn das Programm in dem Codesegment läuft. Aber das Ergebnis sieht nicht so aus. Muss ich SuspendAllInterrupts() aufrufen oder Resource verwenden? Wo liegt das Problem? Gruß
>Bitte um Hilfe!
Du hast ja wohl ne Meise hier nach 12 Minuten schon
zu pushen.
Such mal danach welcher Timer die Taskwechsel des OS triggert. Sysclock, RTI, Timer_x,........ Den Interrupt diesen Timers musst du abschalten. Welcher Timer das ist, und mit welchem Funktionsaufruf das geht hängt vom verwendeten µC und OSEK ab. ==> Datenblatt raus suchen und nachlesen
MPC5602 ist verwendet. OSEK benutzt System Timer 0 als Systemclock. Um den "globalen" Interrupt abzuschalten, wird __asm("wrteei 0") aufgeruft. Der Interrupt von Timer ist also auch abgeschaltet. Während des kritischen Codesegment wird Task(4ms) ein paar mal durchgeführt, dann nicht mehr bis der Interrupt wieder aktiviert ist.
Das sieht eher nach einem Problem in deiner Laufzeit aus. Eigentlich sollte mit abschalten des Timerinterupts der Trigger für Taskwechsel ausbleiben. Damit dürfte der 4 ms Task nicht mehr aktiv werden. Ich sehe da jetzt 2 Möglichkeiten. 1. die Interruptsperre wird nicht zu dem Zeitpunkt ausgeführt wo du es erwartest. sondern erst unmittelbar bevor die Taskwechsel aufhören. 2. Die Ausführung deiner 4 ms Task ist nicht beendet wenn der nächste Trigger zum starten der 4 ms Tsk kommt. Es gibt OS, die zählen dann einen Counter hoch wie oft/lange die betreffende Task überläuft. Führen dann wenn Zeit ist , also zb eine interruptsperre, erst einmal diese aufgelaufeen Task aus, bevor auf die Background task geschaltet wird.
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.