Forum: Mikrocontroller und Digitale Elektronik OSEK: kritische Code in preemptive Task


von Ying (Gast)


Lesenswert?

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ß

von Ying (Gast)


Lesenswert?

Bitte um Hilfe!

von holger (Gast)


Lesenswert?

>Bitte um Hilfe!

Du hast ja wohl ne Meise hier nach 12 Minuten schon
zu pushen.

von Ralph (Gast)


Lesenswert?

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

von Ying (Gast)


Lesenswert?

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.

von Ralph (Gast)


Lesenswert?

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