portYIELD() 사용법에 대해 질문드립니다.
안녕하세요.
portYIELD() 사용법에 대해 궁금한게 있어 질문드립니다.
portYIELD()를 실행하게 되면 task가 점유하고 있던 CPU를 반납하는 명령으로 알고 있습니다.
그런데 아래의 그림과 같이 실행을 하게 되면
TaskMain은 실행 되지 않아야 하지 않는지요?
#define TASK_MAIN_PRIO 5
#define TASK_TASK1_PRIO 4
#define TASK_TASK2_PRIO 3
#define TASK_TASK3_PRIO 2
TaskHandle_t xHandleMain, xTask1Handle, xTask2Handle;
void userThread(void)
{
xTaskCreate((TaskFunction_t)TaskMain,
"TaskMain",
128,
NULL,
TASK_MAIN_PRIO,
&xHandleMain);
xTaskCreate((TaskFunction_t)vTask1,
"vTask1",
128,
NULL,
TASK_TASK1_PRIO,
&xTask1Handle);
}
void TaskMain(void const *pvParameters)
{
while(1)
{
for(uint8_t i=0; i<5; i++)
{
HAL_GPIO_TogglePin(GPIO5_BEAD_GPIO_Port, GPIO5_BEAD_Pin);
HAL_Delay(1);
}
vTaskSuspend(xHandleMain);
}
}
void vTask1(void const *pvParameters)
{
while(1)
{
for(uint8_t i=0; i<5; i++)
{
HAL_GPIO_TogglePin(GPIO4_BEAD_GPIO_Port, GPIO4_BEAD_Pin);
HAL_Delay(1);
}
portYIELD();
vTaskResume(xHandleMain);
//portYIELD();
}
}
위 소스를 보게 되면
최초 MainTask가 실행을 하다가 5번 GPIO를 5번 토굴하고 block 상태로 전환
Task1번에서 gpio를 5번 토굴하고 vTaskResume을 실행하기 전에 portYIELD()를 만나기 때문에vTaskResume(xHandleMain) 실행이 안되어야 하지 않는지요?
실행 결과 TaskMain이 실행되어 이렇게 문의드립니다.
감사합니다.
답변 1
0
안녕하세요. research님!
FreeRTOS에서 portYIELD 함수는 우선순위가 같은 다른 태스크가 실행되도록 CPU를 양보합니다.
portYIELD 함수가 호출되면 현재 실행 중인 태스크는 일시 중지되고, 다른 동등한 우선순위의 태스크가 실행되도록 스케줄러에 의해 선택됩니다. vTask1() 의 경우 지금 당장은 portYIELD() 함수에 의해 CPU 를 양보하였지만 얼마안가 다시 스케줄러에 의해 CPU 를 테이크(TAKE)할 것입니다.
portYIELD();
vTaskResume(xHandleMain);그렇다면 vTaskResume(xHandleMain); 함수가 실행될 것이고, TaskMain() 태스크를 휴면 상태에서 깨어나게 할 것입니다.
만약에 포팅을 할때 1년에 한번 잡는 치명적인 문제를 해결하는 코드가 들어갔다고 가정하면
0
57
2
STM32 포팅할 때 STM32 Project가 없음
0
166
2
FreeRTOS 멀티코어 지원안됨?
0
87
2
[소스코드 분석-configUSE_TIME_SLICING] TASK1,2의 우선순위가 동일할 때, configUSE_TIME_SLICING값 변경에 따른 출력 변화
0
85
2
포팅 부탁드립니다!
0
60
1
포팅 부탁드립니다. <NUCLEO-G071RB>
0
67
2
상호배제 후 되지를 않아서 질문드립니다.
0
62
1
수료증 발급 기준 수정 요청
1
72
1
재진입가능여부에 관한 질문
1
67
1
01_TASKMAN프로젝트 디버깅 모드 실패
1
77
2
그러면 malloc/free가 아닌 동적할당자를 써서 메모리를 할당했기떄문에
1
71
2
실행순서
1
77
2
uart 전송중에는 스위칭이 금지되나요?
1
74
2
스택오버플로우 실습 중 stack size 설정 질문
0
81
2
포팅 원합니다.
2
77
2
코루틴 실습질문
1
100
2
TODO 2번 문제
1
141
4
10. 선점형 커널 그림 설명중 우선순위가 반대인 경우에도 Task B가 먼저 수행되나요?
1
82
2
디버거모드에 진입이 안됩니다.
0
176
2
prvExampleTaskHook 함수 호출 부분에 대해 문의드립니다.
0
120
2
보드 STM32H735IG와 강의 호환 여부 문의
1
153
3
[ L152RE ] 원샷 소프트타이머 실행 잘 되시나요?
1
159
2
Deferred Interrupt Processing 샘플 예제 문의 드립니다.
1
121
2
포팅 서비스 부탁드립니다
1
125
2





