Gast
#4483731
Ich habe ein System unter uCOS oder freeRTOS Betriebssystem auf einem leistungsfähigen ARM4 zu implementieren. In einer Funktion nehme ich eine HW-Ressource des Controllers in Anspruch, um eine AES Verschlüsselung durchzuführen. Dabei muss ich warten, bis ein Zwischenergebnis da ist, und kann dann weitermachen. Das Vorliegen des Zwischenergebnisses wird durch ein Status Flag signalisiert. Nun kann ich ja nur schlecht in einer Schleife warten, bis das Ergebnis da ist (es gibt ja andere Prozesse, die drankommen wollen, außerdem ist das Verschlüsseln niederprior). Also lasse ich mich über einen Interrupt darüber informieren, dass die HW fertig ist. Mein Code sieht so aus: Rufe_HW_auf_um_etwas_zu_tun(); Take_semaphore(); // hier wird auf freien (binären) semaphor gewartet. Andere tasks kommen inzwischen dran mache_weiter()... In der Interrupt Routine: wenn (flag gesetzt): give_semaphore(); return; uCOS und freeRTOS unterstützen definitiv "give semaphore" aus einer interrupt routine, und es wird auch empfohlen den beschriebenen Ablauf so zu machen. Habe das getestet : 10 parallele Tasks greifen so alle 10ms auf die gleiche Funktion zu. Kein einziger Fehler, seit 2 Tagen. Trotzdem habe ich etwas Skrupel, da einige Kollegen meinen, dass man das so nicht so macht. Ohne OS würde ich das natürlich auch anders machen, aber wenn schon OS, warum dann nicht so? Ist das so wirklich vollkommner Mist ? Wie dann? Ich sehe irgendwie nicht ein, wieso man hier mit selbstgestrickten Verriegelungen arbeiten soll, wenn ich ein OS habe, das genau das für mich macht. Sind Semaphore denn Teufelswerk? Danke !