Seluruh kebenaran tentang RTOS. Artikel # 27. Waktu sistem

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




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_SET
NUSE_CLOCK_RETRIEVE

Secara 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 RTOS

Prototipe 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 SE
Panggilan 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 SE
Kode 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 RTOS

Prototipe 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 SE
Prototipe panggilan layanan:
U32 NUSE_Clock_Retrieve (batal);

Parameter: Tidak ada

Nilai kembali: nilai saat ini dari waktu sistem

Implementasi perolehan waktu di Nucleus SE
Kode 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.

Source: https://habr.com/ru/post/id454272/


All Articles