SINOPSIS
Melanjutkan artikel sebelumnya, apa yang akan dibahas kali ini adalah solusi preemptive multitasking murni atau tradisionil. Menggunakan layanan RTOS secara penuh, tidak peduli efek yang diakibatkan (memori yang rakus maupun beban kerja prosesor yg berat dan seterusnya). Ada partisi sederhana dari fungsi yang dibutuhkan untuk sejumlah tugas otonom.
APAKAH PREEMPTIVE MULTITASKING ITU?
Preemptive multitasking adalah suatu tugas atau task dimana sebuah sistem operasi menggunakan beberapa kriteria untuk menentukan berapa lama suatu tugas/task dijalankan atau mendapatkan alokasi CPU atau menggunakan sistem operasi tersebut, sebelum kemudian CPU mengerjakan tugas lain atau selanjutnya.
- Aksi mengambil alih sistem operasi dari suatu tugas dan kemudian memberikan ke tugas yang lain disebut sebagai preempting.
- Suatu kriteria umum dalam proses preempting menggunakan elapsed time sederhana (sistem semacam ini sering disebut menggunakan time sharing atau time slicing).
- Dalam beberapa sistem operasi, beberapa aplikasi diberi prioritas lebih tinggi dari aplikasi lainnya, dengan demikian, program aplikasi atau tugas tersebut bisa mendapatkan potongan waktu yang lebih panjang.
IMPLEMENTASI
- Tugas-tugas akan diblokir hingga ada suatu kejadian atau event yang membutuhkan tugas tersebut…
- Even-even atau kejadian tersebut bisa ekternal (ada tombol yang ditekan dan lain sebagainya) atau internal (habis waktunya atau timeout dan lain sebagainya)…
- Prioritas ditetapkan untuk masing-masing tugas tersebut, terkait dengan kebutuhan pewaktuannya…
- Kebutuhan waktu yang ketat memiliki prioritas tertinggi!
CARA KERJA (OPERASIONAL)
- Tugas dengan prioritas tertinggi yang bisa di-eksekusi (tidak diblokir) adalah tugas yang dijamin oleh RTOS memperoleh waktu prosesor…
- Kernel akan segera menangguhkan tugas yang sedang dikerjakan jika dijumpai adanya permintaan tugas yang prioritasnya lebih tinggi.
- Penjadwalan ini terjadi secara otomatis, tanpa pengetahuan eksplisit, penataan atau perintah dalam kode sumber aplikasi.
- Menjadi tanggung jawab para perancang aplikasi untuk memastikan bahwa tugas dialokasikan dengan prioritas yang tepat.
- Saat tidak ada tugas yang di-eksekusi maka kondisi-nya idle.
- Tugas idle bisa digunakan untuk menempatkan prosesor dalam kondisi mode power save!
KONFIGURASI PENJADWALAN
- Penjadwal dikonfigurasi untuk operasi preemptive!
- Frekuensi tick kernel harus diatur serendah mungkin untuk menyediakan granularitas waktu yang dibutuhkan!
Plant Control Task
- Tugas/Task ini mengimplementasikan semua fungsionalitas kontrol.
- Memiliki persyaratan pewaktuan yang kritis sehingga diberikan prioritas tertinggi dalam sistem!
#define CYCLE_RATE_MS 10 // granularitas pewaktuan 10 milidetik #define MAX_COMMS_DELAY 2 void PlantControlTask( void *pvParameters ) { portTickType xLastWakeTime; DataType Data1, Data2; InitialiseTheQueue(); // A xLastWakeTime = xTaskGetTickCount(); // B for( ;; ) { // C vTaskDelayUntil( &xLastWakeTime, CYCLE_RATE_MS ); // Request data from the sensors. TransmitRequest(); // D if( xQueueReceive( xFieldBusQueue, &Data1, MAX_COMMS_DELAY ) ) { // E if( xQueueReceive( xFieldBusQueue, &Data2, MAX_COMMS_DELAY ) ) { PerformControlAlgorithm(); TransmitResults(); } } } // Will never get here! }
Embedded WEB Server Task
Perhatikan potongan program berikut…
void WebServerTask( void *pvParameters ) { DataTypeA Data; for( ;; ) { // Block until data arrives. xEthernetQueue is filled by the // Ethernet interrupt service routine. if( xQueueReceive( xEthernetQueue, &Data, MAX_DELAY ) ) { ProcessHTTPData( Data ); } } }
RS232 Interface Task
Perhatikan potongan program berikut…
void RS232Task( void *pvParameters ) { DataTypeB Data; for( ;; ) { // Block until data arrives. xRS232Queue is filled by the // RS232 interrupt service routine. if( xQueueReceive( xRS232Queue, &Data, MAX_DELAY ) ) { ProcessSerialCharacters( Data ); } } }
Keypad Scanning Task
- Merupakan tugas yang sederhana.
- Prioritas-nya medium karena persyaratan pewaktuannya sama seperti tugas RSR232.
- Waktu siklus diatur lebih cepat dari yang dibutuhkan.
- Hal ini dilakukan karena bisa jadi task ini tidak mendapatkan kesempatan waktu prosesor saat diperlukan, dan sekali dijalankan dapat di-tendang (preempted) oleh task plant control.
- Jika pewaktuan sistem secara keseluruhan sedemikian hingga tugas ini mendapatkan prioritas terendah, maka pemanggilan vTaskDelayUntil() dapat dihilangkan sekalian.
- Sehingga fungsi ini akan dijalankan terus menerus saat semua tugas dengan prioritas tertinggi sedang diblok..
#define DELAY_PERIOD 4 void KeyScanTask( void *pvParmeters ) { char Key; portTickType xLastWakeTime; xLastWakeTime = xTaskGetTickCount(); for( ;; ) { // Wait for the next cycle. vTaskDelayUntil( &xLastWakeTime, DELAY_PERIOD ); // Scan the keyboard. if( KeyPressed( &Key ) ) { UpdateDisplay( Key ); } } }
LED Task
Perhatikan potongan program berikut…
#define DELAY_PERIOD 1000 void LEDTask( void *pvParmeters ) { portTickType xLastWakeTime; xLastWakeTime = xTaskGetTickCount(); for( ;; ) { // Wait for the next cycle. vTaskDelayUntil( &xLastWakeTime, DELAY_PERIOD ); // Flash the appropriate LED. if( SystemIsHealthy() ) { FlashLED( GREEN ); } else { FlashLED( RED ); } } }
EVALUASI
- Kelebihan
- Rancangannya sederhana, tersegmentasi, fleksibel dan dapat dijaga hanya dengan sedikit ketergantungan.
- Utilisasi prosesor dilakukan secara otomatis, berpindah-pindah dari satu tugas ke tugas yang lain berdasarkan kepentingan tanpa perlu adanya perintah secara eksplisit dari kode sumber program aplikasi yang bersangkutan.
- Struktur yang dikontrol kejadian seperti ini, akan memastikan tidak waktu CPU yang terbuang percuma untuk menunggu kejadian yang tidak pernah muncul. Pemrosesan hanya akan dilakukan jika memang ada tugas yang harus dikerjakan.
- Biasa
- Konsumsi daya bisa dikurangi jika tugas nganggur (idle task) menempatkan prosesor ke kondisi power save atau mode ‘tidur’, namun bisa juga boros jika interupsi tick membangunkan prosesor dengan sia-sia.
- Fungsionalitas kernel akan menggunakan sumber daya prosesor dan juga bergantung juga dengan frekuensi tick kernel yang dipilih.
- Kelemahan
- Solusi ini membutuhkan lebih banyak tugas, masing-masing membutuhkan memori stack-nya sendiri-sendiri dan banyak diantaranya membutuhkan suatu antrian dimana suatu kejadian bisa diterima. Dengan demikian solusi ini membutuhkan lebih banyak RAM atau memori.
- Semakin sering dilakukan context switching antar tugas yang memiliki prioritas yang sama akan memboroskan siklus prosesor itu sendiri.
KESIMPULAN
- Solusi yang BAIK: Selama tersedia RAM atau memori dan kapasitas pemrosesan (prosesor) yang memadai!
- Melakukan partisi suatu aplikasi menjadi beberapa tugas (task) serta menentukan prioritas pada masing-masing tugas tersebut perlu dilakukan dengan hati-hati!
[Bersambung]