Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Perpustakaan Task Pool
penting
Ini adalah versi arsip dari Panduan Pengguna FreeRTOS untuk digunakan dengan rilis FreerTOS 202012.00. Untuk versi terbaru dari dokumen ini, lihat Panduan Pengguna FreeRTOS.
Gambaran Umum
FreeRTOS mendukung manajemen tugas dengan pustaka FreeRTOS Task Pool. Pustaka Task Pool memungkinkan Anda menjadwalkan tugas latar belakang, dan memungkinkan penjadwalan dan pembatalan tugas yang aman dan asinkron. Dengan menggunakan Task Pool APIs, Anda dapat mengonfigurasi tugas aplikasi untuk mengoptimalkan trade-off antara kinerja dan jejak memori.
Pustaka Task Pool dibangun di atas dua struktur data utama: pekerjaan Task Pool dan Task Pool.
Task Pool (IotTaskPool_t
)
Task Pool berisi antrian pengiriman yang mengelola antrean pekerjaan untuk dieksekusi, dan mengelola thread pekerja yang mengeksekusi pekerjaan.
Lowongan kerja Task Pool (IotTaskPoolJob_t
)
Pekerjaan Task Pool dapat dieksekusi sebagai pekerjaan latar belakang, atau pekerjaan latar belakang berjangka waktu. Pekerjaan latar belakang dimulai secara First-In-First-Out berurutan dan tidak memiliki kendala waktu. Pekerjaan berjangka waktu dijadwalkan untuk eksekusi latar belakang sesuai dengan pengatur waktu.
catatan
Task Pool hanya dapat menjamin bahwa pekerjaan berjangka waktu akan dieksekusi setelah batas waktu berlalu, dan tidak dalam jangka waktu tertentu.
Ketergantungan dan persyaratan
Pustaka Task Pool memiliki dependensi berikut:
-
Pustaka Linear Containers (daftar/antrian) untuk memelihara struktur data untuk operasi kumpulan tugas terjadwal dan dalam proses.
-
Pustaka logging (jika pengaturan
IOT_LOG_LEVEL_TASKPOOL
konfigurasi tidakIOT_LOG_NONE
). -
Lapisan platform yang menyediakan antarmuka ke sistem operasi untuk manajemen utas, pengatur waktu, fungsi jam, dll.

Fitur
Menggunakan pustaka Task Pool APIs, Anda dapat melakukan hal berikut:
-
Jadwalkan pekerjaan langsung dan ditangguhkan dengan fungsi API non-pemblokiran perpustakaan.
-
Buat pekerjaan yang dialokasikan secara statis dan dinamis.
-
Konfigurasikan pengaturan pustaka untuk menskalakan kinerja dan footprint, berdasarkan sumber daya sistem Anda.
-
Sesuaikan caching untuk overhead memori rendah saat membuat pekerjaan secara dinamis.
Pemecahan Masalah
Fungsi pustaka Task Pool mengembalikan kode kesalahan sebagai IotTaskPoolError_t
nilai yang disebutkan. Untuk informasi selengkapnya tentang setiap kode kesalahan, lihat dokumentasi referensi untuk tipe data yang IotTaskPoolError_t
disebutkan di Referensi API SDK Kumpulan Tugas C.
Pembatasan penggunaan
Pustaka kumpulan Task Pool tidak dapat digunakan dari interrupt service routine (ISR).
Kami sangat tidak menyarankan callback pengguna kumpulan tugas yang melakukan operasi pemblokiran, terutama operasi pemblokiran yang tidak terbatas. Operasi pemblokiran yang sudah berlangsung lama secara efektif mencuri utas kumpulan tugas, dan menciptakan potensi kebuntuan atau kelaparan.
Inisialisasi
Sebuah aplikasi perlu memanggil IotTaskPool_CreateSystemTaskPool
untuk menginisialisasi instance dari kumpulan tugas sistem, sebelum menggunakan task pool. Aplikasi perlu memastikan bahwa kumpulan tugas tingkat sistem diinisialisasi cukup awal dalam urutan boot, sebelum pustaka apa pun menggunakan kumpulan tugas, dan sebelum kode aplikasi apa pun memposting pekerjaan ke kumpulan tugas. Tak lama setelah boot, sistem menginisialisasi kumpulan tugas tingkat sistem tunggal untuk dibagikan semua pustaka. Setelah inisialisasi, pegangan kumpulan tugas dapat diambil untuk digunakan dengan API. IOT_SYSTEM_TASKPOOL
catatan
Panggilan IotTaskPool_CreateSystemTaskPool
tidak mengalokasikan memori untuk menyimpan struktur dan status data kumpulan tugas, tetapi mungkin mengalokasikan memori untuk menampung entitas dependen dan struktur data, seperti utas kumpulan tugas.
Referensi API
Untuk referensi API selengkapnya, lihat Referensi API SDK Task Pool C.
Contoh penggunaan
Misalkan Anda perlu menjadwalkan kumpulan AWS IoT Device Defender metrik berulang, dan Anda memutuskan untuk menggunakan timer untuk menjadwalkan pengumpulan dengan panggilan ke MQTT connect, subscribe, dan publish. APIs Kode berikut mendefinisikan fungsi callback untuk menerima AWS IoT Device Defender metrik di seluruh MQTT, dengan callback terputus yang terputus dari koneksi 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 ); }