OSEK: kritische Code in preemptive Task

Gast #3061672
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ß
Gast #3061732
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
Gast #3061762
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.
Gast #3065154
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.