Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Industrial Internet of Things >> Tertanam

Memori partisi – pengenalan dan layanan dasar


Lihat seri Terungkap RTOS

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:

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


Tertanam

  1. Pengantar Baja Tahan Karat dan Cara Pembuatannya
  2. Istilah dan Konsep Memori Digital
  3. C# Input dan Output Dasar
  4. Manajemen Memori C++:baru dan hapus
  5. Kotak Surat:pengenalan dan layanan dasar
  6. Semaphores:layanan utilitas dan struktur data
  7. Semaphores:pengenalan dan layanan dasar
  8. Grup bendera acara:pengenalan dan layanan dasar
  9. Antrian:pengenalan dan layanan dasar
  10. Rutronik dan Memori AP menandatangani perjanjian distribusi global