2016-06-07 34 views
0

Ich versuche derzeit, mein Gerät (STM32F105), das normalerweise 12 Threads auf CMSIS RTOS läuft in den Energiesparmodus gehen. Um die algorythm Ich denke, (auf jeden Fall nicht sicher), dass es eine gute Idee zu vereinfachen alle Fäden beenden osThreadTerminate mit und nach einer sie aufzuwecken neu osThreadCreate mitBeenden eines Threads CMSIS-RTOS

void os_idle_demon (void) { 
    /* The idle demon is a system thread, running when no other thread is  */ 
    /* ready to run.               */ 

    for (;;) { 
    /* HERE: include optional user code to be executed when no thread runs.*/ 
     if (Sleep.SleepEnabled == 1) 
     { 
      if (Sleep.IsSleeping == 1) 
      { 
//    __wfi(); 
//    PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI); //PWR_Regulator_LowPower 
       __nop(); 
//    osDelay(5000); 
       if (Sleep.WakeUp) 
       { 
        Sleep.IsSleeping = 0; 
        WakeUp(); 
//     SetSysClock(); 
        Sleep.WakeUp = 0; 
        Sleep.SleepEnabled = 0; 
        Sleep.TimeTillSleep = 60; 
       } 
      } 
      else 
      { 
       if (Sleep.TimeTillSleep == 0) 
       { 
        TerminateTasks(); 
        ResetPeripherals(); 
        Sleep.IsSleeping = 1; 
//    PWR_EnterSTANDBYMode(); 
//     __wfi(); 
//     PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI); 
        __nop(); 
//     osDelay(5000); 
       } 
      } 
     } 
    } 
}  

Wie Sie verwende ich einige globale Variablen sehen zu bestimmen, wann man schläft. TerminateTasks(); wird verwendet, um alle meine laufenden Threads mit der Funktion osThreadTerminate zu beenden, die scheinbar keine Probleme verursacht, aber nachdem ich WakeUp() aufgerufen habe; das verwendet osThreadCreate Funktion, um beendete Threads neu zu erstellen, die ich in einen OS-Stapelüberlauf laufe. Es gibt also ein paar Fragen, um die ich mich bemühe, Antworten zu finden. Ist der osThreadTerminate-Befehl im CMSIS-RTOS-Release-Stack nach der Ausführung? Gibt es eine bessere Möglichkeit, in einen Energiesparmodus zu wechseln? Ich hoffe, ich habe meinen Standpunkt deutlich gemacht, wenn es notwendig ist, genauer zu sein, lassen Sie es mich wissen. Wäre dankbar, wenn Sie Ihre Erfahrung mit ähnlichen Problemen teilen würden.

+0

Sie müssen Ihre Aufgaben nicht beenden, um in den Energiesparmodus zu wechseln. Im Allgemeinen möchten Sie RTOS-Threads nicht anhalten und neu starten. – rost0031

+0

Ok, lassen Sie uns ein anderes Szenario betrachten. Was passiert, wenn ich einige globale Variablen verwende, die Threads sagen, dass sie aufhören sollen, Arbeit zu erledigen, zum Beispiel while (Schlaf) {osDelay (1000)}; Ich glaube, dass __wfi(); Anweisungen stoppt CPU, bis Interrupt ausgeführt wird, also frage ich mich, wie dies auf meinen aktuellen Verbrauch reagieren würde. – Alutis

+0

Es sollte keinen Effekt geben, dass Ihre Threads im Low-Power-Modus noch "laufen". Der gesamte Prozessor schläft und die einzige Schaltung, die aktiv ist, ist RAM und die Interrupt-Überwachung für den Ruhezustand (das hängt wirklich davon ab, welchen Prozessor Sie verwenden, aber die Sie die Idee bekommen). – rost0031

Antwort

0

Verwenden Sie die dynamische Zuordnung in Ihrem anderen Thread? Wenn dies der Fall ist, könnte das Löschen des Threads beim Ausführen zu einem Speicherverlust führen.

+0

Ich versuche, dynamische Zuordnung zu vermeiden, also glaube ich nicht, dass das mein Problem ist. – Alutis