Untuk program kami Seperti semua OS real-time, FreeRTOS bekerja dengan tugas. Tugas ini
Harus didefinisikan dalam fungsi dengan struktur yang terdefinisi dengan baik, yang dijelaskan di bawah ini.
Kode inisialisasi (opsional) looping tak hingga(tugas seharusnya tidak pernah kembali) Kode aplikasi tugas
s t a t i c void vTaskOne( void upvParameters ) {
// I n i t i a l i z a t i o n code
while (1) { 5 //Task appl i c a t i on code
}}
Saat sebuah tugas diimplementasikan, Anda harus membuat tugas ini dengan menghubungi XTaskCreate () function.
Pointer ke task entry function. Nama deskriptif untuk task itu. Ukuran tumpukan task. Pointer yang akan digunakan sebagai parameter untuk task yang
sedang dibuat. Prioritas di mana task harus dijalankan. Pegangan dimana task yang diciptakan dapat dirujuk.
Fungsi ini harus dipanggil dalam setup () function. Anda akan menemukan daftar 2, contoh penggunaan xTaskCreate () untuk vTaskOne (daftar 1).
xTaskCreate (vTaskOne ,
( signed portCHAR u) taskOne,
configMINIMAL STACK SIZE + 50 ,
NULL,
tskIDLE PRIORITY ,
NULL)
Akhirnya untuk mengakhiri deskripsi kami, kami akan memperkenalkan konsep terakhir, bernama mutex. Dalam aplikasi kita banyak tugas memiliki akses ke
variabel global. Untuk menghindarinya, tugas ingin mengubah nilai variabel sementara tugas lain adalah membaca yang ini, kita menggunakan mutexes. Seorang
mutex, adalah seorang raja token. Ketika sebuah tugas memiliki mutex, itu adalah satu-satunya yang dapat mengakses variabel. Sampai tugas tersebut belum
diberikan mutex, tugas lainnya dihentikan sementara dan menunggu sampai mutex bebas . dibawah contoh Mutex
i n t globalVar iable = 0;
xSemaphoreHandle xMutex = NULL;
void vTaskA ( voidu pvParameters ) {
while (1){ i f ( xSemaphoreTake ( xMutex , portMAX DELAY == pdTRUE){ //Reading globalVar iabl e
xSemaphoreGive ( xMutex ) ;
}}}
void vTaskB ( void u pvParameters ) { while (1){ i f ( xSemaphoreTake ( xMutex , portMAX DELAY == pdTRUE){ //Changing globalVar iabl e
xSemaphoreGive ( xMutex ) ;
}}}
setup ( ) { // . . .
xMutex = xSemaphoreCreateMutex ( ) ;
//...
}
Contoh penggunaan mutex, ditunjukkan pada daftar 3. Pertama-tama, mutex dibuat dalam fungsi setup (). Anggaplah bahwa vTaskA mengeksekusi terlebih
dahulu. Secara keseluruhan ia memeriksa apakah mutex tersedia. Jika ya, vTaskA menjalankan kodenya. Jika tidak, penundaan penundaan ditentukan oleh
portMAX DELAY sebelum mengevaluasi kondisinya lagi. Potongan kode ini mencegah vTaskA dan vTaskB mengakses globalVariable bersama-sama. Kami
sekarang siap untuk menjelaskan keseluruhan kode sumber aplikasi demo (lihat lampiran untuk kode sumber aplikasi). Tujuan dari bagian ini bukan untuk
menjelaskan baris demi baris kode sumber tapi untuk menjelaskan apa tugasnya, fungsinya.
setup()
1. Inisialisasi komunikasi serial (atur baud rate pada 9600 bit / s). 2. Tetapkan pin digital yang ditentukan untuk berperilaku sebagai keluaran (digunakan untuk
logika Penganalisis). 3. Kurangi pembagi clock ADC dari 128 menjadi 16 (tingkatkan kecepatan konversi). 4. Tentukan referensi analog pada pin eksternal
(AREF). 5. Buat task yang berbeda. 6. Inisialisasi dua mutex, digunakan untuk suhu dan luminositas Variabel.
Luminositas dan pengukuran suhu 1. Verifikasi apakah mutex tidak digunakan. 2. Lakukan konversi analog ke digital pada pin yang benar yang terkait dengan
yang sensor benar dan tetapkan nilai konversi ini variabel global yang benar. 3. Lepaskan mutex. 4. Tunggu minimal 10 ms, sebelum menjalankan tugas lagi.
Listing 4 menunjukkan pengukuran sensor luminositas.
OPTICAL SWITCH 1. Periksa keadaan saklar optik 2. Jika ON, mengirim pesan kesalahan ke komputer dan beri nilai "true" ke Variabel global yang terkait
dengan saklar optik. 3. Jika OFF, berikan nilai "false" ke variabel global. 4. Tunggu minimal 10ms, sebelum menjalankan task lagi.
Dalam tugas ini, saya secara tegas menghilangkan penggunaan mutex untuk menggambarkan sebuah task tanpa itu. BAWAH LIST OPTICAL SWITCH
3. Bekukan aplikasi untuk 3s. 4. Tunggu 5ms, sebelum menjalankan task lagi. Berikut dibawah programnya
3.5 Hasil
Kini setelah aplikasi demonstrasi dirancang, kami harus memeriksa apakah hasilnya sesuai harapan. Untuk melakukannya, kami akan menggunakan penganalisis
logika dan fitur jejak dari FreeRTOS untuk mengumpulkan informasi tentang Running task (ini akan menetapkan pin digital tertentu untuk setiap task pada
tingkat logika 1 saat spesifik running task). Data yang diberikan oleh penganalisis logika ditunjukkan pada gambar 8 dan 9. Kami mengamati bahwa hasilnya
adalah yang kami harapkan. Gambar 8, task D memiliki mutex dan sampai tugas memberi task mutex kembali bahkan dengan prioritas yang lebih tinggi dijeda. Di
sisi lain, saat kita tidak menggunakan mutex's, tugas D dijeda sampai tugas C selesai. Efek terakhir ini ditunjukkan pada garis waktu pada gambar 9, dan
divisualisasikan pada gambar 10. Pesan informasi dari tugas D dijeda, pesan kesalahan dikirim, dan kemudian akhir pesan tiba. Tingkat prioritas ini juga diamati
saat komputer pribadi mengirim ke Arduino miliknya. Semua sistem dijeda selama 3 detik. Untungnya, kita melihat hasil bahwa perancangan sistem melakukan
apa yang diharapkannya. Ini sangat sesuai dengan teori penjadwal preemptif yang diprioritaskan.
Tugas A, melakukan konversi analog ke digital untuk membaca nilai fotoresistor.
Tugas D, Mengirimkan semua informasi diatas ke monitor USB (Serial monitor), setiap 1s
(jika dln 1s tidak ada informasi terkirim sistem dianggap error
Tugas E, memeriksa input Komputer melalui serial USB. Jika ada input maka aplikasi akan
menghitung selama 15ms