Энэ удаагийн нийтлэлээр бүгдээрээ анхан шатны, хамгийн энгийн FreeRTOS-ийн программыг бичиж үзэцгээе.

Өмнөх нийтлэлээр FreeRTOS гэж юу болох, ямар зориулалттай үйлдлийн систем мөн хэрхэн ажилладаг гэх мэт талаарх ойлголтуудыг мэдэж авцгаасан. Харин энэ удаа Arduino IDE ашиглан FreeRTOS-ийн энгийн программыг бичиж үзье.

Нэн түрүүнд хэдүүлээ Arduino IDE-тэй байх ёстой, дараах линкээр орж => “Arduino IDE” <= татаарай.

Татаж суулгасны дараа бидний ажиллах хөгжүүлэлтийн орчин буюу IDE маань дараах байдалтайгаар харагдах болно.

Тухайн Arduino-ийн зүүн буланд байрлах 5-н цэсний эхнээсээ 2-т байрлах Board manager цэс рүү орж ESP32 гэж бичин гарч ирэх 2 санг хоёулыг нь татна.

Ийнхүү хэдүүлээ зүүн дээр байх Select Other Boards and Port цэс рүү орж ESP32-ынхоо board-ийг сонгож кодоо бичиж эхэлнэ.

Одоо FreeRTOS-ийн кодоо бичицгээе тухайн код нь 2 өөр герцээр LED гэрэл анивчуулах дасгал юм. Иймд бид нар 2 таск бичнэ, гэхдээ нэг л гэрлийг анивчуулах юм.

#if CONFIG_FREERTOS_UNICORE
static const BaseType_t app_cpu = 0;
#else
static const BaseType_t app_cpu = 1;
#endif

//ESP32-ийн өөрт бэлэн байдаг LED гэрэл
static const int led_pin = LED_BUILTIN;

// Бидний эхний таск
void toggleLED_1(void *parameter) {
  while(1) {
    digitalWrite(led_pin, HIGH);
    vTaskDelay(500 / portTICK_PERIOD_MS);
    digitalWrite(led_pin, LOW);
    vTaskDelay(500 / portTICK_PERIOD_MS);
  }
}

// Бидний хоёр дахь таск
void toggleLED_2(void *parameter) {
  while(1) {
    digitalWrite(led_pin, HIGH);
    vTaskDelay(300 / portTICK_PERIOD_MS);
    digitalWrite(led_pin, LOW);
    vTaskDelay(300 / portTICK_PERIOD_MS);
  }
}

void setup() {
  pinMode(led_pin, OUTPUT);

  // Эхний таскыг үүсгэх
  xTaskCreatePinnedToCore(  // 
              toggleLED_1,  // Таск ажиллах функц
              "Toggle 1",   // Таскын нэр
              1024,         // Stack-ийн хэмжээ
              NULL,         // Функц руу дамжуулах параметр
              1,            // Таск биелүүлэх эрэмбэ
              NULL,         // Таск handle
              app_cpu);     // Таск ажиллах цөм

  // Хоёр дахь таскийг үүсгэх
  xTaskCreatePinnedToCore(  // Таск ажиллах функц
              toggleLED_2,  // Таскын нэр
              "Toggle 2",   // Name of task
              1024,         // Stack-ийн хэмжээ
              NULL,         // Функц руу дамжуулах параметр
              1,            // Таск биелүүлэх эрэмбэ
              NULL,         // Таск handle
              app_cpu);     // Таск ажиллах цөм
}

void loop() {

}

Хэдүүлээ дээрх кодыг багц багцаар задлан ойлгоцгооё. ESP32 нь ихэвчлэн 2 цөмтэй байдаг ч гэсэн 1 цөмтэй ESP32 байх нь бас цөөнгүй. Иймд 2 таск хоёулаа зөвхөн нэг цөм хувааж ажиллах байдлаар тохируулж өгвөл зохино.

#if CONFIG_FREERTOS_UNICORE
static const BaseType_t app_cpu = 0;
#else
static const BaseType_t app_cpu = 1;
#endif

PinnedToCore гэсэн функцийг ашигласнаар тухайн таск нь аль цөм дээр ажиллахыг шууд зоож өгч байна. Stack-ийн хэмжээг ESP32 дээр byte-аар тооцдог бол FreeRTOS дээр word-оор тооцдог (1 word = 4 bytes). Таскийн ажиллах эрэмбэ нь 0-ээс эхлэн дээд хязгаар хүртлээ үргэлжилнэ, дугаар өндөр байх тусам ажиллах эрэмбэ нь өндөр байх болно.

  xTaskCreatePinnedToCore(  // 
              toggleLED_1,  // Таск ажиллах функц
              "Toggle 1",   // Таскын нэр
              1024,         // Stack-ийн хэмжээ
              NULL,         // Функц руу дамжуулах параметр
              1,            // Таск биелүүлэх эрэмбэ
              NULL,         // Таск handle
              app_cpu);     // Таск ажиллах цөм

Бидний гол ажиллуулах функц маань Led гэрэл асааж унтраах их энгийн бичиглэлтэй код байна. Хэдий while(1) гэж бичсэн ч гэсэн таск болохоор 2 функц нь зэрэг байдлаар ажиллана. Arduino-ийн бэлэн delay функц нь эх кодыг тэр чигт нь гацааж, царцаадаг тул ашиглаж болохгүй. vTaskDelay ашиглаж зөвхөн тухайн таскыг, тухайн хугацааны агшинд гацаах байдлаар программчлах хэрэгтэй.

void toggleLED_1(void *parameter) {
  while(1) {
    digitalWrite(led_pin, HIGH);
    vTaskDelay(500 / portTICK_PERIOD_MS);
    digitalWrite(led_pin, LOW);
    vTaskDelay(500 / portTICK_PERIOD_MS);
  }
}

Бичсэн кодоо бүгдээрээ Wokwi платформ ашиглаж шалгаж үзэцгээе.

Ийнхүү бичсэн кодоо ажиллуулахад Led гэрэл нь 500 болон 300 миллисекундын 2 төрлийн урттайгаар асаж, унтарч байна.

Энэ хүртэл дагаж хийж кодоо ажиллуулж чадсан бол дараах дасгалыг бие даан хийцгээгээрэй.
– Өмнөх дасгалтай адил 2 тасктай байна. 2 таскын эрэмбэ тэнцүү байх ба эхний таск нь Serial-аар “Hello” гэж хэвлэх бол 2 дахь таск нь Serial-аар “World” гэж хэвлэнэ.

Аль болох хиймэл оюун ухааны тусламжгүйгээр хийцгээгээрэй. Уншигчдадаа амжилт хүсье.

The Essential Engineering Education

Боловсролыг инженерчлэв.

Leave a Reply