Makalah Real Time Operating System Dengan Free RTOS

download Makalah Real Time Operating System Dengan Free RTOS

of 10

description

www.digizoneku.comI. PengantarFreeRTOS adalah suatu real-time operating system untuk perangkat embedded yang di-porting ke beberapa mikrokontroler. FreeRTOS didistribusikan di bawah General Public License (GPL, digunakan untuk lisensi software gratis) dengan pengecualian optional (optional exception). Exception mengizinkan kode proprietary untuk tetap menutup source-nya sambil melakukan maintenance di kernel sebagai open source, sehingga memudahkan penggunaan FreeRTOS dalam aplikasi proprietaN.B- Info cara mencegah dan mengobati berbagai penyakit (www.herbanesia.com)- info cara tambah tinggi badan, max usia 35th (www.smarttaller.com)- info cara turun berat badan (www.dietsehat911.com)- layanan internet cepat tanpa batas, tanpa quota, full speed 24/7 (www.digizoneku.com)- agen pulsa murah all operator (www.digizonecell.com)

Transcript of Makalah Real Time Operating System Dengan Free RTOS

www.digizoneku.com

I. PengantarFreeRTOS adalah suatu real-time operating system untuk perangkat embedded yang di-porting ke beberapa mikrokontroler. FreeRTOS didistribusikan di bawah General Public License (GPL, digunakan untuk lisensi software gratis) dengan pengecualian optional (optional exception). Exception mengizinkan kode proprietary untuk tetap menutup source-nya sambil melakukan maintenance di kernel sebagai open source, sehingga memudahkan penggunaan FreeRTOS dalam aplikasi proprietary. FreeRTOS dirancang untuk menjadi kecil dan sederhana. Tipe kernel FreeRTOS adalah Mikrokernel, yang lebih sederhana dan memiliki kinerja yang berbeda dengan tipe kernel pada umumnya (tipe kernel monolitik). Kernelnya hanya terdiri dari tiga atau empat file dalam bahasa C. Ditulis dalam bahasa C adalah untuk membuat kode mudah dibaca, mudah untuk I/O ke port, dan di-maintain, tetapi ada beberapa fungsi assembler dimasukkan jika diperlukan (kebanyakan dalam arsitektur rutinitas scheduler tertentu).

Keunggulan-keunggulan FreeRTOS: Kecil dan sederhana Penjadwalan (scheduler) bisa dikonfigurasi untuk operasi preemptive dan cooperative Co-routine dalam FreeRTOS sangat sederhana dan memiliki stack untuk task ringan yang terbatas

II. MikrokernelKernel adalah komponen pusat (core) dalam suatu sistem operasi yang digunakan sebagai jembatan penghubung antara aplikasi (di level user) dan data asli yang diproses di level hardware. Sedangkan mikrokernel adalah software dengan jumlah hampir minimum yang bisa menyediakan mekanisme yang dibutuhkan untuk mengimplementasikan suatu sistem operasi. Mekanisme minimal dari sistem operasi adalah low-level address space management, thread management, and inter-process communication (I.P.C). Selain itu, microkernel juga mendukung device drivers, protocol stacks, file systems, dan user interface code yang bisa berjalan di level user. Untuk masalah kinerja, masih belum ada perbandingan yang komprehensif antara microkernel dengan monolitik kernel (kernel pada umumnya). Bahkan sejumlah developer multi-server komersial seperti real-time systems QNX and Integrity pun masih belum melakukan perbandingan yang komprehensif. Kelebihan yang paling ditonjolkan mikrokernel adalah sederhana, sehingga memudahkan pemula.

Gambar 1. Perbedaan sistem monolitik dengan mikrokernel

Bimo Adi Pradono (31045)

www.digizoneku.com

III. Karakteristik Task dan Co-routine Dalam FreeRTOSKinerja dari suatu sistem operasi ditentukan dari kemampuannya untuk me-manage task dan co-routine. Aplikasi bisa didesain dengan tasks saja, co-routines saja, atau gabungan keduanya. Akan tetapi, task dan co-routine menggunakan API yang berbeda sehingga queue (atau semaphore) tidak bisa digunakan untuk mengirim data dari task ke co-routine. Co-routine hanya digunakan oleh sistem operasi yang dijalankan dengan RAM yang sangat terbatas.

III.1.TaskIII.1.1.Status TaskTask bisa ada di salah satu dari status berikut:

a) RunningKetika suatu task dijalankan, ia dalam keadaan Running (jalan).

b) ReadyReady task (task untuk siap/ready) adalah yang mampu mengeksekusi (tidak di-blok atau di-suspend), tetapi tidak benar-benar mengeksekusi karena task berbeda dari prioritas yang lebih tinggi atau yang sama sudah dalam keadaan Running.

c) BlockedSuatu task dikatakan dalam keadaan di-blok (Blocked) apabila sedang menunggu event sementara atau event luar. Contoh, jika suatu task bernama vTaskDelay() di-blok (dibuat dalam keadaan Blocked) sampai periode delay sudah lewat / kadaluwarsa (timeout).

d) SuspendedTask dalam keadaan Suspended tidak tampak pada penjadwalan (scheduling). Task hanya akan masuk atau keluar dari keadaan suspended ketika diperintahkan secara eksplisit untuk melewati vTaskSuspend() dan menjalankan xTaskResume(). Periode timeout tidak dapat ditentukan.

Gambar 2. Hubungan Task State

Bimo Adi Pradono (31045)

www.digizoneku.com

III.1.2.Prioritas TaskSetiap task ditandai dengan prioritas dari 0 sampai (configMAX_PRIORITIES - 1). configMAX_PRIORITIES didefinisikan di dalam FreeRTOSConfig.h dan bisa di-set pada aplikasi melalui basis aplikasi. Semakin tinggi nilai yang diberikan ke configMAX_PRIORITIES, semakin besar RAM dipakai oleh kernel FreeRTOS. Jumlah prioritas yang rendah menandakan task dengan prioritas rendah. Tandanya dengan mengubah nilai default idle priority ke nilai 0 (didefinisikan oleh tskIDLE_PRIORITY). Penjadwalan (scheduler) akan memastikan bahwa task dalam keadaan ready atau running dan akan selalu memberi nilai kondisi pada waktu prosesor (processor time) bahwa task dengan prioritas yang lebih rendah akan diberi status ready. Dengan kata lain, task dengan prioritas tertinggi yang diberikan pada waktu prosesor akan selalu dijalankan (running).

III.1.3.Implementasi TaskTask harus memiliki struktur berikut:void vATaskFunction( void *pvParameters ) { for( ;; ) { -- Aplikasi kode Task ditulis di sini. -} }

pdTASK_CODE didefinisikan sebagai fungsi yang mengembalikan void dan mengambil void pointer sebagai parameter satu-satunya. Semua fungsi yang mengimplementasikan suatu task harus bertipe seperti struktur di atas. Parameter digunakan untuk mengirim informasi dari beberapa tipe task. Fungsi task harus tidak pernah kembali sehingga implementasinya pada loop tak terbatas. Task dibuat dengan memanggil xTaskCreate() and deleted by calling vTaskDelete().

III.1.4. Idle TaskIdle task dibuat secara otomatis ketika dimulai. Idle task bertangung jawab untuk membersihkan memori yang dialokasikan RTOS ke task. Sehingga penggunaan fungsi vTaskDelete() itu sangat penting untuk memastikan idle task tidak menghabiskan processing time.

III.1.5. Idle Task HookIdle task hook adalah sebuah fungsi yang dipanggil selama tiap putaran dari idle task. Ada 2 pilihan supaya fungsi aplikasi bisa berjalan pada prioritas idle: a) Mengimplementasikan fungsi di dalam idle task hook. Setidaknya harus ada satu task yang siap untuk dijalankan karena fungsi dari hook yang tidak memanggil fungsi-fungsi API bisa membuat task-nya di-blok (vTaskDelay() diperbolehkan untuk mem-blok co-routines selama fungsi hook berjalan). b) Membuat prioritas idle untuk mengimplementasi fungsi. Solusi ini lebih fleksibel, tapi membutuhkan RAM yang lebih tinggi. Idle hook biasanya digunakan untuk membuat processor masuk ke dalam status mode power saving.

Kesimpulan Task:1. 2. 3. 4. 5. 6. Sederhana. Tidak ada pembatasan penggunaan. Supports full preemption. Sangat diprioritaskan. Tiap task di-maintain sendiri sehingga memakan banyak RAM. Re-entrancy harus hati-hati terutama jika menggunakan preemption.

III.2.Co-RoutinesIII.2.1.Status Co-RoutineCo-routine bisa ada di salah satu dari status berikut:

Bimo Adi Pradono (31045)

www.digizoneku.coma) RunningKetika co-routine sedang dieksekusi, ia berada dalam keadaan Running.

b) ReadyReady co-routine(co-routine untuk siap) adalah yang bisa mengeksekusi (tidak di-blok atau di-suspend), tetapi tidak benar-benar mengeksekusi. Suatu co-routine berada dalam keadaan Ready karena: Co-routine yang lain dengan prioritas sama atau lebih tinggi sudah berada dalam keadaan Running, atau Suatu task sudah dalam keadaan Running

c) BlockedSuatu task dikatakan dalam keadaan di-blok (Blocked) apabila sedang menunggu event sementara atau event luar. Contoh, jika suatu co-routine bernama crDELAY() dipanggil, maka akan memblokir (dibuat dalam keadaan Blocked) sampai periode delay lewat / kadaluwarsa (timeout), disebut sebagai event sementara. Coroutine yang di-blok tidak tersedia untuk penjadwalan.

Gambar 3. Hubungan Co-Routine State

III.2.2.Prioritas Co-RoutineTiap co-routine ditandai dengan prioritas dari 0 sampai (configMAX_CO_ROUTINE_PRIORITIES - 1). configMAX_CO_ROUTINE_PRIORITIES didefinisikan di dalam FreeRTOSConfig.h dan bisa di-set pada suatu aplikasi oleh basis aplikasi. Semakin tinggi nilai yang diberikan configMAX_CO_ROUTINE_PRIORITIES, maka semakin banyak RAM FreeRTOS kernel yang dimakan. Angka prioritas yang rendah menunjukkan prioritas co-routine yang rendah. Prioritas co-routine hanya dengan co-routine yang lain karena task akan selalu mengambil prioritas di atas co-routines.

III.2.3.Implementasi Co-RoutineCo-routine harus mempunyai struktur berikut:void vACoRoutineFunction( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) { crSTART( xHandle ); for( ;; ) { -- Aplikasi kode Co-routine ditulis di sini. -} crEND(); }

crCOROUTINE_CODE didefinisikan sebagai fungsi yang mengembalikan void, mengambil xCoRoutineHandle, dan suatu index sebagai parameternya. Co-routines dibuat dengan memanggil xCoRoutineCreate(). Catatan penting: Semua fungsi co-routine harus dimulai dengan panggilan ke crSTART().

Bimo Adi Pradono (31045)

www.digizoneku.com Semua fungsi co-routine harus diakhiri dengan panggilan ke crEND(). Fungsi co-routine harus tidak kembali, diimplementasikan sebagai loop tak terbatas. Beberapa co-routines bisa dibuat dari satu fungsi co-routine.

3.Scheduling Co-RoutinesCo-routines dijadwalkan oleh pemanggilan berulang ke vCoRoutineSchedule(). Tempat terbaik untuk memanggil vCoRoutineSchedule() adalah dari idle task hook. Dengan begini, jika aplikasinya hanya menggunakan coroutines sebagai idle task, maka akan tetap dibuat secara otomatis ketika penjadwalan dimulai.

5.Limitations and RestrictionsKeuntungan dari co-routines adalah penggunaan RAM yang lebih rendah jika dibandingkan dengan task yang setara ketika akan digunakan. Co-routines lebih strict dan rumit untuk digunakan daripada task. Untuk lebih jelasnya, co-routine memiliki fasilitas-fasilitas:

a) Sharing a stackStack pada co-routine tidak di-maintain ketika co-routine di-blok. Artinya, variabel yang dialokasikan pada stack kemungkinan besar akan kehilangan nilainya. Untuk mengatasi masalah ini, suatu variable yang harus di-maintain nilainya ketika melalui pemanggilan blocking, harus dideklarasikan sebagai static. Contoh:void vACoRoutineFunction( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) { static char c = 'a'; // Co-routine harus dimulai dengan panggilan ke crSTART(). crSTART( xHandle ); for( ;; ) { // set c = 'b' c = 'b'; // ... membuat blocking call ... crDELAY( xHandle, 10 ); // ... c hanya akan dijaga untuk tetap // sama dengan 'b' (dideklarasikan static) } // Co-routine harus diakhiri dengan panggilan ke crEND(). crEND(); }

Konsekuensi lain dalam sharing stack adalah panggilan ke fungsi-fungsi API yang bisa membuat co-routine mem-blok hanya bisa dibuat dari fungsi co-routine sendiri, bukan dari fungsi yang dipanggil oleh co-routine. Contoh:void vACoRoutineFunction( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) { // Co-routine harus dimulai dengan panggilan ke crSTART crSTART( xHandle ); for( ;; ) { // membuat blocking call, crDELAY( xHandle, 10 ); // tapi a blocking call tidak dibuat di vACalledFunction(). vACalledFunction(); } // Co-routine harus diakhiri dengan panggilan ke crEND(). crEND(); }

Bimo Adi Pradono (31045)

www.digizoneku.comvoid vACalledFunction( void ) { // tidak bisa membuat blocking call di sini! }

b) Use of switch statementsImplementasi dari default co-routine yang termasuk di dalam FreeRTOS, tidak mengizinkan panggilan untuk blocking dibuat dari statement switch. Contoh:void vACoRoutineFunction( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) { // Co-routine harus dimulai dengan panggilan ke crSTART crSTART( xHandle ); for( ;; ) { // membuat blocking call di sini, crDELAY( xHandle, 10 ); switch( aVariable ) { case 1 : // Tidak bisa membuat blocking call! break; default: } } // Co-routine harus diakhiri dengan panggilan ke crEND() crEND(); }

Kesimpulan Co-routine:1. 2. 3. 4. Penggunaan stack di-share dalam penggunaan RAM yang jauh lebih kecil. Operasi kerja sama (cooperative) mengurangi beban re-entrance. Sangat portable untuk antar arsitektur. Sangat relatif diprioritaskan (tergantung dengan co-routine yang lain), tapi bisa selalu di-preempt dengan task jika sistemnyam menggunakan task dan co-routine. 5. Kurang stack. 6. Terbatas pada di mana panggilan API bisa dibuat. 7. Operasi kerja sama hanya antar co-routine saja.

IV. MultitaskingSistem operasi seperti Linux memiliki kernel yang mengizinkan user untuk mengakses ke komputer secara simultan. Banyak program (multiple programs) bisa dieksekusi oleh banyak user (multiple users) secara real dan bersamaan. Setiap program yang dieksekusi merupakan suatu task yang berada di bawah kendali sistem operasi. Jika sistem operasi bisa mengeksekusi banyak task dalam cara seperti kernel pada linux disebut dengan multitasking. Manfaat sistem operasi yang mendukung multitasking: Multitasking dan komunikasi inter-task membuat sistem operasi dapat mem-partisi aplikasi rumit ke dalam sutu set task yang lebih kecil dan lebih mudah di-manage. Partisi dengan cara tersebut membuat software testing jadi lebih mudah, rincian kerja dikelompokkan, dan code reuse. Timing yang rumit dan detail urutan bisa dihilangkan dari kode aplikasi dan menjadi tanggung jawab sistem operasi. Prosesor konvensional hanya dapat mengeksekusi satu task dalam satu waktu, tapi sistem operasi dengan multitasking bisa membuat terlihat seolah-olah tiap task dieksekusi secara konkuren dengan cara pergantian cepat antar task. Untuk lebih mudahnya perhatikan gambar berikut.

Bimo Adi Pradono (31045)

www.digizoneku.com

Gambar 4. Proses Sistem Konvensional (atas) dan Multitasking (bawah)

Gambar di atas menjelaskan sistem multitasking yang mengakali kinerja prosesor konvensional. Pada gambar pertama eksekusi task dilakukan satu per satu waktu karena semua task ditampilkan (tidak dipartisi). Sedangkan pada gambar kedua, terlihat hanya memanggil satu task hasil dari partisi aplikasi sehingga seolah-olah terlihat bahwa 3 task berbeda bisa muncul dalam waktu yang sama.

V. SchedulerPenjadwalan (scheduler) adalah bagian dari kernel yang bertanggung jawab untuk menentukan task yang mana yang harus dieksekusi dalam waktu tertentu. Kernel bisa men-suspend dan kemudian me-resume suatu task beberapa kali selama task-nya masih hidup (dalam jangka task lifetime). Kebijakan penjadwalan (scheduling policy) adalah algoritma yang digunakan oleh scheduler untuk menentukan task yang mana yang perlu dieksekusi dalam waktu yang ditentukan. Kebijakan dari sistem multi user (non real time) akan mengizinkan setiap task memperoleh bagian waktu prosesor (prosesor time) yang fair / adil Selain itu, task juga bisa memilih untuk men-suspend dirinya sendiri, tanpa diminta oleh kernel RTOS. Task akan menjalankan suspend sendiri apabila berada dalam kondisi di mana ingin delay (sleep) dalam jangka waktu yang sudah ditentukan atau menunggu/wait (block). Dalam kondisi menunggu supaya resource tersedia (contoh: serial port) atau munculnya suatu event (misal user menekan tombol). Task yang di-blok tidak bisa dieksekusi dan tidak dialokasikan waktu pemrosesannya.

Gambar 5. Suspending

Referring to the numbers in the diagram above:

Bimo Adi Pradono (31045)

www.digizoneku.com Pada no (1) task 1 sedang dieksekusi. Pada no (2) kernel men-suspend task 1 dan pada no (3) me-resume task 2. Ketika task 2 dieksekusi (no. 4), mengunci peripheral prosesor untuk akses eksklusifnya sendiri. Pada no (5) kernel men-suspend task 2 dan pada no (6) me-resume task 3. Task 3 mencoba untuk mengakses peripheral prosesor yang sama, tapi tidak bisa melanjutkan karena sudah terkunci sehingga task 3 tidak bisa men-suspend dirinya (pada no 7). Pada no (8) kernel me-resume task 1. dan seterusnya. Selanjutnya ketika task 2 dieksekusi (pada no 9), lalu membuka kunci (unlock) peripheral prosesornya. Selanjutnya ketika task 3 dieksekusi (pada no 10), akan membaca bahwa sekarang bisa mengakses peripheral prosesor dan akan terus dieksekusi sampai di-suspend oleh kernel.

VI. Context SwitchingKetika task dieksekusi maka ia akan menggunakan register prosesor / mikrokontroler dan mengakses RAM dan ROM, sama seperti program yang lainnya. These resources together (the processor registers, stack, etc.) comprise the task execution context. Task merupakan bagian dari kode sequential. Task tidak tahu kapan ia akan di-suspend atau di-resume oleh kernel dan bahkan tidak tahu kapan hal tersebut terjadi. Consider the example of a task being suspended immediately before executing an instruction that sums the values contained within two processor registers.

Gambar 6. Context Switching

Bimo Adi Pradono (31045)

www.digizoneku.comKetika task di-suspend, task yang lain akan dieksekusi dan mungkin akan memodifikasi nilai register prosesor. Task tidak akan tahu register prosesor sudah diubah. Jika task yang di-suspend tersebut menggunakan nilai register yang sudah berubah, maka penjumlahan akan menghasilkan nilai yang salah. Untuk mencegah tipe error seperti ini, perlu menggunakan lagi task yang memiliki context yang identik pada waktu sebelum di-suspend. Kernel sistem operasi bertanggung jawab memastikan hal tersebut dan menyimpan data context dari task yang di-suspend. Ketika task di-resume, context yang sudah disimpan tersebut akan di-restore oleh kernel sistem operasi sebelum dieksekusi. Proses menyimpan context dari task yang di-suspend dan me-restore context dari task tersebut ketika di-resume, disebut dengan context switching.

VII. Real Time ApplicationsKebanyakan real time operating systems (RTOS's) mempunyai multitasking dengan menggunakan prinsip yang sama, tapi tujuannya sangat berbeda dibandingkan dengan yang bukan sistem operasi real time. Tujuannya yang berbeda itu bisa terlihat dalam kebijakan penjadwalan (scheduling policy). Sistem real time / sistem tertanam (embedded) didesain untuk menyediakan respon dalam waktu yang sesuai dengan kejadian dalam dunia nyata. Kejadian-kejadian yang terjadi di dunia nyata bisa saja mempunyai deadline kerja sebelum sistem real time / sistem tertanam dapat merespon, sehingga kebijakan penjadwalan RTOS harus memastikan deadline dari kebutuhan dunia nyata dan respon sistem real time-nya sesuai. Untuk mencapai hal ini, software engineer harus menentukan prioritas pada tiap task. Kebijakan penjadwalan dari RTOS untuk memastikan bahwa prioritas tertinggi dari task yang bisa dieksekusi adalah waktu pemrosesan yang dibutuhkan untuk mengeksekusi suatu task. This may require sharing processing time "fairly" between tasks of equal priority if they are ready to run simultaneously. Contoh: Key Handler Task Contoh paling dasar adalah sistem real time yang menggunakan keypad dan LCD. User harus memperoleh feedback yang bisa dilihat pada LCD dari setiap tombol yang ditekan dalam periode yang baik. Jika user tidak bisa melihat bahwa tombol yang ditekan sudah diterima dalam periode waktu tersebut, maka software tersebut menjadi tidak nyaman untuk digunakan. Kalau waktu terlama yang bisa ditolerir adalah 100ms, maka respon antara 0-100ms masih bisa diterima. Fungsi ini bisa diimplementasikan sebagai task otomatis dengan struktur: void vKeyHandlerTask( void *pvParameters ) { for( ;; ) { [Suspend, menunggu tombol ditekan] [Memproses tombol yang ditekan] } } Sekarang asumsikan sistem real time juga menguji kinerja fungsi kendali yang inputnya dari filter digital. Inputnya harus berupa sampel, difilter, dan putaran kendali harus dieksekusi setiap 2ms. Sampel yang sudah difilter untuk operasi yang benar harus akurat sampai 0,5ms. Fungsi ini bisa diimplementasikan sebagai task otomatis dengan struktur: void vControlTask( void *pvParameters ) { for( ;; ) { [Suspend, menunggu 2ms dari putaran sebelumnya] [Sample input-nya] [Filter input yang sudah disampel] [Perform control algoritma] [Output hasil] } }

Bimo Adi Pradono (31045)

www.digizoneku.comSoftware engineer harus memastikan bahwa prioritas teringgi control task adalah: 1. Deadline untuk pengendalian task (task control) itu lebih strict daripada key handling task. 2. Konsekuensi kesalahan pada deadline itu lebih besar pada pengendalian task daripada key handler task.

VIII. Real Time SchedulingGambar di bawah mendemonstrasikan tentang bagaimana task yang didefinisikan sebelumnya akan dijadwal oleh sistem opreasi real time. RTOS membuat idle task yang akan dieksekusi hanya ketika tidak ada task yang bisa dijalankan. RTOS idle task selalu berada dalam keadaan di mana ia bisa dieksekusi.

Gambar 7. Proses Key Handler Task

Keterangan gambar di atas: Pada awalnya tidak ada task yang bisa berjalan (run). vControlTask sedang menunggu waktu yang tepat untuk memulai perputaran pengendalian (control cycle) yang baru dan vKeyHandlerTask sedang menunggu tombol untuk ditekan. Waktu prosesor (processor time) memberi RTOS idle task. Pada waktu t1, tombol ditekan. vKeyHandlerTask sekarang bisa dieksekusi dan memiliki prioritas yang lebih tingi disbanding RTOS idle task. Pada waktu t2, vKeyHandlerTask sudah selesai memproses tombolnya dan meng-update LCD. Update-nya bisa lanjut sampai tombol yang lain ditekan. Lalu, ia akan men-suspend dirinya sendiri dan RTOS idle task akan diresume lagi. Pada waktu t3, timer event mengindikasi bahwa sudah waktunya untuk perform control cycle selanjutnya. vControlTask bisa dieksekusi execute dan langsung memiliki prioritas tertinggi dalam penjadwalan waktu prosesor. Antara waktu t3 dan t4, ketika vControlTask masih dieksekusi, tombol ditekan. vKeyHandlerTask sekarang bisa dieksekusi, tapi mempunyai prioritas yang lebih rendah dibanding vControlTask, jadi ia tidak dijadwalkan pada waktu prosesor. Pada t4, vControlTask menyelesaikan proses control cycle dan tidak bisa restart sampai timer event selanjutnya, ia men-suspend dirinya sendiri. vKeyHandlerTask sekarang adalah task dengan prioritas tertinggi yang bisa berjalan sehingga dijadwalkan pada waktu prosesor supaya memproses tombol yang ditekan sebelumnya. Pada t5, tombol yang ditekan sudah diproses dan vKeyHandlerTask men-suspend dirinya untuk menunggu key event selanjutnya. Lalu, task yang ada tidak bisa dieksekusi lagi dan RTOS idle task dijadwalkan di waktu prosesor (processor time). Antara t5 dan t6, timer event diproses, tapi tidak ada tombol yang ditekan. Tombol yang ditekan selanjutnya sudah terjadi (Pada waktu t6), tapi sebelum vKeyHandlerTask menyelesaikan pemrosesan tombolnya, timer event terjadi. Sekarang kedua task bisa dieksekusi. Karena vControlTask punya prioritas yang lebih tinggi dari vKeyHandlerTask, maka vKeyHandlerTask di-suspend sebelum menyelesaikan pemrosesan tombolnya dan vControlTask dijadwalkan di processor time. Pada t8, vControlTask menyelesaikan proses control cycle dan men-suspend dirinya untuk menunggu selanjutnya. Lagi, vKeyHandlerTask menjadi task dengan prioritas tertinggi yang bisa berjalan sehingga dijadwalkan di processor time. Sehingga proses tombol yang ditekan bisa diselesaikan.

Bimo Adi Pradono (31045)