
Dalam artikel ini, kami terus meninjau bagian memori RTOS.
Nucleus RTOS memiliki tiga panggilan API yang menyediakan fungsi utilitas yang terkait dengan kumpulan partisi memori: mengembalikan informasi tentang kumpulan partisi, mengembalikan jumlah kumpulan partisi dalam suatu aplikasi, dan mengembalikan pointer ke semua kumpulan partisi dalam suatu aplikasi. Dua tantangan pertama diimplementasikan dalam Nucleus SE.
Artikel sebelumnya dalam seri:
Artikel # 14. Bagian memori: pengantar dan layanan dasarArtikel # 13. Struktur data tugas dan panggilan API yang tidak didukungArtikel # 12. Layanan untuk bekerja dengan tugasArtikel # 11. Tugas: konfigurasi dan pengantar APIArtikel # 10. Penjadwal: fitur canggih dan pelestarian konteksArtikel # 9. Penjadwal: implementasiArtikel # 8. Nucleus SE: Desain dan Penyebaran InternalArtikel # 7. Nucleus SE: PendahuluanArtikel # 6. Layanan RTOS lainnyaArtikel # 5. Interaksi tugas dan sinkronisasiArtikel # 4. Tugas, pengalihan konteks, dan interupsiArtikel # 3. Tugas dan PerencanaanArtikel # 2. RTOS: Struktur dan mode waktu-nyata
Artikel # 1. RTOS: pengantar.
Mengambil Informasi Partition Pool
Panggilan layanan ini menyediakan informasi parsial tentang kumpulan partisi. Implementasi Nucleus SE berbeda dari Nucleus RTOS karena ia mengembalikan lebih sedikit informasi karena penamaan objek dan permintaan jeda tidak didukung, dan tugas tidak dapat dijeda.
Memanggil Partition Pool Information dalam Nucleus RTOS
Prototipe panggilan:
STATUS NU_Partition_Pool_Information (NU_PARTITION_POOL * pool, CHAR * nama, VOID ** start_address, TANDA TANDA * pool_size, TANDA TANDA * partisi_size, TANDA TANDA * tersedia, TANDA TANGAN * dialokasikan, OPSI * suspend_type, tugas pertama yang ditandai ** menunggu tugas pertama; menunggu tanpa tugas ** menunggu tugas pertama;Parameter:
pool - pointer ke pool partisi tentang informasi mana yang diminta;
name - pointer ke area tujuan 8 karakter untuk nama pool partisi; termasuk tempat untuk mengakhiri nol;
start_address - pointer ke variabel yang menerima pointer ke awal area data pool partisi;
pool_size - pointer ke variabel yang menerima ukuran pool partisi (dalam byte);
partition_size - penunjuk ke variabel yang mendapatkan ukuran partisi dalam kumpulan yang diberikan;
available - pointer ke variabel yang menerima jumlah partisi yang saat ini tersedia di kumpulan ini;
dialokasikan - pointer ke variabel yang menerima jumlah partisi yang saat ini digunakan dalam kumpulan yang diberikan;
suspend_type - pointer ke variabel untuk mendapatkan jenis penangguhan tugas; jenis suspensi yang valid:
NU_FIFO dan
NU_PRIORITY ;
task_waiting - pointer ke variabel yang menerima jumlah tugas yang ditangguhkan dalam kumpulan partisi yang diberikan;
first_task - penunjuk ke penunjuk tugas di mana penunjuk dari tugas yang ditangguhkan pertama berada.
Nilai pengembalian:
NU_SUCCESS - panggilan berhasil diselesaikan;
NU_INVALID_POOL - penunjuk yang tidak valid ke kumpulan partisi.
Memanggil Partition Pool Information dalam Nucleus SE
Prototipe panggilan:
STATUS NUSE_Partition_Pool_Information (kumpulan NUSE_PARTITION_POOL, ADDR * start_address, U32 * pool_size, U16 * partisi_size, U8 * tersedia, U8 * dialokasikan, U8 * tugas_ menunggu, NUSE_TASK * first_task)Parameter:
pool - indeks pool partisi tentang informasi mana yang diminta;
start_address - pointer ke variabel yang menerima pointer ke awal area data pool partisi;
pool_size - pointer ke variabel yang menerima ukuran pool partisi (dalam byte);
partition_size - penunjuk ke variabel yang mendapatkan ukuran partisi dalam kumpulan yang diberikan;
available - pointer ke variabel yang menerima jumlah partisi yang saat ini tersedia di kumpulan ini;
dialokasikan - pointer ke variabel yang menerima jumlah partisi yang saat ini digunakan dalam kumpulan yang diberikan;
task_waiting - pointer ke variabel yang menerima jumlah tugas yang ditangguhkan di kumpulan partisi ini (jika penangguhan tugas dinonaktifkan, 0 dikembalikan);
first_task - pointer ke variabel tipe
NUSE_TASK , yang menerima indeks tugas yang ditangguhkan pertama (jika penangguhan tugas dinonaktifkan, 0 dikembalikan).
Nilai pengembalian:
NUSE_SUCCESS - panggilan berhasil diselesaikan;
NUSE_INVALID_POOL - indeks kumpulan partisi tidak valid;
NUSE_INVALID_POINTER - satu atau lebih dari pointer yang dikirimkan tidak valid.
Menerapkan Pengambilan Informasi dan Pengumpulan Partisi di Nucleus SE
Menerapkan panggilan API semacam itu mudah dilakukan:

Fungsi mengembalikan status kumpulan partisi. Kemudian, jika pemblokiran panggilan API diaktifkan, jumlah tugas yang tertunda dan indeks yang pertama akan dikembalikan (jika tidak, parameter ini diatur ke 0).
Mendapatkan jumlah kumpulan partisi
Panggilan ini mengembalikan informasi tentang jumlah kumpulan partisi yang dikonfigurasi dalam aplikasi. Sementara dalam Nucleus RTOS angka ini berubah dari waktu ke waktu dan nilai kembali akan mewakili jumlah kolam saat ini, dalam Nucleus SE nilai kembali ditetapkan selama perakitan dan tetap tidak berubah.
Tantangan mendapatkan jumlah kumpulan partisi di Nucleus RTOS
Panggilan tersebut mendukung fungsionalitas inti dari Nucleus RTOS API.
Prototipe panggilan:
NU_Established_Partition_Pools (VOID) UNSIGNED;Parameter:
Tidak ada.
Nilai pengembalian:
Jumlah kumpulan partisi yang dibuat dalam aplikasi.
Tantangan mendapatkan jumlah kumpulan partisi di Nucleus SE
Panggilan utilitas ini mendukung fungsionalitas inti API Nucleus RTOS.
Prototipe panggilan:
U8 NUSE_Partition_Pool_Count (batal);Parameter:
Tidak ada
Nilai pengembalian:
Jumlah kumpulan partisi yang dibuat dalam aplikasi.
Implementasi
Implementasi panggilan API ini sangat sederhana: nilai
#define dari simbol
NUSE_PARTITION_POOL_NUMBER dikembalikan .
Struktur data
Seperti semua objek Nucleus SE lainnya, kumpulan partisi menggunakan susunan struktur dalam ROM dan RAM, jumlah yang tergantung pada jumlah kumpulan yang ditentukan dalam pengaturan.
Saya sangat merekomendasikan kode aplikasi mengakses struktur data seperti itu melalui fungsi API, dan tidak secara langsung. Ini menghindari ketidakcocokan dengan versi Nucleus SE di masa depan dan efek samping yang tidak diinginkan, dan juga menyederhanakan porting aplikasi ke Nucleus RTOS. Berikut ini adalah uraian terperinci tentang struktur data untuk memfasilitasi pemahaman kode panggilan layanan dan debugging.
Struktur data kernel ditempatkan dalam RAM
Struktur data ini meliputi:
NUSE_Partition_Pool_Partition_Used [] - larik tipe
U8 , memiliki satu entri untuk setiap kumpulan partisi yang dikonfigurasi, berisi penghitung kumpulan kumpulan yang saat ini digunakan;
NUSE_Partition_Pool_Blocking_Count [] - larik tipe
U8 yang berisi penghitung tugas yang diblokir di setiap kumpulan partisi. Array ini ada jika memblokir panggilan API dimungkinkan.
Struktur data tersebut diinisialisasi ke nol menggunakan
NUSE_Init_ Partition_Pool () saat memulai Nucleus SE. Ini logis karena membuat setiap partisi di setiap kumpulan tidak digunakan (gratis). Artikel berikut akan memberikan deskripsi lengkap tentang prosedur memulai di Nucleus SE.
Berikut ini adalah deskripsi struktur data dalam file
nuse_init.c .

Data pengguna RAM
Pengguna perlu mengalokasikan area dalam RAM untuk menyimpan data untuk setiap kumpulan partisi. Jumlah ruang dalam RAM harus sesuai dengan volume partisi yang dikonfigurasi (lihat "Data dalam ROM" di bawah) dengan byte tambahan untuk setiap partisi di kumpulan. Setiap bagian dari area data didahului oleh satu byte status.
Data ROM
Ini termasuk:
NUSE_Partition_Pool_Data_Address [] - larik jenis
ADDR , dengan satu entri untuk setiap kumpulan partisi yang dikonfigurasi, berisi alamat awal dari area penyimpanan data;
NUSE_Partition_Pool_Partition_Number [] - larik tipe
U8 dengan satu entri untuk setiap kumpulan partisi yang dikonfigurasi, berisi informasi tentang jumlah partisi di kumpulan;
NUSE_Partition_Pool_Partition_Size [] - larik tipe
U16 dengan satu entri untuk setiap kumpulan partisi yang dikonfigurasi, berisi ukuran partisi untuk kumpulan.
Struktur data tersebut dideklarasikan dan diinisialisasi (secara statis) di
nuse_config.c :

Jejak data untuk kumpulan partisi
Seperti semua objek inti dalam Nucleus SE, jumlah memori yang diperlukan untuk kumpulan partisi dapat diprediksi.
Ukuran ROM (dalam byte) untuk semua kumpulan partisi aplikasi dapat dihitung sebagai berikut:
NUSE_PARTITION_POOL_NUMBER * (sizeof (ADDR) + 2)Jumlah data kernel dalam RAM untuk semua kumpulan partisi aplikasi ketika pemblokiran panggilan API diaktifkan hanya membutuhkan 2 byte per kumpulan partisi, dan ketika pemblokiran tidak diaktifkan, dibutuhkan 1 byte.
Jumlah memori untuk menyimpan data pengguna dalam RAM bervariasi untuk setiap kumpulan partisi, meskipun, seperti yang telah disebutkan, untuk kumpulan dengan indeks n dapat dihitung sebagai:
NUSE_Partition_Pool_Partition_Number [n] *(NUSE_Partition_Pool_Partition_Size [n] + 1)Panggilan API yang belum direalisasi
Tiga panggilan API untuk kumpulan partisi yang diterapkan di Nucleus RTOS tidak didukung di Nucleus SE.
Buat Partition Pool
Panggilan API ini menciptakan kumpulan partisi. Nucleus SE tidak membutuhkannya karena tugas dibuat secara statis.
Prototipe panggilan:
STATUS NU_Create_Partition_Pool (NU_PARTITION_POOL * pool, CHAR * nama, VOID * start_address, pool_size TANDA, partisi_size UNSIGNED, partisi_size UNSIGNED, OPTION suspend_type);Parameter:
pool - pointer ke unit
pool control yang ditentukan pengguna; digunakan sebagai pegangan ke kumpulan partisi dalam panggilan API lainnya;
name - pointer ke nama pool partisi, string 7-karakter dengan nol penghentian;
start_address - menetapkan alamat mulai untuk area memori kumpulan partisi;
pool_size - jumlah total memori dalam byte;
partisi_size - jumlah memori dalam byte untuk setiap partisi dalam kumpulan. Selain itu, sejumlah kecil memori tambahan dialokasikan terkait dengan setiap bagian, yang diwujudkan berkat dua pointer data yang digunakan.
suspend_type - menentukan bagaimana tugas ditangguhkan di kumpulan partisi; Opsi parameter yang valid adalah
NU_FIFO dan
NU_PRIORITY .
Nilai pengembalian:
NU_SUCCESS - menunjukkan keberhasilan penyelesaian panggilan;
NU_INVALID_POOL - menunjukkan nilai nol unit kontrol kumpulan partisi (
NULL );
NU_INVALID_MEMORY - menunjukkan nilai nol area memori yang ditentukan oleh
alamat start_ (
NULL );
NU_INVALID_SIZE - menunjukkan bahwa ukuran partisi 0 atau lebih besar dari memori yang dialokasikan untuk partisi;
NU_INVALID_SUSPEND - nilai
suspend_type tidak valid.
Menghapus Kolam Partisi
Panggilan API ini menghapus kumpulan partisi yang dibuat sebelumnya. Nucleus SE tidak memerlukannya karena objek dibuat secara statis dan tidak dapat dihapus.
Prototipe panggilan:
STATUS NU_Delete_Partition_Pool (NU_PARTITION_POOL * kumpulan);Parameter:
pool - pointer ke unit kontrol pool partisi;
Nilai pengembalian:
NU_SUCCESS - menunjukkan keberhasilan penyelesaian panggilan;
NU_INVALID_POOL - menunjukkan nilai yang tidak valid untuk penunjuk kumpulan partisi;
Pointer Pool Pointer
Panggilan API ini membuat daftar pointer berurutan untuk semua kumpulan partisi dalam sistem. Nucleus SE tidak memerlukan ini karena objek diidentifikasi oleh indeks, bukan pointer.
Prototipe panggilan:
NU_Partition_Pool_Pointers UNSIGNED (NU_PARTITION_POOL ** pointer_list, maksimum_pointers UNSIGNED);Parameter:
pointer_list - pointer ke array pointer
NU_PARTITION_POOL ; array diisi dengan pointer ke kumpulan yang terkonfigurasi dalam sistem;
maximum_pointers - jumlah maksimum pointer yang dapat ditempatkan dalam array.
Nilai pengembalian:
Jumlah
NU_PARTITION_POOL pointer ditempatkan dalam array.
Kompatibel dengan RTOS Inti
Ketika mengembangkan Nucleus SE, salah satu tugas utama adalah untuk memastikan kompatibilitas kode tingkat tinggi dengan Nucleus RTOS. Kolam partisi tidak terkecuali, dan, dari sudut pandang pengembang, mereka diimplementasikan dalam banyak cara yang sama seperti di RTOS Inti. Beberapa bidang ketidakcocokan yang ada dapat diterima, meskipun perlu dipertimbangkan bahwa kode akhir lebih mudah dipahami dan lebih efisien dalam hal memori. Namun, panggilan Nucleus RTOS API dapat digunakan hampir secara langsung sebagai panggilan Nucleus SE. Di masa depan, sebuah artikel direncanakan dengan informasi tentang penggunaan Nucleus SE oleh pengguna Nucleus RTOS.
Pengidentifikasi Objek
Dalam Nucleus RTOS, semua objek dijelaskan oleh struktur data (unit kontrol) dari tipe tertentu. Penunjuk ke blok kontrol ini digunakan sebagai pengidentifikasi untuk kumpulan partisi. Saya memutuskan bahwa Nucleus SE memerlukan pendekatan yang berbeda untuk penggunaan memori yang lebih efisien. Semua objek kernel dijelaskan oleh beberapa tabel dalam RAM dan / atau ROM. Ukuran tabel ini ditentukan oleh jumlah jenis yang dapat dikonfigurasi dari semua objek. Pengidentifikasi untuk objek tertentu adalah indeks dalam tabel ini. Oleh karena itu, saya menentukan
NUSE_PARTITION_POOL menjadi setara dengan
U8 , setelah itu variabel (bukan pointer) dari tipe ini berfungsi sebagai pengidentifikasi tugas. Ketidakcocokan sedikit ini mudah diketahui jika kode porting dari atau ke Nucleus RTOS. Pengidentifikasi objek biasanya disimpan dan dikirim tidak berubah.
Nucleus RTOS juga mendukung kumpulan partisi penamaan. Nama-nama ini hanya digunakan untuk debugging. Saya mengecualikan mereka dari Nucleus SE untuk menghemat memori.
Jumlah bagian dan volumenya
Dalam Nucleus RTOS, kumpulan partisi dikonfigurasikan berdasarkan total volume kumpulan dan volume partisi (yang membawa 2 pointer lebih banyak). Parameter ini didefinisikan sebagai TANDA TANGAN (sekitar 32 bit). Dalam Nucleus SE, kumpulan partisi dikonfigurasikan berdasarkan ukuran partisi (untuk yang byte tambahan telah ditambahkan) dan jumlah total partisi. Parameter-parameter ini masing-masing didefinisikan sebagai U16 dan U8.
Panggilan API yang belum direalisasi
Nucleus RTOS mendukung 7 panggilan untuk bekerja dengan kumpulan partisi, 3 di antaranya tidak diimplementasikan di Nucleus SE. Rincian lebih lanjut tentang tantangan ini dan alasan pengecualian mereka diuraikan di atas.
Artikel selanjutnya adalah tentang sinyal.
Tentang Pengarang: Colin Walls telah bekerja di industri elektronik selama lebih dari tiga puluh tahun, mencurahkan sebagian besar waktunya untuk firmware. Dia sekarang seorang insinyur firmware di Mentor Embedded (sebuah divisi dari Mentor Graphics). Colin Walls sering berbicara di konferensi dan seminar, penulis berbagai artikel teknis dan dua buku tentang firmware. Tinggal di Inggris.
Blog profesional
Colin , email: colin_walls@mentor.com.