Seluruh kebenaran tentang RTOS. Artikel # 28. Pengatur waktu perangkat lunak

Ide pengatur waktu perangkat lunak diperkenalkan pada artikel sebelumnya . Mereka adalah objek kernel yang menyediakan tugas dengan cara sederhana untuk memicu peristiwa tepat waktu, atau, paling sering, cara untuk melakukan tindakan secara teratur. Semua detail fungsionalitas terkait waktu (presisi, penanganan interupsi, dll.) Di Nucleus SE dibahas dalam artikel sebelumnya .




Menggunakan pengatur waktu


Timer program dapat dikonfigurasi untuk memicu sekali, yaitu, mereka mulai, dan kemudian, setelah periode waktu tertentu, cukup mengakhiri siklus. Atau penghitung waktu dapat dikonfigurasi untuk memulai kembali: setelah penghitungan selesai, penghitung waktu akan dimulai kembali secara otomatis. Waktu pengoperasian setelah restart mungkin berbeda dari waktu pengoperasian awal. Selain itu, timer dapat secara opsional dikonfigurasi untuk melakukan fungsi terminasi khusus, yang dijalankan ketika (atau setiap kali) timer menyelesaikan siklus kerja.

Pengaturan Timer


Jumlah pengatur waktu


Seperti kebanyakan aspek Nucleus SE, pengaturan pengatur waktu dikontrol oleh arahan #define di nuse_config.h . Parameter utama adalah NUSE_TIMER_NUMBER , yang menentukan timer yang dikonfigurasi dalam aplikasi. Secara default, nilai ini adalah nol (yaitu, timer tidak digunakan dalam aplikasi), dan dapat mengambil nilai hingga 16. Nilai yang salah akan menyebabkan kesalahan kompilasi, yang akan dihasilkan dengan memeriksa file nuse_config_check.h (file ini termasuk dalam nuse_config.c dan kompilasi bersama dengan itu), yang akan memicu arahan #error .

Memilih nilai bukan nol adalah aktivator timer utama. Parameter ini digunakan ketika mendefinisikan struktur data, dan ukurannya tergantung pada nilainya. Selain itu, nilai bukan nol mengaktifkan pengaturan API.

Aktivasi fungsi penyelesaian


Di Nucleus SE, saya mencoba mencari peluang untuk membuat fungsionalitas opsional, di mana itu akan menghemat memori. Contoh yang baik adalah dukungan untuk fungsi penyelesaian waktu. Selain fakta bahwa fitur ini adalah opsional untuk setiap timer, mekanisme dapat diaktifkan (atau tidak) untuk seluruh aplikasi menggunakan NUSE_TIMER_EXPIRATION_ROUTINE_SUPPORT parameter di nuse_config.h . Mengatur parameter ini ke FALSE memblokir definisi dua struktur data dalam ROM, yang akan dijelaskan secara rinci dalam artikel ini.

Aktivasi API


Setiap fungsi API (panggilan utilitas) di Nucleus SE memiliki #define directive directive di nuse_config.h. Untuk penghitung waktu, simbol-simbol ini termasuk:
NUSE_TIMER_CONTROL
NUSE_TIMER_GET_REMAINING
NUSE_TIMER_RESET
NUSE_TIMER_INFORMATION
NUSE_TIMER_COUNT

Secara default, semua aktivator diatur ke FALSE , sehingga semua panggilan layanan dinonaktifkan, memblokir masuknya kode yang mengimplementasikannya. Untuk mengatur penghitung waktu dalam aplikasi, Anda harus memilih panggilan layanan API yang diperlukan dan mengaturnya ke TRUE .

Berikut ini adalah potongan kode dari file nuse_config.h default.

#define NUSE_TIMER_NUMBER 0/*      0-16 */ /*    */ #define NUSE_TIMER_CONTROL FALSE #define NUSE_TIMER_GET_REMAINING FALSE #define NUSE_TIMER_RESET FALSE #define NUSE_TIMER_INFORMATION FALSE #define NUSE_TIMER_COUNT FALSE 

Jika fungsi API yang terkait dengan waktu diaktifkan dan tidak ada timer yang dikonfigurasi dalam aplikasi (kecuali untuk fungsi NUSE_Timer_Count () , yang selalu diaktifkan), 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 Layanan Timer


Nucleus RTOS mendukung delapan panggilan utilitas terkait timer yang menyediakan fungsionalitas berikut:

  • Timer manajemen (mulai / berhenti). Nucleus SE diimplementasikan dalam fungsi NUSE_Timer_Control () .
  • Mengambil sisa waktu penghitung waktu. Di Nucleus SE, diterapkan di NUSE_Timer_Get_Remaining () .
  • Mengembalikan timer ke keadaan semula (reset). Nucleus SE diimplementasikan di NUSE_Timer_Reset () .
  • Memberikan informasi tentang penghitung waktu tertentu. Nucleus SE diimplementasikan dalam NUSE_Timer_Information () .
  • Mengembalikan jumlah pengatur waktu yang dikonfigurasikan (saat ini) dalam aplikasi. Nucleus SE diimplementasikan di NUSE_Timer_Count () .
  • Menambahkan timer baru ke aplikasi (pembuatan). Nucleus SE tidak diimplementasikan.
  • Menghapus timer dari aplikasi. Nucleus SE tidak diimplementasikan.
  • Mengembalikan pointer ke semua penghitung waktu dalam aplikasi. Nucleus SE tidak diimplementasikan.

Implementasi setiap panggilan layanan akan dibahas secara rinci di bawah ini.

Layanan Timer


Operasi mendasar yang dapat dilakukan dengan timer adalah kontrol (mulai dan berhenti) dan pembacaan nilai saat ini. Nucleus RTOS dan Nucleus SE menyediakan dua panggilan utilitas API dasar untuk operasi ini.

Kontrol pengatur waktu


Panggilan utilitas ke Nucleus RTOS API untuk mengontrol timer memungkinkan Anda untuk mengaktifkan dan menonaktifkan timer (memulai dan menghentikan). Nucleus SE menyediakan fungsi serupa.

Timer Control Challenge di Nucleus RTOS
Prototipe panggilan layanan:

STATUS NU_Control_Timer (NU_TIMER * timer, OPTION aktifkan);

Parameter:
timer - penunjuk ke blok kontrol timer yang disediakan oleh pengguna;
aktifkan adalah fungsi yang diperlukan; bisa mengambil nilai NU_ENABLE_TIMER atau NU_DISABLE_TIMER .

Nilai pengembalian:
NU_SUCCESS - panggilan berhasil diselesaikan;
NU_INAVLID_TIMER - penunjuk waktu tidak valid;
NU_INAVLID_ENABLE - fungsi tidak valid.

Timer Control Challenge di Nucleus SE
Panggilan API ini mendukung fungsionalitas penuh dari Nucleus RTOS API.

Prototipe panggilan layanan:
STATUS NUSE_Timer_Control (timer NUSE_TIMER, OPTION aktifkan);

Parameter:
timer - index (ID) dari timer yang digunakan;
aktifkan adalah fungsi yang diperlukan; bisa mengambil nilai NUSE_ENABLE_TIMER atau NUSE_DISABLE_TIMER .

Nilai pengembalian:
NUSE_SUCCESS - panggilan berhasil diselesaikan;
NUSE_INCALID_TIMER - indeks timer tidak valid;
NUSE_INVALID_ENABLE adalah fungsi yang tidak valid.

Menerapkan Manajemen Timer di Nucleus SE
Kode fungsi API NUSE_Timer_Control () (setelah memeriksa parameter) cukup sederhana:

 NUSE_CS_Enter(); if (enable == NUSE_ENABLE_TIMER) { NUSE_Timer_Status[timer] = TRUE; if (NUSE_Timer_Expirations_Counter[timer] == 0) { NUSE_Timer_Value[timer] = NUSE_Timer_Initial_Time[timer]; } else { NUSE_Timer_Value[timer] = NUSE_Timer_Reschedule_Time[timer]; } } else /* enable == NUSE_DISABLE_TIMER */ { NUSE_Timer_Status[timer] = FALSE; } NUSE_CS_Exit(); 

Jika fungsi NUSE_DISABLE_TIMER ditentukan, status timer ( NUSE_Timer_Status [] parameter) diatur ke FALSE , yang mengabaikan timer oleh pengendali interrupt.

Saat memilih fungsi NUSE_ENABLE_TIMER, penghitung waktu ( NUSE_Timer_Value [] ) diatur ke NUSE_Timer_initial_Time [] , dengan ketentuan bahwa penghitung waktu tidak pernah berhenti sejak reset terakhir. Kalau tidak, itu akan diberi nilai NUSE_Timer_Reschedule_Time [] . Kemudian status timer (parameter NUSE_Timer_Status [] ) diatur ke TRUE , yang menyebabkan timer diproses oleh interrupt handler.

Pembacaan waktu


Untuk mendapatkan sisa waktu, panggilan layanan Nucleus RTOS API mengembalikan jumlah tindakan hingga kedaluwarsa. Nucleus SE menyediakan fungsi serupa.

Panggil untuk mendapatkan waktu yang tersisa di Nucleus RTOS

Prototipe panggilan layanan:
STATUS NU_Get_Remaining_Time (NU_TIMER * penghitung waktu, TIDAK DITANDATANGANKAN * sisa_waktu);

Parameter:
timer - penunjuk ke blok kontrol timer yang disediakan oleh pengguna;
Sisa_time - pointer ke penyimpanan nilai waktu yang tersisa, yang merupakan variabel dari tipe TANDA TANGAN .

Nilai pengembalian
NU_SUCCESS - panggilan berhasil diselesaikan;
NU_INVALID_TIMER - penunjuk waktu tidak valid.

Panggil untuk mendapatkan sisa waktu di Nucleus SE
Panggilan API ini mendukung fungsionalitas penuh dari Nucleus RTOS API.

Prototipe panggilan layanan:
STATUS NUSE_Timer_Get_Remaining (timer NUSE_TIMER, U16 * tersisa_waktu);

Parameter:
timer - index (ID) dari timer yang digunakan;
Sisa_time - pointer ke penyimpanan nilai waktu yang tersisa, yang merupakan variabel tipe U16 .

Nilai pengembalian:
NUSE_SUCCESS - panggilan berhasil diselesaikan;
NUSE_INVALID_TIMER - indeks timer tidak valid;
NUSE_INVALID_POINTER - null pointer ke sisa waktu ( NULL ).

Menerapkan Pembaca Waktu dalam Nucleus SE
Varian kode fungsi API NUSE_Timer_Get_Remaining () (setelah memeriksa parameter) sepele. Nilai NUSE_Timer_Value [] diperoleh dan kemudian dikembalikan di bagian kritis.

Layanan Pengatur Waktu Tambahan


Nucleus RTOS memiliki empat panggilan API yang menyediakan fungsi tambahan yang terkait dengan penghitung waktu: mengatur ulang penghitung waktu, mendapatkan informasi penghitung waktu, mendapatkan jumlah penghitung waktu dalam suatu aplikasi, dan mendapatkan petunjuk ke semua penghitung waktu dalam suatu aplikasi. Tiga fungsi pertama diimplementasikan dalam Nucleus SE.

Atur ulang timer


Panggilan API ini mengatur ulang timer ke kondisi aslinya, yang tidak digunakan. Penghitung waktu dapat diaktifkan atau dinonaktifkan setelah panggilan berakhir. Ini hanya dapat digunakan setelah timer dinonaktifkan (menggunakan NUSE_Timer_Control () ). Kali berikutnya penghitung waktu diaktifkan, akan diinisialisasi dengan parameter NUSE_Timer_Initial_Time [] . Nucleus RTOS memungkinkan Anda memberikan keadaan awal dan menjadwal ulang waktu baru, serta menentukan fungsi penyelesaian saat timer diatur ulang. Dalam Nucleus SE, nilai-nilai ini diatur selama pengaturan dan tidak dapat diubah karena disimpan dalam ROM.

Panggilan untuk mengatur ulang timer di Nucleus RTOS

Prototipe panggilan layanan:
STATUS NU_Reset_Timer (NU_TIMER * penghitung waktu, VOID (* expiration_routine) (TIDAK DITANDATANGANI), inisialisasi TANDA, waktu tunda dijadwalkan, TANDA aktifkan ulang jadwal, aktifkan OPSI);

Parameter:
timer - pointer ke timer yang dapat direset;
expiration_routine - menunjukkan fungsi yang akan dieksekusi ketika loop berakhir;
initial_time - jumlah awal pengingat waktu sampai loop berakhir;
reschedule_time - jumlah penghitung waktu berdetak hingga siklus kedua dan selanjutnya selesai;
aktifkan - kondisi waktu yang diperlukan setelah reset, dapat mengambil nilai NU_ENABLE_TIMER atau NU_DISABLE_TIMER .

Nilai pengembalian:
NU_SUCCESS - panggilan berhasil diselesaikan;
NU_INVALID_TIMER - pointer tidak valid ke unit kontrol timer;
NU_INVALID_FUNCTION - null pointer ke fungsi penyelesaian ( NULL );
NU_INVALID_ENABLE - negara yang ditentukan salah;
NU_NOT_DISABLED - timer sudah berjalan (harus dihentikan sebelum memanggil fungsi ini).

Panggil untuk mengatur ulang timer di Nucleus SE
Panggilan layanan API ini mendukung versi sederhana dari fungsionalitas inti API Nucleus RTOS.

Prototipe panggilan layanan:
STATUS NUSE_Timer_Reset (timer NUSE_TIMER, OPTION aktifkan);

Parameter:
timer - index (ID) dari timer reset;
aktifkan - kondisi yang diperlukan setelah diatur ulang, dapat mengambil nilai NUSE_ENABLE_TIMER atau NUSE_DISABLE_TIMER .

Nilai pengembalian:
NUSE_SUCCESS - panggilan berhasil diselesaikan;
NUSE_INVALID_TIMER - indeks timer tidak valid;
NUSE_INVALID_ENABLE - negara yang ditentukan salah;
NUSE_NOT_DISABLED - timer sudah berjalan (harus dihentikan sebelum memanggil fungsi ini).

Menerapkan pengaturan ulang timer pada Nucleus SE
Versi kode fungsi API NUSE_Timer_Reset () (setelah memeriksa parameter dan status saat ini) cukup sederhana:

 NUSE_CS_Enter(); NUSE_Init_Timer(timer); if (enable == NUSE_ENABLE_TIMER) { NUSE_Timer_Status[timer] = TRUE; } /*  enable == NUSE_DISABLE_TIMER    FALSE */ NUSE_CS_Exit(); 

Panggilan ke NUSE_Init_Timer () menginisialisasi nilai waktu dan menghapus penghitung penyelesaian. Setelah itu, jika perlu, nilai status yang diperlukan diperiksa dan apakah timer menyala.

Informasi Pengatur Waktu


Panggilan layanan ini memungkinkan Anda untuk mendapatkan satu set informasi pengatur waktu. Implementasi Nucleus SE berbeda dari Nucleus RTOS dalam hal ia mengembalikan lebih sedikit informasi karena penamaan objek tidak didukung.

Panggil untuk informasi pengatur waktu di Nucleus RTOS

Prototipe panggilan layanan:
STATUS NU_Timer_Information (NU_TIMER * timer, CHAR * nama, OPTION * aktifkan, tidak kedaluwarsa * expirations, UNSIGNED * id, UNSIGNED * initial_time, UNSIGNED * reschedule_time);

Parameter:
timer - pointer ke timer tentang informasi mana yang diminta;
name - pointer ke wilayah 8 karakter untuk nama timer;
aktifkan - arahkan ke variabel yang mengambil status aktifator pengatur waktu: NU_ENABLE_TIMER atau NU_DISABLE_TIMER ;
kedaluwarsa - pointer ke variabel yang menghitung jumlah penyelesaian siklus waktu sejak reset terakhir;
pointer - id ke variabel yang mengambil nilai parameter yang diteruskan ke fungsi akhir siklus timer;
initial_time - sebuah pointer ke variabel yang mengambil nilai di mana timer akan diinisialisasi setelah reset;
reschedule_time - sebuah pointer ke variabel yang mengambil nilai di mana timer akan diinisialisasi setelah selesai.

Nilai pengembalian:
NU_SUCCESS - panggilan berhasil diselesaikan;
NU_INVALID_TIMER - penunjuk waktu tidak valid.

Panggil untuk informasi timer di Nucleus SE
Panggilan API ini mendukung fungsionalitas inti API Nucleus RTOS.

Prototipe panggilan layanan:
STATUS NUSE_Timer_Information (timer NUSE_TIMER, OPTION * aktifkan, U8 * kedaluwarsa, U8 * id, U16 * initial_time, U16 * reschedule_time);

Parameter:
timer - indeks timer tentang informasi yang diminta;
aktifkan - pointer ke variabel yang mengambil nilai TRUE atau FALSE , tergantung pada apakah timer diaktifkan atau tidak;
expirations - pointer ke variabel tipe U8 yang mengambil nilai jumlah penyelesaian timer sejak reset terakhir;
pointer - id ke variabel tipe U8 yang mengambil nilai parameter yang diteruskan ke fungsi penyelesaian waktu (akan mengembalikan nilai kosong jika fungsi penyelesaian dinonaktifkan);
initial_time - pointer ke variabel tipe U16 yang mengambil nilai dengan mana timer akan diinisialisasi setelah reset;
reschedule_time - pointer ke variabel tipe U16 , yang mengambil nilai dengan mana timer akan diinisialisasi setelah selesai.

Nilai pengembalian:
NUSE_SUCCESS - panggilan berhasil diselesaikan;
NUSE_INVALID_TIMER - indeks timer tidak valid;
NUSE_INVALID_POINTER - satu atau beberapa parameter pointer salah.

Menerapkan informasi pengatur waktu di Nucleus SE
Menerapkan panggilan API ini cukup sederhana:

 NUSE_CS_Enter(); if (NUSE_Timer_Status[timer]) { *enable = NUSE_ENABLE_TIMER; } else { *enable = NUSE_DISABLE_TIMER; } *expirations = NUSE_Timer_Expirations_Counter[timer]; #if NUSE_TIMER_EXPIRATION_ROUTINE_SUPPORT *id = NUSE_Timer_Expiration_Routine_Parameter[timer]; #endif *initial_time = NUSE_Timer_Initial_Time[timer]; *reschedule_time = NUSE_Timer_Reschedule_Time[timer]; NUSE_CS_Exit(); 

Fungsi mengembalikan status timer. Nilai parameter dari fungsi terminasi dikembalikan hanya jika dukungannya telah diaktifkan dalam aplikasi.

Mendapatkan jumlah timer


Panggilan utilitas ini mengembalikan jumlah pengatur waktu yang dikonfigurasi dalam aplikasi. Dalam Nucleus RTOS, nilai ini dapat berubah seiring waktu, dan nilai kembali akan menampilkan jumlah pengatur waktu saat ini. Dalam Nucleus SE, nilai kembali diatur selama fase perakitan dan tidak dapat diubah.

Panggil penghitung waktu di Nucleus RTOS

Prototipe panggilan layanan:
NU_Established_Timers (VOID) TIDAK DITANDATANGANI;

Parameter: tidak ada

Nilai kembali: jumlah penghitung waktu yang dibuat dalam sistem.

Memanggil Penghitung Waktu di Nucleus SE
Panggilan API ini mendukung fungsionalitas inti API Nucleus RTOS.

Prototipe panggilan layanan:
U8 NUSE_Timer_Count (batal);

Parameter: tidak ada

Nilai pengembalian:
jumlah penghitung waktu yang dikonfigurasi dalam aplikasi

Implementasi Penghitung Waktu


Implementasi panggilan API ini cukup sederhana: nilai simbol #define NUSE_TIMER_NUMBER dikembalikan .

Struktur data


Pengatur waktu menggunakan lima atau tujuh struktur data (terletak di RAM atau ROM) yang (seperti objek Nucleus SE lainnya) adalah seperangkat tabel yang ukuran dan jumlahnya sesuai dengan jumlah pengatur waktu yang dikonfigurasi dan parameter yang dipilih.

Saya sangat merekomendasikan bahwa kode aplikasi tidak menggunakan akses langsung ke struktur data ini, tetapi merujuknya 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. Berikut ini adalah ikhtisar terperinci dari struktur untuk menyederhanakan pemahaman panggilan layanan dan kode debugging.

Data RAM


Data ini memiliki struktur sebagai berikut:
NUSE_Timer_Status [] adalah larik tipe U8 yang memiliki satu entri untuk setiap timer yang dikonfigurasi dan menyimpan status timer (berjalan atau berhenti: BENAR atau SALAH ).
NUSE_Timer_Value [] adalah larik tipe U16 yang memiliki satu entri untuk setiap penghitung waktu yang dikonfigurasi dan menyimpan nilai penghitung waktu penghitung saat ini.
NUSE_Timer_Expirations_Counter [] - larik tipe U8 , berisi penghitung jumlah kasus ketika penghitung waktu mencapai akhir siklus sejak reset terakhir mereka.

Semua struktur data ini diinisialisasi oleh fungsi NUSE_Init_Timer () ketika Nucleus SE dimulai. Salah satu artikel berikut akan berisi deskripsi lengkap tentang prosedur startup untuk Nucleus SE.

Berikut ini adalah definisi dari struktur data ini dalam file nuse_init.c :
RAM U8 Timer_Status [NUSE_TIMER_NUMBER];
RAM U16 NUSE_Timer_Value [NUSE_TIMER_NUMBER];
RAM U8 NUSE_Timer_Expirations_Counter [NUSE_TIMER_NUMBER];

Data ROM


Struktur data ini:
NUSE_Timer_Initial_Time [] adalah larik tipe U16 yang memiliki satu entri untuk setiap timer yang dikonfigurasi dan menyimpan nilai setiap timer.
NUSE_Timer_Reschedule_Time [] - larik tipe U16 yang memiliki satu entri untuk setiap timer yang dikonfigurasi dan menyimpan nilai di mana timer akan ditetapkan setelah selesai. Nilai nol menunjukkan bahwa timer adalah "satu kali" dan tidak boleh dimulai ulang secara otomatis.
NUSE_Timer_Expiration_Routine_Address [] - larik jenis ADDR yang berisi alamat prosedur kedaluwarsa timer. Array ini hanya ada jika dukungan untuk prosedur kedaluwarsa timer telah diaktifkan.
NUSE_Timer_Expiration_Routine_Parameter [] - larik tipe U8 yang berisi nilai parameter yang diteruskan ke fungsi penyelesaian waktu. Array ini hanya ada jika dukungan untuk fungsi penyelesaian telah diaktifkan.

Struktur data ini dideklarasikan dan diinisialisasi (secara statis) dalam file nuse_config.c , dengan demikian:

 ROM U16 NUSE_Timer_Initial_Time[NUSE_TIMER_NUMBER] = { /*   ------ */ }; ROM U16 NUSE_Timer_Reschedule_Time[NUSE_TIMER_NUMBER] = { /*      ------ */ }; #if NUSE_TIMER_EXPIRATION_ROUTINE_SUPPORT || NUSE_INCLUDE_EVERYTHING /*    */ ROM ADDR NUSE_Timer_Expiration_Routine_Address[NUSE_TIMER_NUMBER] = { /*     ------ */ /*   NULL */ }; ROM U8 NUSE_Timer_Expiration_Routine_Parameter[NUSE_TIMER_NUMBER] = { /*     ------ */ }; #endif 

Jumlah memori untuk penghitung waktu


Seperti semua objek Nucleus SE lainnya, jumlah data yang diperlukan untuk penghitung waktu dapat diprediksi.

Jumlah data dalam RAM (dalam byte) untuk semua penghitung waktu dalam aplikasi dapat dihitung sebagai berikut:
NUSE_TIMER_NUMBER * 4

Jumlah data dalam ROM (dalam byte) untuk semua penghitung waktu dalam aplikasi, jika dukungan untuk fungsi penyelesaian dinonaktifkan, dapat dihitung sebagai berikut:
NUSE_TIMER_NUMBER * 4

Kalau tidak, itu sama dengan:
NUSE_TIMER_NUMBER * (sizeof (ADDR) + 5)

Panggilan API yang belum direalisasi


Nucleus SE tidak mengimplementasikan tiga panggilan API yang dapat ditemukan di RTOS.

Pembuatan timer


Panggilan API ini menciptakan timer. Nucleus SE tidak membutuhkannya, karena penghitung waktu dibuat secara statis.

Prototipe panggilan layanan:
STATUS NU_Create_Timer (NU_TIMER * penghitung waktu, CHAR * nama, VOID (* expiration_routine) (TANDA TANGAN), id TANDA TANGAN, awal_TANDANGAN tANDA, ttg penjadwalan ulang yang TANDA TANGAN, OPTION aktifkan);

Parameter:
timer - penunjuk ke blok kontrol timer yang disediakan oleh pengguna; itu akan digunakan untuk mengontrol timer di panggilan API lainnya;
name - pointer ke nama 7-karakter timer dengan nol penghentian;
expiration_routine - menunjukkan fungsi yang harus dijalankan setelah penghitung waktu berakhir;
id - elemen data tipe UNSIGNED yang diteruskan ke fungsi terminasi: parameter ini dapat digunakan untuk mengidentifikasi timer dengan fungsi terminasi yang sama;
initial_time - menunjukkan jumlah awal kutu sebelum timer berakhir;
reschedule_time - menunjukkan jumlah kutu waktu sampai siklus kedua dan selanjutnya selesai; jika parameter ini sama dengan nol, penghitung waktu berhenti hanya sekali;
aktifkan - parameter ini dapat mengambil nilai NU_ENABLE_TIMER dan NU_DISABLE_TIMER ; NU_ENABLE_TIMER mengaktifkan timer setelah itu dibuat; NU_DISABLE_TIMER membiarkan timer dinonaktifkan; pengatur waktu yang dibuat dengan parameter NU_DISABLE_TIMER harus diaktifkan dengan memanggil NU_Control_Timer .

Nilai pengembalian:
NU_SUCCESS - panggilan berhasil diselesaikan;
NU_INVALID_TIMER - penunjuk nol ke unit kontrol penghitung waktu ( NULL ), atau unit kontrol sudah digunakan;
NU_INVALID_FUNCTION - null pointer ke program penyelesaian ( NULL );
NU_INVALID_ENABLE - parameter aktifkan tidak valid;
NU_INVALID_OPERATION - parameter initial_time adalah nol.

Hapus timer


Panggilan API ini menghapus timer yang dibuat sebelumnya. Nucleus SE tidak membutuhkannya, karena penghitung waktu dibuat secara statis dan tidak dapat dihapus.

Prototipe panggilan layanan:
STATUS NU_Delete_Timer (NU_TIMER * timer);

Parameter:
timer - penunjuk ke blok kontrol timer.

Nilai pengembalian:
NU_SUCCESS - panggilan berhasil diselesaikan;
NU_INVALID_TIMER - penunjuk waktu tidak valid;
NU_NOT_DISABLED - Timer yang ditentukan tidak dinonaktifkan.

Timer Pointer


Panggilan API ini membentuk daftar petunjuk berurutan untuk semua penghitung waktu dalam sistem. Nucleus SE tidak membutuhkannya, karena penghitung waktu ditentukan oleh indeks sederhana, bukan penunjuk.

Prototipe panggilan layanan:
NU_Timer_Pointers TIDAK DITANDATANGANI (NU_TIMER ** pointer_list, maksimum_pointers UNSIGNED);

Parameter:
pointer_list - pointer ke array pointer NU_TIMER ; itu akan diisi dengan pointer ke timer yang dikonfigurasi dalam sistem;
maximum_pointers - jumlah maksimum pointer dalam array.

Nilai pengembalian:
Jumlah pointer NU_TIMER ditempatkan di dalam array.

Kompatibel dengan RTOS Inti


Seperti semua objek Nucleus SE lainnya, tujuan saya adalah untuk memaksimalkan kompatibilitas kode aplikasi dengan Nucleus RTOS. Pengatur waktu tidak terkecuali dan, dari sudut pandang pengguna, mereka diimplementasikan dengan cara yang sama seperti pada Nucleus RTOS.Ada juga ketidakcocokan tertentu, yang saya anggap dapat diterima, mengingat bahwa sebagai hasilnya, kode akan menjadi lebih mudah dimengerti dan lebih efisien dalam hal jumlah memori yang diperlukan. Jika tidak, panggilan Nucleus RTOS API dapat langsung diangkut ke Nucleus SE.

Pengidentifikasi Objek


Dalam Nucleus RTOS, semua objek dijelaskan oleh struktur data - blok kontrol yang memiliki tipe data tertentu. Penunjuk ke unit kontrol ini adalah pengidentifikasi waktu. Saya memutuskan bahwa dalam Nucleus SE, diperlukan pendekatan yang berbeda untuk penggunaan memori yang efisien: semua objek kernel dijelaskan oleh seperangkat tabel dalam RAM dan / atau ROM. Ukuran tabel ini ditentukan oleh jumlah objek yang dikonfigurasi dari setiap jenis. Pengidentifikasi objek tertentu adalah indeks dalam tabel ini. Jadi saya mendefinisikan NUSE_TIMER sebagai setara dengan U8, variabel (bukan pointer) dari tipe ini berfungsi sebagai pengidentifikasi timer. Ketidakcocokan sedikit ini mudah ditangani jika kode porting dari Nucleus SE ke Nucleus RTOS dan sebaliknya. Biasanya, tidak ada operasi yang dilakukan pada pengidentifikasi objek selain memindahkan dan menyimpan.
Nucleus RTOS juga mendukung timer penamaan. Nama-nama ini hanya digunakan untuk debugging. Saya mengecualikan mereka dari Nucleus SE untuk menghemat memori.

Ukuran pengatur waktu


Dalam Nucleus RTOS, timer diimplementasikan menggunakan penghitung 32-bit. Saya memutuskan untuk mengurangi nilai ini menjadi 16 bit di Nucleus SE. Ini telah menyebabkan peningkatan yang signifikan dalam efisiensi dan runtime memori. Nucleus SE dapat dimodifikasi jika aplikasi membutuhkan waktu yang lebih lama.

Fungsi penyelesaian


Nucleus SE mengimplementasikan fungsi terminasi dengan cara yang mirip dengan Nucleus RTOS, hanya saja mereka dapat dimatikan sepenuhnya (yang memungkinkan Anda menghemat memori), dan mereka juga ditentukan secara statis. Fungsi akhir tidak dapat diubah ketika timer diatur ulang.

Panggilan API yang belum direalisasi


Nucleus RTOS mendukung delapan panggilan layanan pewaktu. Dari jumlah tersebut, tiga tidak diimplementasikan dalam Nucleus SE. Penjelasan terperinci tentang panggilan ini, serta alasan keputusan ini, dapat ditemukan sebelumnya dalam artikel ini, di bagian "Panggilan API yang Tidak Direalisasi".

Artikel berikut akan memeriksa interupsi.

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


All Articles