我目前正在尝试让我的设备(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);
}
}
}
}
} 正如您所看到的,我使用一些全局变量来确定何时睡眠。TerminateTasks();用于使用osThreadTerminate函数终止所有正在运行的线程,该函数似乎不会造成任何问题,但在我调用WakeUp();之后,该函数使用osThreadCreate函数重新创建终止的线程,我运行到一个操作系统堆栈溢出。因此,有几个问题我很难找到答案。CMSIS-RTOS中的osThreadTerminate命令在执行后会释放堆栈吗?有没有更好的进入低功耗模式的方法?我希望我把我的观点讲清楚了,如果需要更具体的,请让我知道。如果您能分享您遇到类似问题的经验,我将不胜感激。
发布于 2016-06-08 18:05:14
你在你的其他线程中使用动态分配吗?因为如果是这样的话,在线程运行时终止线程可能会导致内存泄漏。
https://stackoverflow.com/questions/37681092
复制相似问题