기술 여행자 ( ArsViator ) : ESP 32 에서 FreeRTOS 사용 - TASK 에 parameter 넘겨 주 기 
 ESP 32 에서 FreeRTOS 사용 - TASK 에 parameter 넘겨 주 기 
 FreeRTOS 에서 태 스 크 를 만드 는 방법 은 이전 포스트 에서 설명 했 다 . 이때 사용 하 는 API 에 보 면 몇 개 의 파라미터 가 있 는데 " void * pvParameters ", " UBaseType _ t uxPriority ", " TaskHandle _ t * pxCreatedTask " 를 사용 하 는 법 을 설명 하 겠 다 . 
 1 ) Task Parameter 
 " void * pvParameters " 는 TaskFunction _ t 에 입력 을 전달 해 주 기 위해 사용 한다 . 예 를 들 어 void hello _ world _ task ( void * param ) 이 라는 태 스 크 를 가지 고 있 으면 " void * pvParameters " 는 " void * param " 이 다 . 우리 는 이 예제 에서 태 스 크 를 만들 고 그 태 스 크 에 파라미터 를 전달 할 때 이 파라미터 가 태 스 크 함수 에 전달 되 고 , 터미널 에 이 파라미터 를 출력 한다 . 
 xTaskCreate ( task 1 , / / task function 
 " task 1 ", / / name of task 
 10000 , / / stack size of task 
 ( void *) task 1 Param , / / parameter of the task 
 / / this function will be invoked when additionalTask was created 
 void task 1 ( void * parameter ) 
 / / because this is infinitely loop 
 2 ) Task Priorities 
 FreeRTOS 는 3 가지 종류 의 스 케 쥴 링 방식 을 지원 한다 . 
 실행 중 인 태 스 크 는 running 상태 에서 blocked 상태 로 바뀌 거나 또는 taskYIELD ( ) 를 호출 할 때 컨 택스 트 스위칭 이 발생 한다 . 그럼 나머지 태 스 크 중 에 가장 높 은 우선순위 를 가지 고 있 는 태 스 크 가 실행 되 게 된다 . 
 - Prioritized pre - emptive scheduling with time slicing 
 높 은 우선순위 ( priority ) 를 가진 태 스 크 가 낮 은 우선순위 를 가진 태 스 크 를 preempt 한다 . 같 은 우선순위 를 가진 태 스 크 끼리 는 time tick 인터럽트 가 발생 할 때 마다 순서 를 바꿔 실행 한다 . ( RTOS 는 시간 을 측정 하 기 위한 타이머 인터럽트 를 가지 고 있 는데 , 매번 인터럽트 가 발생 할 때 마다 RTOS 는 태 스 크 를 unblock 또는 깨울 시간 인지 체크 한다 . ) 
 - Priotitized pre - emptive scheduling without time slicing 
 높 은 우선순위 ( priority ) 를 가진 태 스 크 가 낮 은 우선순위 를 가진 태 스 크 를 preempt 한다 . 같 은 우선순위 를 가진 태 스 크 는 매번 time tick 인터럽트 가 발생 할 때 마다 순서 를 바꾸 지 않 는다 . ( 실행 중 인 태 스 크 는 더 높 은 우선순위 를 가진 태 스 크 에 의해 preempt 될 때 까지 계속 실행 한다 . ) 
 2 - 1 ) Prioritized pre - emptive scheduling with time slicing 데모 
 현재 Arduino ESP 32 의 FreeRTOS 는 Prioritized pre - emptive scheduling with time slicing 을 사용 하 도록 설정 되 어 있 으므로 여기 서 는 이 방식 의 스 케 쥴 링 데모 를 만들 어 보 았 다 . 2 개 의 태 스 크 를 만드 는데 task 1 은 우선 순위 1 , task 2 는 우선 순위 4 를 가진다 . task 1 은 " task 1 is running " 과 " task 1 is ending " 이 라는 글자 를 터미널 에 출력 한다 . task 2 는 " task 2 is running " 과 " task 2 is ending " 이 라는 글자 를 터미널 에 출력 한다 . 그러므로 대부분 의 시간 은 task 2 가 터미널 에 출력 하 는 데 사용 된다 . 
 task 1 , / / Task function 
 " task 1 ", / / name of task 
 10000 , / / Stack size of task 
 ( void *) task 1 Param , / / parameter of the task 
 1 , / / priority of the task 
 task 2 , / / Task function . 
 " task 2 ", / / name of task . 
 4 , / / priority of the task 
 2 - 2 ) Task Handle 
 Task Handle 은 만들 어 진 테스 크 의 레퍼런스 를 가지 고 있 기 때문 에 나중 에 그 태 스 크 를 삭제 하 거나 우선 순위 를 바꾸 는 등 의 작업 을 할 수 있 다 . 
 2 - 2 - 1 ) Task Handle 데모 
 위 의 2 - 1 ) 데모 코드 를 재 사용 하 는 데 요구 사항 을 약간 바꿔 보 았 다 . task 2 가 20 번 실행 되 면 task 1 의 우선 순위 를 4 로 바꾸 고 task 2 의 우선 순위 를 1 로 바꿔 주 어 이제 부터 는 터미널 에 task 1 이 출력 하 는 내용 이 대부분 을 차지 하 게 된다 . 
 // task handle variables to hold instances of tasks 
 task 1 , / / Task function . 
 " task 1 ", / / name of task . 
 10000 , / / Stack size of task 
 1 , / / priority of the task 
 task 2 , / / Task function . 
 " task 2 ", / / name of task . 
 4 , / / priority of the task 
 / / if count is 20 then we swap the priority of 2 tasks 
 2 - 3 ) Idle Task Hook Function 
 Idle 태 스 크 ( 백그라운드 태 스 크 ) 는 다음 과 같 은 특징 을 가진다 . 
 - 스 케 쥴 러 에 의해 만들 어 짐 
 - 가장 낮 은 우선순위 를 가짐 ( 우선순위 0 ) 
 - 다른 모든 태 스 크 들 이 blocked 상태 일 때 실행 상태 가 됨 
 Idle 태 스 크 에 함수 를 hook 하 는 것 이 가능 하 다 . 이 함수 는 idle 태 스 크 가 실행 될 때 호출 된다 . 
 이 태 스 크 를 사용 해 다음 과 같 은 일 을 하 는데 사용 할 수 있 다 . 
 - 백 그라운드 에서 어떤 작업 수행 
 - 시스템 의 spare time 측정 
 - 할 일 이 없 을 떼 마이크 로 프로세서 를 low power mode 로 진입 시킴 
 - 태 스 크 가 삭제 될 때 리소스 정리 
 주의 ) 태 스 크 hook 함수 내 에서 idle 태 스 크 를 block 시키 는 어떠 한 작업 도 하 면 안 된다 . 
 task hook 함수 를 사용 하 려면 단순히 " bool vApplicationIdleHook ( void ) " 프로토타입 의 함수 를 구현 해 주 고 esp _ register _ freertos _ idle _ hool ( vApplicationIdleHook ) 을 호출 해 hook 함수 를 등록 해 주 면 된다 . 
 2 - 3 - 1 ) 데모 
 task hook 함수 를 만들 어 주 고 이 함수 가 호출 될 때 마다 카운터 를 1 씩 증가 시킨다 . 생성 된 태 스 크 함수 에서 는 단지 이 값 을 출력 한다 . 
 10000 ,   / / Stack size of task 
 ( void *) task 1 Param , / / parameter of the task 
 / / block this task so that Idle task has chance to run 
 / / define task hook function 
 Posted by ArsViator at 오후 4 : 51 
 Labels : 아두이노 , arduino , esp 32 freertos , ESP 32 , Espressif , FreeRTOS , task parameter 
 ESP 32 에서 JSON 파싱 
 아두이노 우노 / 메가 시리얼 포트 에서 가능 한 최대 통신 속도 는 ? 
 ESP 32 에서 FreeRTOS 사용 - Message Queue 사용 하 기