我目前正在尝试使我的设备(STM32F105)通常在 CMSIS RTOS 上运行 12 个线程进入低功耗模式。为了简化算法,我认为(绝对不确定)使用 osThreadTerminate 终止所有线程并在唤醒后使用 osThreadCreate 重新创建它们是个好主意
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);
}
}
}
}
}
如您所见,我使用一些全局变量来确定何时休眠。终止任务();用于使用 osThreadTerminate 函数终止我所有正在运行的线程,这似乎不会造成任何麻烦,但是在我调用 WakeUp(); 它使用 osThreadCreate 函数重新创建我遇到操作系统堆栈溢出的终止线程。所以有几个问题我很难找到答案。CMSIS-RTOS 中的 osThreadTerminate 命令是否在执行后释放堆栈?有没有更好的方法进入低功耗模式?我希望我的观点很清楚,如果需要更具体,请告诉我。如果您分享您遇到类似问题的经验,将不胜感激。