0

我目前正在尝试使我的设备(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 命令是否在执行后释放堆栈?有没有更好的方法进入低功耗模式?我希望我的观点很清楚,如果需要更具体,请告诉我。如果您分享您遇到类似问题的经验,将不胜感激。

4

1 回答 1

0

您是否在其他线程中使用动态分配?因为如果是这样,在运行时杀死你的线程可能会导致内存泄漏。

于 2016-06-08T10:05:13.680 回答