Site icon Elektrologi

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:

Solusi

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

Exit mobile version