

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Dasar-dasar kernel FreeRTOS
<a name="dev-guide-freertos-kernel"></a>

Kernel FreeRTOS adalah sistem operasi real-time yang mendukung berbagai arsitektur. Dasar-dasarnya ideal untuk membangun aplikasi mikrokontroler tertanam. Ini menyediakan:
+ Penjadwal multitasking.
+ Beberapa opsi alokasi memori (termasuk kemampuan untuk membuat sistem yang sepenuhnya dialokasikan secara statis). 
+ Primitif koordinasi antar tugas, termasuk pemberitahuan tugas, antrian pesan, beberapa jenis semaphore, dan buffer aliran dan pesan.
+ Support untuk multiprocessing simetris (SMP) pada mikrokontroler multi-core.

Kernel FreeRTOS tidak pernah melakukan operasi non-deterministik, seperti berjalan di daftar tertaut, di dalam bagian kritis atau interupsi. Kernel FreeRTOS mencakup implementasi pengatur waktu perangkat lunak yang efisien yang tidak menggunakan waktu CPU apa pun kecuali timer membutuhkan servis. Tugas yang diblokir tidak memerlukan servis berkala yang memakan waktu. Direct-to-tasknotifikasi memungkinkan pensinyalan tugas cepat, dengan praktis tidak ada overhead RAM. Mereka dapat digunakan di sebagian besar skenario antar tugas dan interrupt-to-task pensinyalan.

Kernel FreeRTOS dirancang untuk menjadi kecil, sederhana, dan mudah digunakan. Gambar biner kernel RTOS yang khas berada di kisaran 4000 hingga 9000 byte.

[Untuk up-to-date dokumentasi terbanyak tentang kernel FreeRTOS, lihat Freertos.org.](https://freertos.org/) [*Freertos.org menawarkan sejumlah tutorial dan panduan terperinci tentang penggunaan kernel FreerTOS, termasuk Panduan Memulai Cepat FreeRTOS Kernel FreeRTOS dan Implementasi RTOS yang lebih *[mendalam dalam Dokumentasi FreerTOS](https://freertos.org/Documentation/01-FreeRTOS-quick-start/01-Beginners-guide/02-Quick-start-guide).](https://freertos.org/Documentation/02-Kernel/05-RTOS-implementation-tutorial/01-RTOS-implementation)

# Penjadwal kernel FreeRTOS
<a name="freertos-kernel-scheduler"></a>

Aplikasi tertanam yang menggunakan RTOS dapat disusun sebagai serangkaian tugas independen. Setiap tugas dijalankan dalam konteksnya sendiri, tanpa ketergantungan pada tugas lain. Hanya satu tugas dalam aplikasi yang berjalan kapan saja. Penjadwal RTOS real-time menentukan kapan setiap tugas harus dijalankan. Setiap tugas dilengkapi dengan tumpukannya sendiri. Ketika tugas ditukar sehingga tugas lain dapat dijalankan, konteks eksekusi tugas disimpan ke tumpukan tugas sehingga dapat dipulihkan ketika tugas yang sama kemudian ditukar kembali untuk melanjutkan eksekusinya. 

Untuk memberikan perilaku real-time deterministik, penjadwal tugas FreeRTOS memungkinkan tugas diberi prioritas yang ketat. RTOS memastikan tugas prioritas tertinggi yang dapat dijalankan diberikan waktu pemrosesan. Ini membutuhkan waktu pemrosesan berbagi antara tugas-tugas dengan prioritas yang sama jika mereka siap dijalankan secara bersamaan. FreeRTOS juga membuat tugas idle yang dijalankan hanya ketika tidak ada tugas lain yang siap dijalankan.

# Alokasi memori kernel
<a name="kernel-memory-allocation"></a>

Kernel RTOS membutuhkan RAM setiap kali tugas, antrian, atau objek RTOS lainnya dibuat. RAM dapat dialokasikan:
+ Secara statis pada waktu kompilasi.
+ Secara dinamis dari heap RTOS oleh fungsi pembuatan objek API RTOS.

Ketika objek RTOS dibuat secara dinamis, menggunakan pustaka `malloc()` dan `free()` fungsi C standar tidak selalu sesuai karena sejumlah alasan:
+ Mereka mungkin tidak tersedia pada sistem tertanam.
+ Mereka mengambil ruang kode yang berharga.
+ Mereka biasanya tidak aman untuk benang.
+ Mereka tidak deterministik.

Untuk alasan ini, FreeRTOS menyimpan API alokasi memori di lapisan portabelnya. Lapisan portabel berada di luar file sumber yang mengimplementasikan fungsionalitas inti RTOS, sehingga Anda dapat memberikan implementasi khusus aplikasi yang sesuai untuk sistem real-time yang Anda kembangkan. Ketika kernel RTOS membutuhkan RAM, ia memanggil `pvPortMalloc()` bukan `malloc()` (). Ketika RAM sedang dibebaskan, kernel RTOS memanggil `vPortFree()` bukan. `free()`

# Kelola memori aplikasi
<a name="application-memory-management"></a>

Ketika aplikasi membutuhkan memori, mereka dapat mengalokasikannya dari tumpukan FreeRTOS. FreeRTOS menawarkan beberapa skema manajemen heap yang berkisar dalam kompleksitas dan fitur. Anda juga dapat memberikan implementasi heap Anda sendiri.

Kernel FreeRTOS mencakup lima implementasi heap:

**`heap_1`**  
Adalah implementasi yang paling sederhana. Tidak mengizinkan memori dibebaskan.

**`heap_2`**  
Memungkinkan memori dibebaskan, tetapi tidak menyatukan blok bebas yang berdekatan.

**`heap_3`**  
Membungkus standar `malloc()` dan `free()` untuk keamanan benang.

**`heap_4`**  
Menggabungkan blok bebas yang berdekatan untuk menghindari fragmentasi. Termasuk opsi penempatan alamat absolut.

**`heap_5`**  
Mirip dengan heap\$14. Dapat menjangkau tumpukan di beberapa area memori yang tidak berdekatan.

# Koordinasi antar tugas
<a name="inter-task-coordination"></a>

Bagian ini berisi informasi tentang FreeRTOS primitif.

**Topics**
+ [Antrean](#inter-task-queues)
+ [Semaphores dan mutex](#inter-task-semaphones)
+ [Direct-to-task pemberitahuan](#direct-task-notifications)
+ [Buffer aliran](#rtos-stream-buffer)
+ [Buffer pesan](#rtos-message-buffer)

## Antrean
<a name="inter-task-queues"></a>

Antrian adalah bentuk utama komunikasi antar tugas. Mereka dapat digunakan untuk mengirim pesan antar tugas dan antara interupsi dan tugas. Dalam kebanyakan kasus, mereka digunakan sebagai buffer thread-safe, First In First Out (FIFO) dengan data baru dikirim ke bagian belakang antrian. (Data juga dapat dikirim ke depan antrian.) Pesan dikirim melalui antrian dengan salinan, yang berarti data (yang dapat menjadi penunjuk ke buffer yang lebih besar) itu sendiri disalin ke dalam antrian daripada hanya menyimpan referensi ke data.

Antrian APIs mengizinkan waktu blok yang akan ditentukan. Saat tugas mencoba membaca dari antrian kosong, tugas ditempatkan ke status Diblokir hingga data tersedia di antrian atau waktu pemblokiran berlalu. Tugas dalam status Diblokir tidak menghabiskan waktu CPU apa pun, memungkinkan tugas lain berjalan. Demikian pula, ketika tugas mencoba menulis ke antrian penuh, tugas ditempatkan ke status Diblokir sampai ruang tersedia dalam antrian atau waktu blok berlalu. Jika lebih dari satu blok tugas pada antrian yang sama, tugas dengan prioritas tertinggi akan diblokir terlebih dahulu. 

Primitif FreeRTOS lainnya, direct-to-task seperti notifikasi dan streaming dan buffer pesan, menawarkan alternatif ringan untuk antrian dalam banyak skenario desain umum. 

## Semaphores dan mutex
<a name="inter-task-semaphones"></a>

Kernel FreeRTOS menyediakan semaphores biner, menghitung semaphores, dan mutex untuk tujuan saling eksklusi dan sinkronisasi.

Semaphores biner hanya dapat memiliki dua nilai. Mereka adalah pilihan yang baik untuk menerapkan sinkronisasi (baik antara tugas atau antara tugas dan interupsi). Menghitung semaphores membutuhkan lebih dari dua nilai. Mereka memungkinkan banyak tugas untuk berbagi sumber daya atau melakukan operasi sinkronisasi yang lebih kompleks.

Mutexes adalah semaphores biner yang mencakup mekanisme pewarisan prioritas. Ini berarti bahwa jika tugas prioritas tinggi memblokir saat mencoba mendapatkan mutex yang saat ini dipegang oleh tugas prioritas yang lebih rendah, prioritas tugas yang memegang token untuk sementara dinaikkan ke tugas pemblokiran. Mekanisme ini dirancang untuk memastikan tugas prioritas yang lebih tinggi disimpan dalam keadaan Diblokir untuk waktu sesingkat mungkin, untuk meminimalkan inversi prioritas yang telah terjadi.

## Direct-to-task pemberitahuan
<a name="direct-task-notifications"></a>

Pemberitahuan tugas memungkinkan tugas untuk berinteraksi dengan tugas lain, dan untuk menyinkronkan dengan rutinitas layanan interupsi (ISRs), tanpa perlu objek komunikasi terpisah seperti semaphore. Setiap tugas RTOS memiliki nilai notifikasi 32-bit yang digunakan untuk menyimpan konten notifikasi, jika ada. Pemberitahuan tugas RTOS adalah peristiwa yang dikirim langsung ke tugas yang dapat membuka blokir tugas penerima dan secara opsional memperbarui nilai pemberitahuan tugas penerima.

Pemberitahuan tugas RTOS dapat digunakan sebagai alternatif yang lebih cepat dan ringan untuk biner dan menghitung semaphores dan, dalam beberapa kasus, antrian. Pemberitahuan tugas memiliki keunggulan kecepatan dan jejak RAM dibandingkan fitur FreeRTOS lainnya yang dapat digunakan untuk melakukan fungsionalitas yang setara. Namun, pemberitahuan tugas hanya dapat digunakan ketika hanya ada satu tugas yang dapat menjadi penerima acara.

## Buffer aliran
<a name="rtos-stream-buffer"></a>

Stream buffer memungkinkan aliran byte diteruskan dari rutinitas layanan interupsi ke tugas, atau dari satu tugas ke tugas lainnya. Aliran byte dapat memiliki panjang yang sewenang-wenang dan tidak harus memiliki awal atau akhir. Sejumlah byte dapat ditulis pada satu waktu, dan sejumlah byte dapat dibaca pada satu waktu. Anda mengaktifkan fungsionalitas buffer streaming dengan menyertakan file `stream_buffer.c` sumber dalam proyek Anda.

Stream buffer menganggap hanya ada satu tugas atau interupsi yang menulis ke buffer (penulis), dan hanya satu tugas atau interupsi yang dibaca dari buffer (pembaca). Aman bagi penulis dan pembaca untuk menjadi tugas yang berbeda atau mengganggu rutinitas layanan, tetapi tidak aman untuk memiliki banyak penulis atau pembaca.

Implementasi buffer aliran menggunakan direct-to-task notifikasi. Oleh karena itu, memanggil API buffer aliran yang menempatkan tugas pemanggilan ke status Diblokir dapat mengubah status dan nilai notifikasi tugas pemanggilan.

### Mengirim data
<a name="rtos-stream-buffer-send"></a>

`xStreamBufferSend()`digunakan untuk mengirim data ke buffer aliran dalam tugas. `xStreamBufferSendFromISR()`digunakan untuk mengirim data ke buffer aliran dalam interrupt service routine (ISR).

`xStreamBufferSend()`memungkinkan waktu blok ditentukan. Jika `xStreamBufferSend()` dipanggil dengan waktu blok bukan nol untuk menulis ke buffer aliran dan buffer penuh, tugas ditempatkan ke status Diblokir sampai ruang tersedia atau waktu blok berakhir.

`sbSEND_COMPLETED()`dan `sbSEND_COMPLETED_FROM_ISR()` merupakan makro yang dipanggil (secara internal, oleh FreeRTOS API) saat data ditulis ke buffer aliran. Dibutuhkan pegangan buffer aliran yang diperbarui. Kedua makro ini memeriksa untuk melihat apakah ada tugas yang diblokir pada buffer aliran menunggu data, dan jika demikian, menghapus tugas dari status Diblokir.

Anda dapat mengubah perilaku default ini dengan menyediakan implementasi `sbSEND_COMPLETED()` in Anda sendiri[`FreeRTOSConfig.h`](freertos-config.md). Ini berguna ketika buffer aliran digunakan untuk meneruskan data antar inti pada prosesor multicore. Dalam skenario itu, `sbSEND_COMPLETED()` dapat diimplementasikan untuk menghasilkan interupsi di inti CPU lainnya, dan rutin layanan interupsi kemudian dapat menggunakan `xStreamBufferSendCompletedFromISR()` API untuk memeriksa, dan jika perlu membuka blokir, tugas yang menunggu data.

### Menerima data
<a name="rtos-stream-buffer-receive"></a>

`xStreamBufferReceive()`digunakan untuk membaca data dari buffer aliran dalam tugas. `xStreamBufferReceiveFromISR()`digunakan untuk membaca data dari buffer aliran dalam rutinitas layanan interupsi (ISR).

`xStreamBufferReceive()`memungkinkan waktu blok ditentukan. Jika `xStreamBufferReceive()` dipanggil dengan waktu blok bukan nol untuk membaca dari buffer aliran dan buffer kosong, tugas ditempatkan ke status Diblokir sampai jumlah data tertentu tersedia di buffer aliran, atau waktu blok berakhir.

Jumlah data yang harus ada di buffer aliran sebelum tugas diblokir disebut tingkat pemicu buffer aliran. Tugas yang diblokir dengan tingkat pemicu 10 tidak diblokir ketika setidaknya 10 byte ditulis ke buffer atau waktu pemblokiran tugas berakhir. Jika waktu blok tugas membaca berakhir sebelum tingkat pemicu tercapai, tugas akan menerima data apa pun yang ditulis ke buffer. Tingkat pemicu tugas harus diatur ke nilai antara 1 dan ukuran buffer aliran. Tingkat pemicu buffer aliran diatur saat `xStreamBufferCreate()` dipanggil. Itu bisa diubah dengan menelepon`xStreamBufferSetTriggerLevel()`.

`sbRECEIVE_COMPLETED()`dan `sbRECEIVE_COMPLETED_FROM_ISR()` merupakan makro yang dipanggil (secara internal, oleh FreeRTOS API) saat data dibaca dari buffer aliran. Makro memeriksa untuk melihat apakah ada tugas yang diblokir pada buffer aliran menunggu ruang tersedia di dalam buffer, dan jika demikian, mereka menghapus tugas dari status Diblokir. Anda dapat mengubah perilaku default `sbRECEIVE_COMPLETED()` dengan menyediakan implementasi alternatif di[`FreeRTOSConfig.h`](freertos-config.md).

## Buffer pesan
<a name="rtos-message-buffer"></a>

Buffer pesan memungkinkan pesan diskrit panjang variabel diteruskan dari rutinitas layanan interupsi ke tugas, atau dari satu tugas ke tugas lainnya. Misalnya, pesan dengan panjang 10, 20, dan 123 byte semuanya dapat ditulis ke, dan dibaca dari, buffer pesan yang sama. Pesan 10-byte hanya dapat dibaca sebagai pesan 10-byte, bukan sebagai byte individual. Buffer pesan dibangun di atas implementasi buffer aliran. Anda dapat mengaktifkan fungsionalitas buffer pesan dengan menyertakan file `stream_buffer.c` sumber dalam proyek Anda.

Buffer pesan menganggap hanya ada satu tugas atau interupsi yang menulis ke buffer (penulis), dan hanya satu tugas atau interupsi yang dibaca dari buffer (pembaca). Aman bagi penulis dan pembaca untuk menjadi tugas yang berbeda atau mengganggu rutinitas layanan, tetapi tidak aman untuk memiliki banyak penulis atau pembaca.

Implementasi buffer pesan menggunakan direct-to-task notifikasi. Oleh karena itu, memanggil API buffer aliran yang menempatkan tugas pemanggilan ke status Diblokir dapat mengubah status dan nilai notifikasi tugas pemanggilan. 

Untuk mengaktifkan buffer pesan untuk menangani pesan berukuran variabel, panjang setiap pesan ditulis ke dalam buffer pesan sebelum pesan itu sendiri. Panjang disimpan dalam variabel tipe`size_t`, yang biasanya 4 byte pada arsitektur 32-byte. Oleh karena itu, menulis pesan 10-byte ke buffer pesan sebenarnya menghabiskan 14 byte ruang buffer. Demikian juga, menulis pesan 100-byte ke buffer pesan sebenarnya menggunakan 104 byte ruang buffer.

### Mengirim data
<a name="rtos-message-buffer-send"></a>

`xMessageBufferSend()`digunakan untuk mengirim data ke buffer pesan dari tugas. `xMessageBufferSendFromISR()`digunakan untuk mengirim data ke buffer pesan dari interrupt service routine (ISR).

`xMessageBufferSend()`memungkinkan waktu blok ditentukan. Jika `xMessageBufferSend()` dipanggil dengan waktu blok bukan nol untuk menulis ke buffer pesan dan buffer penuh, tugas ditempatkan ke status Diblokir sampai salah satu ruang tersedia di buffer pesan, atau waktu blok berakhir.

`sbSEND_COMPLETED()`dan `sbSEND_COMPLETED_FROM_ISR()` merupakan makro yang dipanggil (secara internal, oleh FreeRTOS API) saat data ditulis ke buffer aliran. Dibutuhkan satu parameter, yang merupakan pegangan buffer aliran yang diperbarui. Kedua makro ini memeriksa untuk melihat apakah ada tugas yang diblokir pada buffer aliran menunggu data, dan jika demikian, mereka menghapus tugas dari status Diblokir.

Anda dapat mengubah perilaku default ini dengan menyediakan implementasi `sbSEND_COMPLETED()` in Anda sendiri[`FreeRTOSConfig.h`](freertos-config.md). Ini berguna ketika buffer aliran digunakan untuk meneruskan data antar inti pada prosesor multicore. Dalam skenario itu, `sbSEND_COMPLETED()` dapat diimplementasikan untuk menghasilkan interupsi di inti CPU lainnya, dan rutin layanan interupsi kemudian dapat menggunakan `xStreamBufferSendCompletedFromISR()` API untuk memeriksa, dan jika perlu membuka blokir, tugas yang sedang menunggu data.

### Menerima data
<a name="rtos-message-buffer-receive"></a>

`xMessageBufferReceive()`digunakan untuk membaca data dari buffer pesan dalam tugas. `xMessageBufferReceiveFromISR()`digunakan untuk membaca data dari buffer pesan dalam interrupt service routine (ISR). `xMessageBufferReceive()`memungkinkan waktu blok ditentukan. Jika `xMessageBufferReceive()` dipanggil dengan waktu blok bukan nol untuk membaca dari buffer pesan dan buffer kosong, tugas ditempatkan ke status Diblokir sampai data tersedia, atau waktu pemblokiran berakhir.

`sbRECEIVE_COMPLETED()`dan `sbRECEIVE_COMPLETED_FROM_ISR()` merupakan makro yang dipanggil (secara internal, oleh FreeRTOS API) saat data dibaca dari buffer aliran. Makro memeriksa untuk melihat apakah ada tugas yang diblokir pada buffer aliran menunggu ruang tersedia di dalam buffer, dan jika demikian, mereka menghapus tugas dari status Diblokir. Anda dapat mengubah perilaku default `sbRECEIVE_COMPLETED()` dengan menyediakan implementasi alternatif di[`FreeRTOSConfig.h`](freertos-config.md).

# Dukungan multiprocessing simetris (SMP)
<a name="smp-support"></a>

[Dukungan SMP di Freertos Kernel memungkinkan satu contoh kernel FreerTOS](https://freertos.org/symmetric-multiprocessing-introduction.html) untuk menjadwalkan tugas di beberapa inti prosesor yang identik. Arsitektur inti harus identik dan berbagi memori yang sama.

[FreeRTOS API secara substansional tetap sama antara versi single-core dan SMP, kecuali untuk tambahan ini. APIs](https://freertos.org/symmetric-multiprocessing-introduction.html#smp-specific-apis) Oleh karena itu, aplikasi yang ditulis untuk versi single-core FreeRTOS harus dikompilasi dengan versi SMP dengan sedikit atau tanpa usaha. Namun, mungkin ada beberapa masalah fungsional, karena beberapa asumsi yang benar untuk aplikasi single-core mungkin tidak lagi berlaku untuk aplikasi multi-core.

Salah satu asumsi umum adalah bahwa tugas prioritas yang lebih rendah tidak dapat berjalan saat tugas prioritas yang lebih tinggi sedang berjalan. Meskipun ini benar pada sistem single-core, itu tidak lagi berlaku untuk sistem multi-core karena banyak tugas dapat berjalan secara bersamaan. Jika aplikasi bergantung pada prioritas tugas relatif untuk memberikan pengecualian bersama, aplikasi mungkin mengamati hasil yang tidak terduga di lingkungan multi-inti.

Satu asumsi umum lainnya adalah bahwa tidak ISRs dapat berjalan secara bersamaan satu sama lain atau dengan tugas lain. Ini tidak lagi berlaku di lingkungan multi-core. Penulis aplikasi perlu memastikan pengecualian timbal balik yang tepat saat mengakses data yang dibagikan antara tugas dan. ISRs

# Pengatur waktu perangkat lunak
<a name="software-timers"></a>

Timer perangkat lunak memungkinkan fungsi untuk dieksekusi pada waktu yang ditentukan di masa depan. Fungsi yang dijalankan oleh timer disebut *fungsi callback* timer. Waktu antara timer yang dimulai dan fungsi callback yang sedang dijalankan disebut *periode* timer. Kernel FreeRTOS menyediakan implementasi timer perangkat lunak yang efisien karena:
+ Itu tidak menjalankan fungsi callback timer dari konteks interupsi.
+ Itu tidak menghabiskan waktu pemrosesan apa pun kecuali timer telah benar-benar kedaluwarsa.
+ Itu tidak menambahkan overhead pemrosesan apa pun ke interupsi centang.
+ Itu tidak berjalan struktur daftar tautan apa pun sementara interupsi dinonaktifkan.

# Dukungan daya rendah
<a name="low-power-support"></a>

Seperti kebanyakan sistem operasi tertanam, kernel FreeRTOS menggunakan timer perangkat keras untuk menghasilkan interupsi tick periodik, yang digunakan untuk mengukur waktu. Penghematan daya implementasi timer perangkat keras reguler dibatasi oleh kebutuhan untuk keluar secara berkala dan kemudian memasukkan kembali status daya rendah untuk memproses interupsi centang. Jika frekuensi interupsi kutu terlalu tinggi, energi dan waktu yang dikonsumsi masuk dan keluar dari status daya rendah untuk setiap tick melebihi potensi keuntungan hemat daya untuk semua kecuali mode hemat daya paling ringan. 

Untuk mengatasi batasan ini, FreeRTOS menyertakan mode timer tickless untuk aplikasi berdaya rendah. Mode idle tickless FreeRTOS menghentikan interupsi centang periodik selama periode idle (periode ketika tidak ada tugas aplikasi yang dapat dijalankan), dan kemudian membuat penyesuaian koreksi ke nilai hitungan centang RTOS saat interupsi centang dimulai ulang. Menghentikan interupsi centang memungkinkan mikrokontroler tetap dalam keadaan hemat daya yang dalam sampai interupsi terjadi, atau sekarang saatnya kernel RTOS untuk mentransisikan tugas ke status siap.

# Konfigurasikan kernel (Gratis RTOSConfig .h)
<a name="freertos-config"></a>

Anda dapat mengonfigurasi kernel FreeRTOS untuk papan dan aplikasi tertentu dengan `FreeRTOSConfig.h` file header. Setiap aplikasi yang dibangun di atas kernel harus memiliki file `FreeRTOSConfig.h` header di preprocessor include path. `FreeRTOSConfig.h`khusus aplikasi dan harus ditempatkan di bawah direktori aplikasi, dan bukan di salah satu direktori kode sumber kernel FreeRTOS.

`FreeRTOSConfig.h`File untuk aplikasi demo dan pengujian FreeRTOS terletak di dan. `freertos/vendors/vendor/boards/board/aws_demos/config_files/FreeRTOSConfig.h` `freertos/vendors/vendor/boards/board/aws_tests/config_files/FreeRTOSConfig.h`

Untuk daftar parameter konfigurasi yang tersedia untuk ditentukan`FreeRTOSConfig.h`, lihat [Freertos.org](https://www.freertos.org/a00110.html).