현재 CMSIS RTOS에서 12 스레드를 실행하는 장치 (STM32F105)를 저전력 모드로 전환하려고합니다. 이 osThreadTerminate를 사용하여 모든 스레드를 종료하는 것이 좋습니다 것을 내가 (확실히 확실하지) 생각 algorythm을 단순화하기 위해, 당신은 좀 전역 변수를 사용하여 볼 수있는 웨이크가 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 스택 오버 플로우로 실행됩니다. 그래서 나는 답을 찾기 위해 고심하는 몇 가지 질문이 있습니다. 실행 후 CMSIS-RTOS 릴리스 스택에서 osThreadTerminate 명령을 실행합니까? 절전 모드로 전환하는 더 좋은 방법이 있습니까? 좀 더 구체적으로 알려줄 필요가있는 경우, 제 요점을 명확히하기를 바랍니다. 유사한 문제로 경험을 공유 한 경우 감사하게 생각합니다.
절전 모드로 전환하기 위해 작업을 종료 할 필요는 없습니다. 일반적으로 RTOS 스레드를 중지했다가 다시 시작하지 않으려합니다. – rost0031
다른 시나리오를 살펴 보겠습니다. 스레드가 작업을 중단하도록 지시하는 일부 전역 변수를 사용하는 경우 (예 : ) while (sleep) {osDelay (1000)}; 나는 그것이 __wfi()라고 믿는다; 명령은 인터럽트가 실행될 때까지 CPU를 중지하므로 이것이 현재의 소비에 어떻게 반응하는지 궁금합니다. – Alutis
저전력 모드에있는 동안 스레드가 여전히 "실행 중"이어야합니다. 전체 프로세서는 잠 들어 있고 활성 상태 인 유일한 회로는 RAM이고 잠자기 상태에서 벗어나기위한 인터럽트 모니터링입니다.이 프로세서는 사용중인 프로세서에 따라 다르지만 아이디어를 얻을 수 있습니다. – rost0031