Konsep waktu dalam konteks RTOS diperkenalkan di salah satu
artikel sebelumnya , bersama dengan gagasan fungsi terkait waktu yang tersedia di RTOS.

Artikel sebelumnya dalam seri: Centang timer
Semua fungsi terkait waktu dikendalikan oleh jam perangkat keras. Ini adalah osilator sederhana yang menghasilkan permintaan interupsi secara berkala. Agar nomor jam masuk akal untuk program aplikasi, frekuensi generator harus diketahui.
Penanganan Interupsi Timer
Interupsi yang dihasilkan oleh pengatur waktu perangkat keras harus diservis dengan cara tertentu dalam penangan interupsi (Interrupt Service Routine, ISR), yang mengimplementasikan semua fungsi RTOS terkait waktu. Rincian pengatur waktu interupsi di Nucleus SE akan dibahas dalam salah satu artikel berikut.
Fungsi yang terkait dengan waktu
Nucleus RTOS dan Nucleus SE mengandung beberapa mekanisme terkait waktu:
- Jam tick sistem (Tick tick) : Penghitung sederhana yang bertambah menggunakan pengendali interupsi timer. Baik Nucleus RTOS dan Nucleus SE memiliki penghitung 32-bit, dan tugas memiliki mekanisme untuk membaca dan menulis nilainya. Dalam Nucleus SE, penghitung waktu jam adalah opsional.
- Pengatur waktu aplikasi : Baik Nucleus RTOS dan Nucleus SE mendukung objek pengatur waktu. Penggunaan dan penerapannya dalam Nucleus SE akan dibahas lebih rinci di artikel berikutnya.
- Penjadwalan slice waktu : Dalam Nucleus RTOS, tugas dengan prioritas yang sama disajikan menggunakan algoritma Round-robin, tetapi Anda juga dapat menggunakan slicing waktu. Dalam Nucleus SE, penjadwalan slicing time adalah opsional; ini telah dibahas secara rinci dalam artikel sebelumnya (pandangan umum penjadwal TS (Time slice) dan TS dalam Nucleus SE ).
- Menunda tugas (Tugas tidur) : Tugas dapat menjeda sendiri (βtertidurβ) untuk jangka waktu tertentu. Mekanisme ini telah dijelaskan secara rinci sebelumnya .
- Batas waktu panggilan API : di Nucleus RTOS dan Nucleus SE, beberapa panggilan API memungkinkan Anda untuk menjeda tugas sambil menunggu sumber daya tersedia. Jeda mungkin tidak terdefinisi, atau, dalam kasus Nucleus RTOS, periode batas waktu opsional (periode menunggu) dapat ditunjukkan. Nucleus SE tidak mendukung batas waktu panggilan API.
Akurasi
Dan sekarang, ada baiknya menceritakan secara singkat tentang keakuratan timer sistem.
Keakuratan fungsi waktu secara langsung tergantung pada frekuensi generator jam. Misalnya, jika pulsa tiba setiap 10 milidetik, dan tugas aplikasi membutuhkan penundaan 100 milidetik, itu jelas membutuhkan 10 pulsa. Namun, tidak diketahui kapan impuls sebelumnya diterima: itu bisa saja terjadi atau hampir 10 milidetik yang lalu. Oleh karena itu, penundaan 100 milidetik dapat memakan waktu hingga 110 milidetik.
Cara yang jelas untuk menyelesaikan masalah ini adalah dengan meningkatkan frekuensi generator. Jika pulsa mengikuti pada interval 1 milidetik, penundaan 100 milidetik tidak akan pernah mengambil lebih dari seratus milidetik. Kerugian dari solusi ini adalah bahwa pengatur waktu interupsi akan memakan waktu prosesor 10 kali lebih banyak, yang akan berlebihan. Perancang sistem harus menemukan keseimbangan antara ketepatan waktu yang diperlukan dan daya prosesor yang tersedia.
Pengaturan waktu sistem
Seperti kebanyakan objek Nucleus SE, pengaturan waktu sistem sebagian besar dikendalikan oleh arahan
#define dalam file
nuse_config.h . Parameter utama adalah
NUSE_SYSTEM_TIME_SUPPORT , yang mengaktifkan mekanisme dukungan waktu sistem. Anda tidak perlu menentukan jumlah objek: waktu sistem diaktifkan atau tidak.
Pilihan nilai bukan nol adalah penggerak utama waktu sistem. Parameter ini digunakan ketika mendefinisikan struktur data, yang akan dibahas secara rinci nanti dalam artikel ini. Selain itu, nilai bukan nol mengaktifkan pengaturan API.
Aktivasi API
Setiap fungsi API (panggilan utilitas) di Nucleus SE memiliki #define directive yang diaktifkan dalam file nuse_config.h. Untuk waktu sistem, simbol-simbol ini adalah:
NUSE_CLOCK_SETNUSE_CLOCK_RETRIEVESecara default, mereka disetel ke
FALSE , sehingga semua panggilan layanan dinonaktifkan, memblokir penyertaan kode yang mengimplementasikannya. Untuk mengonfigurasi waktu sistem dalam aplikasi, Anda harus memilih panggilan layanan API yang diperlukan dan mengaturnya ke
TRUE .
Berikut ini adalah cuplikan kode dari file nuse_config.h default.
#define NUSE_SYSTEM_TIME_SUPPORT FALSE /* */ #define NUSE_CLOCK_SET FALSE /* */ #define NUSE_CLOCK_RETRIEVE FALSE /* */
Jika Anda mencoba menggunakan panggilan layanan API waktu sistem ketika aktivator waktu sistem dimatikan, kesalahan kompilasi akan terjadi. Jika kode Anda menggunakan panggilan API yang belum diaktifkan, kesalahan tata letak akan terjadi karena kode implementasi tidak termasuk dalam aplikasi.
Panggilan Utilitas Waktu Sistem
Nucleus RTOS mendukung dua panggilan utilitas yang berhubungan dengan waktu sistem dan menyediakan fungsionalitas berikut:
- Mengatur nilai waktu sistem. Nucleus SE diimplementasikan dalam fungsi NUSE_Clock_Set () .
- Mendapatkan nilai waktu sistem. Nucleus SE diimplementasikan dalam fungsi NUSE_Clock_Retrieve () .
Pertimbangkan implementasi masing-masing panggilan ini secara lebih rinci.
Panggilan layanan untuk mengatur dan mendapatkan waktu sistem
Dengan waktu sistem, Anda hanya dapat melakukan operasi pengaturan ke nilai yang diberikan dan mendapatkan nilai saat ini. Nucleus RTOS dan Nucleus SE menyediakan dua panggilan API dasar untuk mengimplementasikan operasi ini.
Penafsiran nilai waktu sistem tergantung pada aplikasi, karena pada dasarnya merupakan penghitung jumlah "siklus clock" yang telah terjadi sejak reset terakhir penghitung. Untuk menggunakan informasi ini, frekuensi generator harus diketahui.
Pengaturan waktu
Tugas apa pun dapat mengatur waktu sistem dengan memanggil fungsi API ini.
Panggilan untuk mengatur waktu sistem dalam Nucleus RTOSPrototipe panggilan layanan:
VOID NU_Set_Clock (Nilai__Tanda baru);Parameter:
new_value - nilai yang akan diberikan ke waktu sistem
Nilai pengembalian: tidak ada.
Panggilan untuk mengatur waktu sistem dalam Nucleus SEPanggilan API ini mendukung fungsionalitas inti API Nucleus RTOS.
Prototipe panggilan layanan:
membatalkan NUSE_Clock_Set (Nilai U_ new_32);Parameter:
new_value - nilai yang akan diberikan ke waktu sistem
Nilai pengembalian: tidak ada
Implementasi pengaturan waktu di Nucleus SEKode ini sangat sederhana. Nilai yang diberikan ditulis ke
NUSE_Tick_Clock di dalam bagian kritis.
Mendapatkan waktu sistem
Suatu tugas dapat memperoleh nilai waktu sistem menggunakan fungsi API ini.
Panggilan untuk mendapatkan waktu sistem dalam Nucleus RTOSPrototipe panggilan layanan:
NU_Retrieve_Clock (VOID) TIDAK DITANDATANGANI;Parameter: Tidak ada
Nilai kembali: nilai saat ini dari waktu sistem
Memanggil untuk mendapatkan waktu sistem dalam Nucleus SEPrototipe panggilan layanan:
U32 NUSE_Clock_Retrieve (batal);Parameter: Tidak ada
Nilai kembali: nilai saat ini dari waktu sistem
Implementasi perolehan waktu di Nucleus SEKode ini sangat sederhana. Fungsi mengembalikan nilai
NUSE_Tick_Clock yang diperoleh di bagian kritis.
Struktur data
Waktu sistem menggunakan satu struktur data (terletak di RAM), yang merupakan kata 32-bit.
Saya sangat merekomendasikan bahwa kode aplikasi tidak menggunakan akses langsung ke struktur data ini, tetapi mengaksesnya melalui fungsi API yang disediakan. Ini akan menghindari ketidakcocokan dengan versi Nucleus SE dan efek samping yang tidak diinginkan di masa depan, serta menyederhanakan aplikasi porting ke Nucleus RTOS. Rincian struktur data disediakan di bawah ini untuk menyederhanakan pemahaman kode panggilan layanan dan debugging.
Data RAM
Struktur data:
NUSE_Tick_Clock - variabel tipe
U32 , yang menyimpan penghitung jam waktu sistem.
Struktur data ini diinisialisasi ke nol oleh fungsi
NUSE_Init_Task () ketika Nucleus SE dimulai. Salah satu artikel berikut akan berisi deskripsi lengkap tentang prosedur startup untuk Nucleus SE.
Data ROM
Tidak ada struktur data yang terkait dengan waktu sistem dalam ROM.
Jumlah memori untuk waktu sistem
Seperti semua objek Nucleus SE lainnya, jumlah memori yang diperlukan untuk waktu sistem dapat diprediksi.
Jumlah memori dalam ROM adalah 0.
Jumlah memori dalam RAM (dalam byte) selalu 4.
Panggilan API yang belum direalisasi
Semua panggilan layanan Nucleus RTOS API waktu sistem memiliki yang setara di Nucleus SE.
Kompatibel dengan Nucleus PLUS
Seperti dengan semua objek Nucleus SE lainnya, tujuan saya adalah untuk memastikan bahwa kode aplikasi serapat mungkin kompatibel dengan Nucleus RTOS. Waktu sistem tidak terkecuali dan, dari sudut pandang pengguna, itu diimplementasikan dalam banyak cara yang sama seperti di Nucleus RTOS. Panggilan Nucleus RTOS API dapat langsung dipindahkan ke Nucleus SE.
Pada artikel berikut kami akan mempertimbangkan pengatur waktu perangkat lunak.