Ich arbeite an einem eingebetteten Programm auf dem Mikrocontroller TM4C123GH6PM des LaunchPad der Tiva C-Serie von Texas Instruments.
Das Programm soll einen externen ADC in einem Timer-Interrupt abtasten und die konvertierten Werte in eine Warteschlange (in diesem Fall einen Array-basierten Ringpuffer) schieben.
Die Hauptschleife überträgt die Werte (Knallen von Bytes aus der Warteschlange) über den UART an einen PC.
Innerhalb des Timer-Interrupts wird überprüft, ob in der Warteschlange Platz verfügbar ist. Wenn dies der Fall ist, werden Bytes in die Warteschlange geschoben. Wenn nicht, stoppt es den Timer. Die Hauptschleife überträgt die verbleibenden Bytes und startet den Timer erneut, sobald die Warteschlange leer ist (alle Bytes wurden übertragen).
Mein Problem ist, dass der Timer nicht immer gestoppt wird, auch wenn die Warteschlange voll ist.
Könnte dies ein Parallelitätsproblem sein? Wenn ja, wie löse ich es?
Übrigens habe ich mit Sperren herumgespielt, aber das verursacht Deadlocks. Ich habe auch sichergestellt, dass die Warteschlange und die zugehörigen Variablen, auf die sowohl die Hauptschleife als auch der Timer-Interrupt zugreifen, als flüchtig deklariert sind.
Vielen Dank im Voraus :-)
Wenn Ihre Warteschlange genau einen Producer und einen Consumer hat, stellen Sie sicher, dass der Consumer immer eine höhere Priorität hat. Nachdem dies erreicht ist, verursacht die Parallelität keine Probleme mehr. Die Implementierung hängt von der verwendeten Hardware ab, hier ist (mein) Code, der eine solche Warteschlange auf PIC24 micro verwendet -> https://github.com/felis/lcdtune/blob/master/lcdtune.c . Die Queue, sowie Head und Tail werden hier definiert -> https://github.com/felis/lcdtune/blob/master/lcdtune.c#L50 , der Producer ist hier -> https://github.com/ felis/lcdtune/blob/master/lcdtune.c#L233 , und der Verbraucher (der ISR) ist hier -> https://github.com/felis/lcdtune/blob/master/lcdtune.c#L102
DigitalNinja
pvh1987
DigitalNinja