Memori Partisi di Nucleus SE: Konfigurasi, API, dan Praktik Terbaik
Lihat seri RTOS Revealed
Partisi memori diperkenalkan dalam artikel kami sebelumnya, di mana kami membandingkannya dengan fungsi C konvensional malloc(). Partisi adalah blok memori berukuran tetap yang berasal dari kolam partisi, menawarkan alokasi dan dealokasi deterministik yang dapat diandalkan tugas.
Menggunakan Partisi
Di Nucleus SE, kolam partisi didefinisikan pada waktu kompilasi. Maksimal 16 kolam dapat dikonfigurasi per aplikasi. Jika tidak ada kolam yang didefinisikan, semua struktur data dan kode API terkait dihilangkan dari build, menjaga footprint minimal.
Kolam adalah area memori kontigu yang dibagi menjadi sejumlah partisi identik. Aplikasi mengontrol ukuran dan jumlah setiap kolam. Tugas meminta partisi dan menerima pointer ke bloknya. Tanggung jawab pemanggil adalah untuk tetap dalam batas yang dialokasikan. Partisi dapat dikembalikan ke kolam oleh setiap tugas melalui API dealokasi. Jika kolam habis, panggilan dapat mengembalikan kesalahan atau menangguhkan tugas, tergantung pada parameter API dan opsi build.
Mengonfigurasi Partisi Memori
Jumlah Kolam Partisi
Kolam partisi diaktifkan melalui pernyataan #define dalam nuse_config.h. Simbol kunci adalah NUSE_PARTITION_POOL_NUMBER, yang menetapkan jumlah kolam. Default-nya 0, yang berarti tidak ada kolam aktif. Nilai yang valid berkisar dari 1 hingga 16; nilai tidak valid memicu #error waktu kompilasi yang dihasilkan oleh nuse_config_check.h.
Mengatur nilai non-nol mengaktifkan struktur data yang diperlukan dan menginisialisasikannya di ROM. Ini juga membuka kunci simbol enable API yang dijelaskan di bawah ini.
API Enables
Setiap panggilan layanan memiliki makro enable dalam nuse_config.h. Untuk partisi, simbol berikut ada:
NUSE_PARTITION_ALLOCATE NUSE_PARTITION_DEALLOCATE NUSE_PARTITION_POOL_INFORMATION NUSE_PARTITION_POOL_COUNT
Secara default semuanya diatur ke FALSE, menghilangkan implementasi dari build. Untuk menggunakan fitur, setel makro yang sesuai ke TRUE. Mengaktifkan API sementara tidak ada kolam yang didefinisikan (kecuali NUSE_Partition_Pool_Count()) menghasilkan kesalahan waktu kompilasi. Menggunakan API yang tidak diaktifkan menyebabkan kesalahan waktu link.

Panggilan Layanan Kolam Partisi
Nucleus RTOS menawarkan tujuh panggilan layanan untuk kolam partisi. Di Nucleus SE, hanya API alokasi dan dealokasi inti yang diimplementasikan. Tabel di bawah ini mencantumkan setiap panggilan, status implementasinya, dan deskripsi singkat:
| API | Implementasi | Deskripsi |
NU_Allocate_Partition() | Diimplementasikan | Alokasikan partisi. |
NU_Deallocate_Partition() | Diimplementasikan | Bebaskan partisi. |
NU_Partition_Pool_Information() | Diimplementasikan | Ambil metadata kolam. |
NU_Established_Partition_Pools() | Diimplementasikan | Hitung kolam aktif. |
NU_Create_Partition_Pool() | Tidak diimplementasikan | Pembuatan kolam dinamis. |
NU_Delete_Partition_Pool() | Tidak diimplementasikan | Penghapusan kolam dinamis. |
NU_Partition_Pool_Pointers() | Tidak diimplementasikan | Kembalikan pointer kolam. |
Perhatikan bahwa baik Nucleus RTOS maupun SE tidak menyediakan rutina reset untuk kolam partisi. Pilihan desain ini mencerminkan kasus penggunaan umum di mana sebuah tugas mengalokasikan partisi dan menyerahkan pointer-nya ke tugas lain yang akan akhirnya melepasnya. Mereset kolam akan secara diam-diam menandai semua partisi sebagai bebas, melanggar kontrak tingkat tugas.
Layanan Alokasi dan Dealokasi
Operasi inti adalah:
- Alokasikan: tandai partisi sebagai digunakan dan kembalikan alamatnya.
- Dealokasikan: tandai partisi sebagai bebas.
API Alokasi Nucleus RTOS
Prototipe:
STATUS NU_Allocate_Partition(NU_PARTITION_POOL *pool, VOID **return_pointer, UNSIGNED suspend);
Nilai pengembalian termasuk NU_SUCCESS, NU_NO_PARTITION, NU_INVALID_POOL, NU_INVALID_POINTER, NU_INVALID_SUSPEND, NU_TIMEOUT, dan NU_POOL_DELETED.
API Alokasi Nucleus SE
Prototipe:
STATUS NUSE_Partition_Allocate(NUSE_PARTITION_POOL pool, ADDR *return_pointer, U8 suspend);
Parameter:
pool – indeks kolam yang akan digunakan. return_pointer – alamat blok yang dialokasikan. suspend – NUSE_NO_SUSPEND atau NUSE_SUSPEND.
Kode pengembalian mencerminkan yang RTOS tetapi diawali dengan NUSE_. Permintaan penangguhan yang tidak valid dari thread non-tugas atau ketika API pemblokiran dinonaktifkan menghasilkan NUSE_INVALID_SUSPEND.
Untuk walkthrough implementasi lengkap, lihat artikel berikutnya dalam seri RTOS Revealed.