任務集區程式庫 - FreeRTOS

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

任務集區程式庫

重要

這是 FreeRTOS 使用者指南的封存版本,適用於 FreeRTOS 版本 202012.00。如需本文件的最新版本,請參閱 FreeRTOS 使用者指南

概觀

FreeRTOS 支援使用 FreeRTOS 任務集區程式庫進行任務管理。任務集區程式庫可讓您排程背景任務,也可進行或取消安全、非同步任務的排程。使用任務集區 API,您可以設定您應用程式的任務,以最佳化效能和記憶體使用量之間的權衡取捨。

任務集區程式庫建置在兩個主要資料結構上:任務集區和任務集區任務。

任務集區 (IotTaskPool_t)

任務集區包含了分派佇列,可管理要執行的工作佇列,以及執行工作的工作者執行續。

任務集區工作 (IotTaskPoolJob_t)

任務集區工作可做為背景工作或定時的背景工作來執行。背景工作是以先進先出的順序開始進行的,且沒有時間限制。定時工作是根據計時器來排定以在背景執行。

注意

任務集區只能保證定時工作會在逾時時間之後執行,而不會在特定時段之內的時間執行。

相依性和要求

任務集區程式庫有如下的相依性:

  • 線性容器 (清單/佇列) 程式庫,是用於維護已排程和正在進行的任務集區操作的資料結構。

  • 記錄程式庫 (如果 IOT_LOG_LEVEL_TASKPOOL 組態設定不是 IOT_LOG_NONE)。

  • 向作業系統提供界面的平台層,適用於執行緒管理、計時器、時鐘函數等。

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

功能

使用任務集區程式庫 API,您可以執行下列動作:

  • 使用程式庫的非封鎖 API 函式來排程立即和延遲工作。

  • 建立靜態和動態分配工作。

  • 依您的系統資源設定程式庫設定以擴展效能和使用量。

  • 在動態建立工作時自訂低記憶體負擔的快取。

故障診斷

任務集區程式庫函式會以 IotTaskPoolError_t 列舉值傳回錯誤代碼。如需每個錯誤代碼的詳細資訊,請參閱任務集區 C SDK API 參考中的IotTaskPoolError_t列舉資料類型參考文件。 https://docs.aws.amazon.com/freertos/latest/lib-ref/c-sdk/taskpool/index.html

使用限制

任務集區程式庫無法由中斷服務常式 (ISR) 使用。

我們強烈建議執行阻擋式操作 (尤其是無限期阻擋式操作) 的任務集區使用者不要使用回呼。長期的阻擋式操作將有效地奪取任務集區執行緒,並造成潛在的死鎖或資源耗盡。

初始化

應用程式需要呼叫 IotTaskPool_CreateSystemTaskPool,以在使用任務集區之前初始化系統任務集區的值 行個體。應用程式需要確保任何程式庫使用任務集區之前,以及在任何應用程式碼將工作發佈到任務集區之前,在啟動序列中儘早初始化系統層級的任務集區。啟動之後不久,系統將隨即初始化單一、系統層級的任務集區,以供所有程式庫進行共享。在初始化後,便可擷取任務集區處理常式以和 IOT_SYSTEM_TASKPOOL API 一起使用。

注意

呼叫 IotTaskPool_CreateSystemTaskPool 不會分配記憶體來保留任務集區資料結構和狀態,但可能分配記憶體來保留相依實體和資料結構 (例如任務集區執行緒)。

API 參考

如需完整的 API 參考,請參閱 任務集區 C SDK API 參考

範例使用方式

假設您需要排程重複的 AWS IoT Device Defender 指標集合,而且您決定使用計時器來排程集合,以呼叫 MQTT 連線、訂閱和發佈 APIs。下列程式碼定義一個回呼函數,以接受 MQTT 中的 AWS IoT Device Defender 指標,並具有中斷連線回呼,該回呼會中斷與 MQTT 連線的連線。

/* 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 ); }