В настоящее время я пытаюсь сделать мое устройство (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 после выполнения? Есть ли лучший способ перейти в режим с низким энергопотреблением? Надеюсь, я четко сформулировал свою точку зрения, если необходимо уточнить, дайте мне знать. Был бы признателен, если бы вы поделились своим опытом с подобными проблемами.
Вам не нужно останавливать свои задачи, чтобы перейти в режим с низким энергопотреблением. В общем, вы не хотите останавливать и перезапуска потоков RTOS. – rost0031
Хорошо, давайте рассмотрим другой сценарий. Что делать, если я использую некоторые глобальные переменные, которые сообщают потокам прекратить выполнение работы, например while (sleep) {osDelay (1000)}; Я считаю, что __wfi(); инструкции останавливают CPU до прерывания, поэтому я задаюсь вопросом, как это будет реагировать на мое текущее потребление. – Alutis
Не должно быть никакого эффекта, когда ваши потоки будут «работать», пока вы находитесь в режиме с низким энергопотреблением. Весь процессор спит, и активная активная схема - это ОЗУ и мониторинг прерываний для выхода из сна (это действительно зависит от того, какой процессор вы используете, но у вас есть идея). – rost0031