2016-06-07 2 views
0

현재 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 명령을 실행합니까? 절전 모드로 전환하는 더 좋은 방법이 있습니까? 좀 더 구체적으로 알려줄 필요가있는 경우, 제 요점을 명확히하기를 바랍니다. 유사한 문제로 경험을 공유 한 경우 감사하게 생각합니다.

+0

절전 모드로 전환하기 위해 작업을 종료 할 필요는 없습니다. 일반적으로 RTOS 스레드를 중지했다가 다시 시작하지 않으려합니다. – rost0031

+0

다른 시나리오를 살펴 보겠습니다. 스레드가 작업을 중단하도록 지시하는 일부 전역 변수를 사용하는 경우 (예 : ) while (sleep) {osDelay (1000)}; 나는 그것이 __wfi()라고 믿는다; 명령은 인터럽트가 실행될 때까지 CPU를 중지하므로 이것이 현재의 소비에 어떻게 반응하는지 궁금합니다. – Alutis

+0

저전력 모드에있는 동안 스레드가 여전히 "실행 중"이어야합니다. 전체 프로세서는 잠 들어 있고 활성 상태 인 유일한 회로는 RAM이고 잠자기 상태에서 벗어나기위한 인터럽트 모니터링입니다.이 프로세서는 사용중인 프로세서에 따라 다르지만 아이디어를 얻을 수 있습니다. – rost0031

답변

0

다른 스레드에서 동적 할당을 사용합니까? 그렇다면 실행중인 스레드를 죽이면 메모리 누수가 발생할 수 있습니다.

+0

동적 할당을 사용하지 않으려 고합니다. 따라서 이것이 내 문제라고 생각하지 않습니다. – Alutis