Энэ удаагийн нийтлэлээр бүгдээрээ анхан шатны, хамгийн энгийн 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
Боловсролыг инженерчлэв.
