작성
·
691
·
수정됨
0
안녕하세요 FreeRTOS 프로그래밍 과목을 수강 중인 문수영이라고 합니다.
항상 좋은 강의 잘 듣고 있습니다. 감사합니다.
태스크 운용에 관한 실습과제 (1.4. TODO #3) 수행 중 문의사항이 있어 질문 드립니다.
(TASKMAN.elf)
FreeRTOS에서 태스크의 동작과 관련해서는 다음의 규칙이 적용된다고 알고 있습니다.
현재 ready 상태인 태스크 중에서 가장 우선순위가 높은 태스크가 실행된다
가장 우선순위가 높은 태스크가 종료되거나 대기 상태로 전이하면 그 다음으로 우선순위가 높은 태스크가 실행된다. 단, 대기 상태로 전이했던 태스크가 다시 깨어나면 CPU 실행 권한은 깨어난 태스크에 넘겨진다
위 규칙에 따르면 task1의 우선순위가 task2 보다 높을 경우, task1이 대기상태로 전이하면 task2가 실행되지만, task1이 다시 깨어나면 task1이 실행되어야 한다고 생각됩니다.
예를 들어, task1에서 아래 문장이 실행되면
vTaskDelay (pdMS_TO_TICKS (1000));
task2가 실행되다가 1초 뒤에는 (1000ms =1초이므로) 다시 task1이 실행되어 화면에 a가 출력되어야 할 것으로 보이나 실제 결과는 b만 계속 출력됩니다.
위와 같은 결과가 나오는 이유가 무엇인지, 예제에 관해 제가 혹시 잘못 이해한 것이 있는지 조언 주시면 감사하겠습니다. (참고로 task1의 우선순위는 10, task2의 우선순위는 9입니다)
아래는 소스 코드와 실행 화면 입니다
<task.c>
static void Task1( void const *pvParameters )
{
const char *pcTaskName = "Task1";
pvParameters = pvParameters; // for compiler warning
/* Print out the name of this task. */
printf( "%s is running\n", pcTaskName );
printf("\n------- Task1 information -------\n");
printf("task1 name = %s \n",pcTaskGetName( xHandle1 ));
printf("task1 priority = %d \n",(int)uxTaskPriorityGet( xHandle1 ));
// printf("task1 status = %d \n",eTaskGetState( xHandle1 ));
printf("----------------------------------\n");
while(1) {
/* TODO #3:
코드를 실행 하여 보고
vTaskDelay() 코드를 주석 처리한 후 그 결과를 설명한다 */
#if 1 // No comment
vTaskDelay (pdMS_TO_TICKS (1000));
printf("a"); fflush(stdout); // 문자 'a' 출력
#endif // TODO #3
task1timer++;
}
}
static void Task2( const struct Param_types *Param )
{
const char *pcTaskName = "Task2";
/* Print out the name of this task. */
printf( "%s is running\n", pcTaskName );
printf("\n------- Task2 parameter passed from main --------\n");
printf("task2 first parameter = %d \n",Param->P1);
printf("task2 second parameter = %d \n",Param->P2);
printf("--------------------------------------------------\n");
while(1) {
/* TODO #3:
코드를 실행 하여 보고
vTaskDelay() 코드를 주석 처리한 후 그 결과를 설명한다 */
#if 1 // No comment
//vTaskDelay (pdMS_TO_TICKS (1000));
printf("b"); fflush(stdout); // 문자 'b' 출력
#endif // TODO #3
task2timer++;
}
}
<실행 화면, task2가 실행된 이후, 계속 task2만 실행되며 task1이 실행되지 않음>
답변 1
0
안녕하세요, 인프런 AI 입니다.
FreeRTOS에서는 태스크의 우선순위에 따라 현재 준비 상태인 가장 우선순위가 높은 태스크가 실행됩니다. 따라서, task1의 우선순위가 task2 보다 높을 경우, task1이 대기상태로 전이하면 task2가 실행됩니다. 그러나, vTaskDelay() 함수를 사용하여 일정 시간 동안 태스크를 대기시키는 경우, 해당 시간 동안은 다른 태스크가 실행될 수 있습니다. 따라서, task1에서 vTaskDelay() 함수를 실행한 후 task2가 실행되다가 1초 뒤에는 (1000ms =1초이므로) 다시 task1이 실행될 것으로 보이지만, 실제 결과는 b만 출력될 수 있습니다.
만약, task1이 대기상태로 전이한 후 다시 실행되길 원한다면 vTaskDelay() 대신에 vTaskResume()을 사용하여 깨어날 때까지 대기하도록 할 수 있습니다. 이렇게 하면 task1이 대기상태에서 다시 깨어날 때, CPU 실행 권한은 깨어난 task1에 넘겨지므로 task1이 실행됩니다.
추가적으로, 예상한 결과가 나오지 않는 경우 코드를 재확인하고 디버깅을 해보시는 것이 좋습니다. 감사합니다.