Partisi memori diperkenalkan di artikel sebelumnya, di mana perbandingan dengan standar C malloc() fungsi dibuat. Partisi adalah area memori yang diperoleh dari kumpulan partisi. Ini menawarkan cara yang fleksibel untuk tugas-tugas untuk mendapatkan dan melepaskan penyimpanan data dengan cara yang deterministik dan andal.
Menggunakan Partisi
Di Nucleus SE, kumpulan partisi dikonfigurasi pada waktu pembuatan. Mungkin ada maksimum 16 kumpulan partisi yang dikonfigurasi untuk suatu aplikasi. Jika tidak ada kumpulan partisi yang dikonfigurasi, tidak ada struktur data atau kode panggilan layanan yang terkait dengan kumpulan partisi yang disertakan dalam aplikasi.
Kumpulan partisi hanyalah area memori, yang dibagi menjadi sejumlah partisi berukuran tetap. Pengguna memiliki kontrol penuh atas ukuran dan jumlah partisi di setiap kumpulan. Tugas dapat meminta untuk dialokasikan partisi memori dan menerima penunjuk ke area penyimpanan. Merupakan tanggung jawab tugas untuk tidak menulis data di luar partisi. Partisi dapat dibatalkan alokasinya oleh tugas apa pun dengan meneruskan pointer ke fungsi API. Meminta alokasi partisi, ketika tidak ada lagi yang tersedia, dapat mengakibatkan kesalahan atau penangguhan tugas, tergantung pada opsi yang dipilih dalam panggilan API dan konfigurasi Nucleus SE.
Mengonfigurasi Partisi Memori
Jumlah Kumpulan Partisi
Seperti kebanyakan aspek Nucleus SE, konfigurasi kumpulan partisi terutama dikendalikan oleh #define pernyataan di nuse_config.h . Setelan kuncinya adalah NUSE_PARTITION_POOL_NUMBER , yang menentukan berapa banyak kumpulan partisi yang dikonfigurasi untuk aplikasi. Pengaturan default adalah 0 (yaitu tidak ada kumpulan partisi yang digunakan) dan Anda dapat mengaturnya ke nilai apa pun hingga 16. Nilai yang salah akan menghasilkan kesalahan waktu kompilasi, yang dihasilkan oleh pengujian di nuse_config_check.h (ini termasuk dalam nuse_config.c dan karenanya dikompilasi dengan modul ini) menghasilkan #error pernyataan sedang dikompilasi.
Memilih nilai bukan nol adalah "master enable" untuk kumpulan partisi. Ini menghasilkan beberapa struktur data yang ditentukan dan ukurannya sesuai. Struktur data dalam ROM memerlukan inisialisasi ke nilai yang sesuai yang menjadi ciri setiap kumpulan partisi. Lebih lanjut tentang struktur data di artikel berikutnya. Ini juga mengaktifkan pengaturan pengaktifan API.
API Diaktifkan
Setiap fungsi API (panggilan layanan) di Nucleus SE memiliki #define enabling yang memungkinkan simbol di nuse_config.h . Untuk kumpulan partisi, ini adalah:
NUSE_PARTITION_ALLOCATE
NUSE_PARTITION_DEALLOCATE
NUSE_PARTITION_POOL_INFORMATION
NUSE_PARTITION_POOL_COUNT
Secara default, semua ini disetel ke FALSE , sehingga menonaktifkan setiap panggilan layanan dan menghambat penyertaan kode implementasi apa pun. Untuk mengonfigurasi kumpulan partisi untuk aplikasi, Anda harus memilih panggilan API yang ingin Anda gunakan dan menyetel simbol pengaktifannya ke TRUE .
Berikut ini adalah ekstrak dari nuse_config.h default berkas:
Kesalahan waktu kompilasi akan terjadi jika fungsi API kumpulan partisi diaktifkan dan tidak ada kumpulan partisi yang dikonfigurasi (kecuali untuk NUSE_Partition_Pool_Count() yang selalu diizinkan). Jika kode Anda menggunakan panggilan API, yang belum diaktifkan, kesalahan waktu tautan akan terjadi, karena tidak ada kode implementasi yang disertakan dalam aplikasi.
Panggilan Layanan Kumpulan Partisi
Nucleus RTOS mendukung tujuh panggilan layanan, yang berkaitan dengan kumpulan partisi yang menyediakan fungsionalitas berikut:
Alokasikan partisi:NU_Allocate_Partition() . Diimplementasikan oleh NUSE_Partition_Allocate() di Nucleus SE.
Batalkan alokasi partisi:NU_Deallocate_Partition() . Diimplementasikan oleh NUSE_Partition_Deallocate() di Nucleus SE.
Berikan informasi tentang kumpulan partisi yang ditentukan:NU_Partition_Pool_Information() . Diimplementasikan oleh NUSE_Partition_Pool_Information() di Nucleus SE.
Mengembalikan hitungan berapa banyak kumpulan partisi yang (saat ini) dikonfigurasi untuk aplikasi:NU_Established_Partition_Pools() . Diimplementasikan oleh NUSE_Partition_Pool_Count() di Nucleus SE.
Tambahkan kumpulan partisi baru ke aplikasi (buat):NU_Create_Partition_Pool() . Tidak diimplementasikan di Nucleus SE.
Hapus kumpulan partisi dari aplikasi (hapus):NU_Delete_Partition_Pool() . Tidak diimplementasikan di Nucleus SE.
Kembalikan pointer ke semua kumpulan partisi (saat ini) dalam aplikasi:NU_Partition_Pool_Pointers() . Tidak diimplementasikan di Nucleus SE.
Implementasi dari setiap panggilan layanan ini diperiksa secara mendetail.
Perlu dicatat bahwa tidak ada fungsi reset yang disediakan (baik dalam Nucleus RTOS atau Nucleus SE). Ini disengaja. Ini adalah praktik yang sangat umum untuk satu tugas untuk mengalokasikan partisi dan meneruskan pointer ke tugas lain (yang mungkin akan membatalkan alokasi nanti). Jika kumpulan partisi diatur ulang, semua partisi akan ditandai sebagai tidak digunakan, tetapi tidak ada cara untuk melacak dan memberi tahu semua tugas yang mungkin menggunakan partisi tersebut.
Layanan Alokasi Partisi dan Deallokasi
Operasi mendasar, yang dapat dilakukan pada kumpulan partisi, adalah mengalokasikan partisi (yaitu menandai partisi sebagai digunakan dan mengembalikan alamatnya) darinya dan membatalkan alokasi partisi (yaitu menandai partisi sebagai tidak digunakan). Nucleus RTOS dan Nucleus SE masing-masing menyediakan dua panggilan API dasar untuk operasi ini, yang akan dibahas di sini.
Mengalokasikan Partisi
Panggilan API Nucleus RTOS untuk mengalokasikan partisi sangat fleksibel, memungkinkan Anda untuk menangguhkan tanpa batas waktu, atau dengan batas waktu, jika operasi tidak dapat diselesaikan segera; yaitu Anda mencoba mengalokasikan partisi dari kumpulan di mana semua partisi saat ini dialokasikan. Nucleus SE menyediakan layanan yang sama, kecuali penangguhan tugas bersifat opsional dan batas waktu tidak diterapkan.
Panggilan Nucleus RTOS API untuk Alokasi Partisi
Prototipe panggilan layanan:
STATUS NU_Allocate_Partition(NU_PARTITION_POOL *pool, VOID **return_pointer, UNSIGNED suspend);
Pengembalian:
NU_SUCCESS – panggilan berhasil diselesaikan
NU_NO_PARTITION – tidak ada partisi yang tersedia
NU_INVALID_POOL – penunjuk kumpulan partisi tidak valid
NU_INVALID_POINTER – penunjuk pengembalian data adalah NULL
NU_INVALID_SUSPEND – penangguhan dicoba dari utas non-tugas
NU_TIMEOUT – tidak ada partisi yang tersedia bahkan setelah ditangguhkan selama periode waktu habis yang ditentukan
NU_POOL_DELETED – kumpulan partisi telah dihapus saat tugas ditangguhkan
Panggilan API Nucleus SE untuk Mengalokasikan
Panggilan API ini mendukung fungsionalitas utama dari Nucleus RTOS API.
Prototipe panggilan layanan:
STATUS NUSE_Partition_Allocate(NUSE_PARTITION_POOL pool, ADDR *return_pointer, U8 suspend);
Parameter:
kumpulan – indeks (ID) dari kumpulan partisi yang akan digunakan
return_pointer – penunjuk ke variabel bertipe ADDR yang akan menerima alamat dari partisi yang dialokasikan
tangguhkan – spesifikasi untuk penangguhan tugas; mungkin NUSE_NO_SUSPEND atau NUSE_SUSPEND
Pengembalian:
NUSE_SUCCESS – panggilan berhasil diselesaikan
NUSE_NO_PARTITION – tidak ada partisi yang tersedia
NUSE_INVALID_POOL – indeks kumpulan partisi tidak valid
NUSE_INVALID_POINTER – penunjuk pengembalian data adalah NULL
NUSE_INVALID_SUSPEND – penangguhan dicoba dari utas non-tugas atau saat memblokir panggilan API tidak diaktifkan