Task Dummy Untuk FreeRTOS

Task Dummy Untuk FreeRTOS

Pada percobaan FreeRTOS dengan penjadwal periodik, diperlukan suatu task (pekerjaan) dengan waktu eksekusi yang diketahui.

Berikut ini sifat-sifat yang diperlukan dari task tersebut:

  • waktu eksekusi diketahui
  • waktu eksekusi dapat diubah-ubah dengan mengubah parameternya
  • status task dapat dimonitor dari luar mikroprosesor
  • status yang perlu diketahui: RUNNING, READY, BLOCKING, STOP.

Solusi

  • Task berupa iterasi yang jumlah iterasi dapat diubah-ubah dengan parameter.
  • Pengaruh parameter terhadap waktu eksekusi diukur. Pengukuran terbaik dengan menggunakan alat ukur eksternal seperti osiloskop. Jika tidak ada osiloskop, alternatifnya menggunakan fungsi millis() pada Arduino.
  • Task Dummy melakukan aktivitas membuat 2 buah LED berkedip secara komplementer. Jika kedua lampu nampak menyala, artinya task dalam keadaan RUNNING. Jika salah satu saja yang menyala, artinya task sedang berhenti, artinya dalam keadaan READY atau BLOCKING. Jika kedua lampu mati, artinya task sedang tidak aktif.

Berikut ini kode fungsi Task Dummy pada Arduino.

 

void TaskDummy(int LED_A, int LED_B, long int counter) {
  long int i;
  for (i = 0; i < counter; i++) {
    cli();
    digitalWrite(LED_A, LOW);
    digitalWrite(LED_B, HIGH);
    sei();
    asm("nop");
    cli();
    digitalWrite(LED_A, HIGH);
    digitalWrite(LED_B, LOW);
    sei();
    asm("nop");
  }
  digitalWrite(LED_A, LOW);  // matikan semua LED
  digitalWrite(LED_B, LOW);
}

DigitalWrite menyalakan dan mematikan LED A dan LED B. LED yang dipakai sebagai output dapat diatur melalui parameter fungsi. cli() fungsinya untuk disable interrupt, agar perubahan LED_A dan LED_B terjadi secara serentak. sei() fungsinya untuk mengaktifkan kembali interupsi. Instruksi assembly “nop” dipakai untuk menambah waktu iterasi.

Berikut ini program lengkapnya

// Contoh TaskDummy
// dengan output ke osiloskop juga
#define LED1 2
#define LED2 3
#define LED3 4
#define LED4 5

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(115200);
}

void TaskDummy(int LED_A, int LED_B, long int counter) {
  long int i;
  for (i = 0; i < counter; i++) {
    cli();
    digitalWrite(LED_A, LOW);
    digitalWrite(LED_B, HIGH);
    sei();
    asm("nop");
    cli();
    digitalWrite(LED_A, HIGH);
    digitalWrite(LED_B, LOW);
    sei();
    asm("nop");
  }
  digitalWrite(LED_A, LOW);  // matikan semua LED
  digitalWrite(LED_B, LOW);
}

// the loop function runs over and over again forever
void loop() {
  unsigned long waktu_awal;
  unsigned long waktu_akhir;
  waktu_awal = millis();
  TaskDummy(LED1, LED2, 10000L);
  waktu_akhir = millis();
  Serial.print("waktu: ");
  Serial.println(waktu_akhir - waktu_awal);
  digitalWrite(LED_BUILTIN, HIGH);
  TaskDummy(LED1, LED2, 10000L);
  digitalWrite(LED_BUILTIN, LOW);
}

Durasi TaskDummy dalam milisekon dapat diamati di port serial. Berikut ini tampilan port serial.

Dari tampilan tersebut dapat diketahui bahwa waktu eksekusi task dummy adalah 173 ms.

Berikut ini foto pengukuran dengan osiloskop. Dari gambar nampak waktu yang diperlukan untuk task dummy adalah 172 ms

Berikut ini foto percobaan.

Osiloskop yang dipakai

Referensi

2 thoughts on “Task Dummy Untuk FreeRTOS

Tinggalkan Balasan

This site uses Akismet to reduce spam. Learn how your comment data is processed.