작업 풀 라이브러리 - FreeRTOS

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

작업 풀 라이브러리

중요

이 문서는 FreeRTOS 릴리스 202012.00에서 사용하기 위한 FreeRTOS 사용 설명서의 보관 버전입니다. 이 문서의 최신 버전은 FreeRTOS 사용 설명서를 참조하세요.

개요

FreeRTOS는 FreeRTOS 태스크 풀 라이브러리를 사용한 태스크 관리를 지원합니다. 작업 풀 라이브러리를 사용하여 백그라운드 작업을 예약하고 안전하고 비동기적인 작업 예약 및 취소를 허용할 수 있습니다. 작업 풀 API로 애플리케이션의 작업을 구성하여 성능과 메모리 사용량 간의 균형을 최적화할 수 있습니다.

작업 풀 라이브러리는 작업 풀 및 작업 풀 작업의 두 가지 기본 데이터 구조로 빌드됩니다.

작업 풀(IotTaskPool_t)

작업 풀은 실행을 위해 작업 대기열을 관리하고 작업을 실행하는 작업자 스레드를 관리하는 디스패치 대기열을 포함합니다.

작업 풀 작업(IotTaskPoolJob_t)

작업 풀 작업은 백그라운드 작업 또는 시간이 지정된 백그라운드 작업으로 실행될 수 있습니다. 백그라운드 작업은 FIFO(선입선출) 방식으로 시작되며 시간 제한이 없습니다. 시간이 지정된 작업은 타이머에 따라 백그라운드 실행이 예약됩니다.

참고

작업 풀은 시간이 지정된 작업이 특정 시간대가 아니라 제한 시간이 경과한 후에만 실행되도록 보장할 수 있습니다.

종속성 및 요구 사항

작업 풀 라이브러리에는 다음 종속성이 있습니다.

  • 예약되거나 진행 중인 작업 풀 운영에 대한 데이터 구조를 유지 관리하는 선형 컨테이너(목록/대기열) 라이브러리

  • 로깅 라이브러리(IOT_LOG_LEVEL_TASKPOOL 구성 설정이 IOT_LOG_NONE이 아닌 경우)

  • 스레드 관리, 타이머, 클록 기능 등을 위해 운영 체제와의 인터페이스를 제공하는 플랫폼 계층입니다.

Diagram showing task pool connections to components like logging, static memory, and thread management.

Features

작업 풀 라이브러리 API를 사용하여 다음을 수행할 수 있습니다.

  • 라이브러리의 비 차단 API 함수로 즉시 작업과 지연 작업을 예약합니다.

  • 정적 및 동적으로 할당된 작업을 만듭니다.

  • 시스템 리소스를 기반으로 성능 및 공간을 확장하도록 라이브러리 설정을 구성합니다.

  • 작업을 동적으로 생성할 때 캐싱을 사용자 지정하여 메모리 오버헤드를 낮춥니다.

문제 해결

작업 풀 라이브러리 함수는 오류 코드를 IotTaskPoolError_t 열거형 값으로 반환합니다. 각 오류 코드에 대한 자세한 내용은 태스크 풀 C SDK API 참조IotTaskPoolError_t 열거형 데이터 형식에 대한 참조 설명서를 참조하세요.

사용 제한

인터럽트 서비스 루틴(ISR)에서는 작업 풀 라이브러리를 사용할 수 없습니다.

차단 작업(특히 무기한 차단 작업)을 수행하는 작업 풀 사용자 콜백은 지양할 것을 강력히 권장합니다. 차단 작업이 오래 지속될 경우 작업 풀 스레드가 스틸되고 교착 또는 결핍이 발생할 가능성이 있습니다.

Initialization(초기화)

애플리케이션은 작업 풀을 사용하기 전에 IotTaskPool_CreateSystemTaskPool을 호출하여 시스템 작업 풀의 인스턴스를 초기화해야 합니다. 애플리케이션은 부팅 시퀀스에서 시스템 수준 작업 풀이 라이브러리가 작업 풀을 사용하기 전에 충분히 일찍, 그리고 애플리케이션 코드가 작업 풀에 작업을 게시하기 전에 초기화되었는지 확인해야 합니다. 부팅 직후 시스템은 모든 라이브러리가 공유할 단일 시스템 수준 작업 풀을 초기화합니다. 초기화 후에, IOT_SYSTEM_TASKPOOL API와 함께 사용할 작업 풀 핸들을 검색할 수 있습니다.

참고

IotTaskPool_CreateSystemTaskPool을 호출하면 작업 풀 데이터 구조 및 상태를 보유할 메모리가 할당되지 않지만 작업 풀의 스레드와 같은 종속 엔터티 및 데이터 구조를 보유하기 위해 메모리를 할당할 수 있습니다.

API 참조

전체 API 참조는 작업 풀 C SDK API 참조를 참조하십시오.

사용 예

반복되는 AWS IoT Device Defender 지표 모음을 예약해야 하고 타이머를 사용하여 MQTT 연결, 구독 및 게시 APIs. 다음 코드는 MQTT 연결에서 연결 해제되는 연결 해제 콜백과 함께 MQTT 전반의 AWS IoT Device Defender 지표를 수락하기 위한 콜백 함수를 정의합니다.

/* An example of a user context to pass to a callback through a task pool thread. */ typedef struct JobUserContext { uint32_t counter; } JobUserContext_t; /* An example of a user callback to invoke through a task pool thread. */ static void ExecutionCb( IotTaskPool_t * pTaskPool, IotTaskPoolJob_t * pJob, void * context ) { ( void )pTaskPool; ( void )pJob; JobUserContext_t * pUserContext = ( JobUserContext_t * )context; pUserContext->counter++; } void TaskPoolExample( ) { JobUserContext_t userContext = { 0 }; IotTaskPoolJob_t job; IotTaskPool_t * pTaskPool; IotTaskPoolError_t errorSchedule; /* Configure the task pool to hold at least two threads and three at the maximum. */ /* Provide proper stack size and priority per the application needs. */ const IotTaskPoolInfo_t tpInfo = { .minThreads = 2, .maxThreads = 3, .stackSize = 512, .priority = 0 }; /* Create a task pool. */ IotTaskPool_Create( &tpInfo, &pTaskPool ); /* Statically allocate one job, then schedule it. */ IotTaskPool_CreateJob( &ExecutionCb, &userContext, &job ); errorSchedule = IotTaskPool_Schedule( pTaskPool, &job, 0 ); switch ( errorSchedule ) { case IOT_TASKPOOL_SUCCESS: break; case IOT_TASKPOOL_BAD_PARAMETER: // Invalid parameters, such as a NULL handle, can trigger this error. case IOT_TASKPOOL_ILLEGAL_OPERATION: // Scheduling a job that was previously scheduled or destroyed could trigger this error. case IOT_TASKPOOL_NO_MEMORY: // Scheduling a with flag #IOT_TASKPOOL_JOB_HIGH_PRIORITY could trigger this error. case IOT_TASKPOOL_SHUTDOWN_IN_PROGRESS: // Scheduling a job after trying to destroy the task pool could trigger this error. // ASSERT break; default: // ASSERT*/ } /* ................................. */ /* ... Perform other operations ... */ /* ................................. */ IotTaskPool_Destroy( pTaskPool ); }