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]

Tags: , ,

5 Responses to “Perancangan Aplikasi Real Time (3): Sistem Preemptive Penuh”

  1. Mungkin contoh untuk RTOS Preemptive ini adalah micrium uC/OS-II.

  2. TErimakasih banyak untuk mas Agfi untuk pencerahan mengenai Real Time OS ini.Sungguh sangat berguna sekali untuk saya yang awam dan sedang belajar tentang mikrokontroler.Saya harap dengan penjelasan ini,saya semakin bertambah pengetahuan dan wawasan.untuk itu saya ucapkan terimakasih banyak.

    saya tunggu untuk jilib berikutnya ya Mas Agfi :)

  3. Terima kasih Pak Agfi,,, dengan tambahan ilmunya di bidang elektro,,, khususnya pemrograman uC. Mungkin saya mau “pamer” sedikit, begini Pak. Saya dulu waktu Tugas Akhir (D3 UGM) pernah buat system pembuka pintu, apakah system yang saya buat sudah masuk dalam kategory multitasking, karena menurut saya itu sudah, akan tetapi mungkin berbeda menurut Pak Agfi yang sudah profesional alias mahir.

    Ceritanya, jadi pembuka pintu ini ada tombol, tampilan LCD, kartu pembuka, dan komunikasi serial. Semua kegiatan baca tombol, komunikasi kartu dan serial serta penampilan di LCD dilakukan berulang2 sesuai ada event saja. Saat awal jalan, program akan cek semua kondisi hardware, kemudian akan memberikan informasi versi firmware ke komputer. Lalu program akan memeriksa ada perintah dari komputer jika tidak maka langsung cek slot kartu, jika tidak ada kartu langsung ke awala lagi yaitu cek perintah dan sampai ada kartu. Begiru berulang terus menerus, tanpa meniadakan atau “melupakan” event yang akan masuk.

    Mohon penjelasannya Pak, apakah system saya ini sudah masuk dalam kategory multitasking, karena saya sudah terlanjur membuat istilah multitasking dalam laporan Tugas Akhir saya.

    terima kasih Pak Agfi,

    Nur Khasan (D3 UGM @ 2005 - 2009)

  4. maaf pak agfi, saya mau memberikan usul
    apakah pak agfi tidak punya keinginan untuk membuat buku tentang RTOS dan implementasinya, pembaca dapat ilmu pak agfi dapak pahala :)
    .

  5. Setelah kesana kemari cari artikel seputar preemptive multitasking, akhirnya nemu disini. Makasih banyak Pak ini sangat membantu buat saya. Sekali lagi terimakasih.

Leave a Reply

You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>