Anda di halaman 1dari 3

Bekerja dengan FreeRTOS di platform Arduino mengharuskan kita untuk mengadopsi struktur lain

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.

Fungsi ini mengambil lima parameter (http://www.freertos.org):

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.

s t a t i c void vLuminosityTask ( void upvParameters )


{ vTaskSetApplicationTaskTag (NULL, ( char ( u) ( void u)) 1 ) ;
//Create mutex
while (1)
{ i f (xSemaphoreTake ( xSemaphoreLuminosity , portMAX DELAY == pdTRUE) )
{ luminosi ty = analogRead ( luminositySensorPin ) ;
xSemaphoreGive ( xSemaphoreLuminosity ) ;
} vTaskDelay ( configTICK RATE HZ/ 10 0) ; //10ms seconds waiting
}}

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

s t a t i c void vOpticalSwitchTask ( void upvParameters )


{ vTaskSetApplicationTaskTag (NULL, ( char ( u) ( void u ) ) 4 ) ;
while (1)
{ i f ( analogRead( opticalSwitchSensorPin ) > 50)
{ opt i c a lSwitch = true ;
Ser i a l . pr int ln ( Error ) ;
} 11 e l s e opticalSwitch = f a l s e ;
vTaskDelay ( configTICK RATE HZ/ 10 0) ; //10ms
}}
Mengirimkan informasi ke komputer pribadi 1. Verifikasi apakah kedua mutex untuk suhu dan luminositas tersedia. 2. Jika ya, kirim melalui serial semua
nilai variabel global (luminositas, suhu, Saklar optik) 3. Tunggu minimum 1s, sebelum menjalankan task lagi. Berikut programnya

s t a t i c void vSerial InfoTask ( void upvParameters ) { 2vTaskSetApplicationTaskTag (NULL, ( char ( u) ( void u ) ) 3 ) ;


while (1) { i f (xSemaphoreTake ( xSemaphoreLuminosity , portMAX DELAY == pdTRUE)
and xSemaphoreTake ( xSemaphoreTemperature ,portMAX DELAY == pdTRUE) )
{ 7 Ser i a l . pr int ( Luminosity : ) ;
Ser i a l . pr int ln ( luminosity ) ;
Ser i a l . pr int (Temperature : ) ;
Ser i a l . pr int ln ( temperature ) ;
Ser i a l . pr int (Optical switch : ) ;
Ser i a l . pr int ln ( opticalSwitch ) ;
xSemaphoreGive ( xSemaphoreLuminosity ) ;
xSemaphoreGive ( xSemaphoreTemperature ) ;
} vTaskDelay ( configTICK RATE HZ ) ;
}}
Menerima informasi dari komputer pribadi 1. Periksa apakah komunikasi serial tersedia. 2. Periksa apakah pesan berhenti diterima (karakter s).

3. Bekukan aplikasi untuk 3s. 4. Tunggu 5ms, sebelum menjalankan task lagi. Berikut dibawah programnya

s t a t i c void vSerialMsgCheck ( void upvParameters )


{ vTaskSetApplicationTaskTag (NULL, ( char ( u) ( void u ) ) 5 ) ;
while (1) { 5 i f ( Se r ial . avai lable () > 0)
{ 7 i f ( Se r ial . read () == s )
{ delay (3000) ; //Force waiting 1 second
} } vTaskDelay ( configTICK RATE HZ/ 20 0) ; //5ms
}}

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 B, melakukan konversi analog ke digital untuk membaca nilai termistor.

Tugas C, Sensor switch sensor cahaya, digital input

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

Anda mungkin juga menyukai