MUXAMMAD AL-XORAZMIY NOMIDAGI
TOSHKENT AXBOROT TEXNOLOGIYALARI UNIVERSITETI
SAMARQAND FILIALI
KOMPYUTER TIZIMLARI KAFEDRASI
5330500 - Kompyuter injiniringi (“Dasturiy injiniringi”)
bakalavriatura ta’lim yo’nalishi
“Real vaqt tizimlari” fanidan
Amaliy ish № 1
Bajardi: ____________ Kenjaboyev Q
Guruh: ___________ 210-18DI
Qabul qildi: ___________ XUJAYAROV I. SH
Ishni bahosi: ___________ ball
Samarqand – 2022
Mavzu: FreeRTOS da vazifalar yaratish
O'rnatilgan qurilmalarda mavjud bo'lgan OT RTOS (Real-Time Operating System) deb ataladi. O'rnatilgan qurilmalarda real vaqtda vazifalar juda muhim, bu erda vaqt juda muhim rol o'ynaydi. Haqiqiy vaqtdagi vazifalar vaqtni deterministik bo'lib, har qanday hodisaga javob vaqti har doim doimiy bo'lishini anglatadi, shuning uchun har qanday muayyan hodisa belgilangan vaqtda sodir bo'lishini kafolatlash mumkin. RTOS juda aniq vaqt va yuqori darajadagi ishonchlilik bilan ilovalarni ishlatish uchun mo'ljallangan. RTOS shuningdek, bitta yadro bilan ko'p vazifalarni bajarishda yordam beradi.
RTOS qanday ishlaydi?
RTOS bilan ishlashni boshlashdan oldin, keling, vazifa nima ekanligini ko'rib chiqaylik. Vazifa - protsessorda bajarilishi rejalashtirilgan kod qismidir. Shunday qilib, agar siz biron bir vazifani bajarmoqchi bo'lsangiz, u yadro kechikishi yoki uzilishlar yordamida rejalashtirilishi kerak. Bu ish yadroda mavjud bo'lgan Scheduler tomonidan amalga oshiriladi. Bir yadroli protsessorda rejalashtiruvchi vazifalarni ma'lum bir vaqt oralig'ida bajarishga yordam beradi, lekin bir vaqtning o'zida turli xil vazifalar bajarilayotganga o'xshaydi. Har bir vazifa unga berilgan ustuvorlikka muvofiq amalga oshiriladi.
Keling, RTOS yadrosida nima sodir bo'lishini ko'rib chiqaylik, agar biz bir soniyalik interval bilan LED miltillashi uchun vazifa yaratmoqchi bo'lsak va bu vazifani eng yuqori ustuvorlikka qo'ysak.
LED vazifasidan tashqari, yadro tomonidan yaratilgan yana bir vazifa bo'ladi, u bo'sh ish sifatida tanilgan. Ishlamaydigan vazifa bajarish uchun hech qanday vazifa mavjud bo'lmaganda yaratiladi. Bu vazifa har doim eng past ustuvorlikda, ya'ni 0 ustuvorlikda ishlaydi. Yuqorida keltirilgan vaqt grafigini tahlil qiladigan bo'lsak, bajarish LED topshirig'i bilan boshlanishi va u ma'lum vaqt davomida, keyin qolgan vaqt davomida ishlamay qolgan vazifa belgining uzilishi sodir bo'lguncha ishlaydi. Keyin yadro vazifaning ustuvorligi va LED vazifasining umumiy o'tgan vaqtiga qarab qaysi vazifani bajarish kerakligini hal qiladi. 1 soniya tugagach, yadro bajarilish uchun boshqariladigan vazifani yana tanlaydi, chunki u bo'sh turgan vazifadan yuqoriroq ustuvorlikka ega, shuningdek, LED vazifasi bo'sh turgan vazifani oldini oladi, deb aytishimiz mumkin. Agar bir xil ustuvorlikka ega bo'lgan ikkitadan ortiq vazifalar mavjud bo'lsa, ular ma'lum vaqt davomida aylanma rejimda ishlaydi.
Arduino FreeRTOS kutubxonasini o'rnatish
1. Arduino IDE-ni oching va Sketch -> Include Library -> Manage Library-ga o'ting. FreeRTOS-ni qidiring va quyida ko'rsatilgandek kutubxonani o'rnating.
Arduino FreeRTOS kutubxonasi
Siz kutubxonani github'dan yuklab olishingiz va Sketch-> Include Library -> Add .zip faylida .zip faylni qo'shishingiz mumkin.
Endi Arduino IDE-ni qayta ishga tushiring. Ushbu kutubxona ba'zi misol kodlarini taqdim etadi, shuningdek, quyida ko'rsatilganidek, Fayl -> Misollar -> FreeRTOS bo'limida topish mumkin.
Bu erda biz ishni tushunish uchun kodni noldan yozamiz, keyinroq siz misol kodlarini tekshirishingiz va ulardan foydalanishingiz mumkin.
Elektr sxemasi
Quyida Arduino-da FreeRTOS-dan foydalanib miltillovchi LED vazifasini yaratish sxemasi keltirilgan:
Dastur kodi:
#include
void TaskBlink1( void *pvParameters );
void TaskBlink2( void *pvParameters );
void Taskprint( void *pvParameters );
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
xTaskCreate(
TaskBlink1
, "task1"
, 128
, NULL
, 1
, NULL );
xTaskCreate(
TaskBlink2
, "task2"
, 128
, NULL
, 1
, NULL );
xTaskCreate(
Taskprint
, "task3"
, 128
, NULL
, 1
, NULL );
vTaskStartScheduler();
}
void loop()
{
}
void TaskBlink1(void *pvParameters) {
pinMode(8, OUTPUT);
while(1)
{
Serial.println("Task1");
digitalWrite(8, HIGH);
vTaskDelay( 200 / portTICK_PERIOD_MS );
digitalWrite(8, LOW);
vTaskDelay( 200 / portTICK_PERIOD_MS );
}
}
void TaskBlink2(void *pvParameters)
{
pinMode(7, OUTPUT);
while(1)
{
Serial.println("Task2");
digitalWrite(7, HIGH);
vTaskDelay( 300 / portTICK_PERIOD_MS );
digitalWrite(7, LOW);
vTaskDelay( 300 / portTICK_PERIOD_MS );
}
}
void Taskprint(void *pvParameters) {
int counter = 0;
while(1)
{
counter++;
Serial.println(counter);
vTaskDelay(500 / portTICK_PERIOD_MS); }
}
Do'stlaringiz bilan baham: |