[FREERTOS] 3. 자주 사용하는 API (추가 예정)

YUN·2026년 3월 12일
post-thumbnail

1. Task 우선순위 사용 범위 설정

CubeMX의 MAX_PRIORITEIS 설정을 통해 사용할 Task 우선순위의 범위를 설정할 수 있다.

2. Task 생성

BaseType_t xTaskCreate( TaskFunction_t pvTaskCode,
 const char * const pcName,
 unsigned short usStackDepth,
 void *pvParameters,
 UBaseType_t uxPriority,
 TaskHandle_t *pxCreatedTask );
  • pvTaskCode : Task 함수
  • pcName : Task 함수의 이름
  • usStackDepth : Stack에 넣을 수 있는 word(4Byte) 단위 데이터 개수
  • pvParameters : Task에 전달할 파라미터
  • uxPriority : Task 우선순위
  • pxCreatedTask : Task 핸들 (Task 식별, 접근할때 사용)

3. Task 삭제

#include “FreeRTOS.h”
#include “task.h”
void vTaskDelete( TaskHandle_t pxTask );
  • pxTask : 삭제할 태스크 핸들
    • 인자로 NULL을 전달하면 자기 자신을 삭제할 수 있다.

4. Task 우선 순위 변경

#include “FreeRTOS.h”
#include “task.h”
void vTaskPrioritySet( TaskHandle_t pxTask, UBaseType_t uxNewPriority );
  • pxTask : 변경하고자하는 Task의 Handle
    • NULL을 전달하면 자기 자신의 우선 순위 변경 가능
  • uxNewPriority : 새로운 우선 순위
  • 주의
    • IDLE 태스크의 우선 순위 변경은 불가능하다

5. Task 일시 중단(Suspend)

#include “FreeRTOS.h”
#include “task.h”
void vTaskSuspend( TaskHandle_t pxTaskToSuspend );
  • xTaskToSuspend : Suspend 상태로 보낼 Task의 Handle
  • Task를 다시 동작시키려면 vTaskResume()을 이용해야함

6. Task 의 실행 재개(Resume)

#include “FreeRTOS.h”
#include “task.h”
void vTaskResume( TaskHandle_t pxTaskToResume );
  • pxTaskToResume : Ready 상태로 보낼 Task의 Handle

7. Task를 일정 시간 Block 상태로 보내기

#include “FreeRTOS.h”
#include “task.h”
void vTaskDelay( TickType_t xTicksToDelay );
  • xTicksToDelay : Block 상태로 보낼 Tick 단위 시간
    • 내가 Tick Interrupt를 얼마 주기로 설정했냐에 따라 같은 값을 전달해도 동작이 달라진다.
    • 1 Tick의 주기는 FreeRTOSConfig_base.hconfigTICK_RATE_HZ 로 설정한다.
  • vTaskDelay( pdMS_TO_TICKS(100) )
    • pdMS_TO_TICKS() 매크로를 활용하면 현재 Tick Interrupt 주기가 얼마이든 인자로 전달한 ms단위 시간만큼을 Tick 단위로 반환한다 <---권장되는 방법
  • Running 상태이던 Task를 Block 상태로 보내므로 필연적으로 Context Switch가 발생한다.

8. Task를 내가 원하는 주기마다 Ready로 보내기 (실행 빈도 일정하게 유지)

#include “FreeRTOS.h”
#include “task.h”
void vTaskDelayUntil( TickType_t *pxPreviousWakeTime, TickType_t xTimeIncrement );
  • pxPreviousWakeTime :
  • xTimeIncrement :

9. 상호 배제

임계 영역 보호를 위한 상호 배제 구현 방법

(1) 공유 변수 사용 X
(2) 세마포어 or 뮤텍스 사용 <---------- 가장 추천되고, 안전한 방식. 그러나 남발하면 코드가 늘어나니, 성능 저하 유발

(3) 임계영역에서 인터럽트 일시 중지 -> Tick Interrupt 발생 x -> 스케줄링(Preemptino) 발생 x
(4) 공유 변수 사용 O 더라도, Task 1개가 특정 변수 or I/O 장치를 독점적으로 사용하게한다.

(1) 임계영역에서 인터럽트 일시 중지

//임계영역 시작
taskENTER_CRITICAL();
//...임계영역
taskEXIT_CRITICAL();
//임계영역 끝

taskENTER_CRITICAL() 와 taskEXIT_CRITICAL() 사이에서 인터럽트가 일시 중지됨

  • 주의
    • 인터럽트 금지 구간에서는 FreeRTOS API 사용하면 안된다.
      • 인터럽트 금지 구간에서 vTaskDelay() 같은 FREERTOS API 사용시 시스템이 멈춰버릴 수도 있다
    • 인터럽트 금지 구간이 길어질수록 -> 스케줄링 동작 X인 시간 증가 -> 시스템의 실시간성이 떨어진다.

10. 문맥 전환 - vPortYieldProcessor()

기존에 실행되던 Task의 레지스터 값을 모두 Stack에 저장 -> 새로운 Task의 Stack에 저장된 레지스터 값을 CPU로 로드 -> 새로운 Task가 실행됨

profile
안녕하세요. 전자공학부 학부생의 공부 기록입니다.

0개의 댓글