Anda di halaman 1dari 20

MAKALAH

REAL-TIME OPERATING SYSTEM


“FreeRTOS”

Disusun Guna Memenuhi Tugas Mata Kuliah Real Time Operating System

Disusun Oleh :
Tengku Kemal Yusron H (21120116120002)
Rio Julian Azis Pratama (21120116120011)
Favo Perdana H.S (21120116120015)
Usman Ralih Muis (21120116120020)
Alfian Aulia Firdaus (21120116130035)
Abda Rafi Hamaminata (21120116140053)
Rio Kisna Eka Putra (21120116130060)

DEPARTEMEN TEKNIK SISTEM KOMPUTER


FAKULTAS TEKNIK
UNIVERSITAS DIPONEGORO
SEMARANG
2017
I. PENGANTAR
FreeRTOS 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). Kernel- nya 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. MIKROKERNEL
Kernel 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


III. Karakteristik Task dan Co-routine Dalam FreeRTOS
Kinerja 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. Task
III.1.1. Status Task
Task bisa ada di salah satu dari status berikut:
a) Running
Ketika suatu task dijalankan, ia dalam keadaan Running (jalan).
b) Ready
Ready 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) Blocked
Suatu 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) Suspended
Task 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
III.1.2. Prioritas Task
Setiap 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 Task


Task 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 Task


Idle 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 Hook


Idle 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. Sederhana.
2. Tidak ada pembatasan penggunaan.
3. Supports full preemption.
4. Sangat diprioritaskan.
5. Tiap task di-maintain sendiri sehingga memakan banyak RAM.
6. Re-entrancy harus hati-hati terutama jika menggunakan preemption.

III.2. Co-Routines
III.2.1. Status Co-Routine
Co-routine bisa ada di salah satu dari status berikut:
a) Running
Ketika co-routine sedang dieksekusi, ia berada dalam keadaan Running.
b) Ready
Ready 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) Blocked
Suatu 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. Co- routine
yang di-blok tidak tersedia untuk penjadwalan.
Gambar 3. Hubungan Co-Routine State

III.2.2. Prioritas Co-Routine


Tiap 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-Routine


Co-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().
 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-Routines
Co-routines dijadwalkan oleh pemanggilan berulang ke vCoRoutineSchedule().
Tempat terbaik untuk memanggil vCoRoutineSchedule() adalah dari idle task hook. Dengan
begini, jika aplikasinya hanya menggunakan co- routines sebagai idle task, maka akan tetap
dibuat secara otomatis ketika penjadwalan dimulai.

5.Limitations and Restrictions


Keuntungan 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 stack
Stack 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();
}
void vACalledFunction( void )
{
// tidak bisa membuat blocking call di sini!
}

b) Use of switch statements


Implementasi 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. Penggunaan stack di-share dalam penggunaan RAM yang jauh lebih kecil.
2. Operasi kerja sama (cooperative) mengurangi beban re-entrance.
3. Sangat portable untuk antar arsitektur.
4. 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. Multitasking
Sistem 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.
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. Scheduler
Penjadwalan (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:

 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 Switching
Ketika 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.

Gambar 6. Context Switching


Ketika 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 Applications


Kebanyakan 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]
}
}
Software 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 Scheduling


Gambar 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 di- resume 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.

Anda mungkin juga menyukai