2016-06-07 5 views
0

В настоящее время я пытаюсь сделать мое устройство (STM32F105), которое, как правило, работает 12 потоков на CMSIS RTOS, переходит в режим низкого энергопотребления. Для того, чтобы упростить Algorythm я думаю (точно не уверен), что это хорошая идея, чтобы прекратить все нити с помощью osThreadTerminate и после пробуждения воссоздать их с помощью osThreadCreateЗавершение потока 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); 
       } 
      } 
     } 
    } 
}  

Как вы можете видеть, я использую некоторые глобальные переменные определить, когда спать. TerminateTasks(); используется для завершения всех моих текущих потоков с помощью функции osThreadTerminate, которая, похоже, не вызывает никаких проблем, но после вызова WakeUp(); который использует функцию osThreadCreate для воссоздания завершенных потоков. Я запускаю переполнение стека os. Поэтому есть несколько вопросов, на которые я пытаюсь найти ответы. Выполняет ли команду osThreadTerminate в пакете релиза CMSIS-RTOS после выполнения? Есть ли лучший способ перейти в режим с низким энергопотреблением? Надеюсь, я четко сформулировал свою точку зрения, если необходимо уточнить, дайте мне знать. Был бы признателен, если бы вы поделились своим опытом с подобными проблемами.

+0

Вам не нужно останавливать свои задачи, чтобы перейти в режим с низким энергопотреблением. В общем, вы не хотите останавливать и перезапуска потоков RTOS. – rost0031

+0

Хорошо, давайте рассмотрим другой сценарий. Что делать, если я использую некоторые глобальные переменные, которые сообщают потокам прекратить выполнение работы, например while (sleep) {osDelay (1000)}; Я считаю, что __wfi(); инструкции останавливают CPU до прерывания, поэтому я задаюсь вопросом, как это будет реагировать на мое текущее потребление. – Alutis

+0

Не должно быть никакого эффекта, когда ваши потоки будут «работать», пока вы находитесь в режиме с низким энергопотреблением. Весь процессор спит, и активная активная схема - это ОЗУ и мониторинг прерываний для выхода из сна (это действительно зависит от того, какой процессор вы используете, но у вас есть идея). – rost0031

ответ

0

Вы используете динамическое распределение в своей другой теме? Потому что, если это так, то убийство вашего потока при работе может привести к утечке памяти.

+0

Я стараюсь избегать использования динамического распределения, поэтому я не думаю, что это моя проблема. – Alutis