MUXAMMAD AL-XORAZMIY NOMIDAGI
TOSHKENT AXBOROT TEXNOLOGIYALARI UNIVERSITETI
SAMARQAND FILIALI
KOMPYUTER TIZIMLARI KAFEDRASI
5330501- Kompyuter injiniring ta'lim yo'nalishi
“Real vaqt tizimlari” fanidan
AMALIY ISH № 4
Mavzu: IDLE vazifasi va FreeRTOS da timerga bog’liq masalalar.
Bajardi: Isayev I.
Qabul qildi: Bo’riboyev A.S.
Ishni bahosi: ___________ ball
Samarqand – 2022
LABORATORIYA ISHI №4.
IDLE vazifasi va FreeRTOS da timerga bog’liq masalalar.
Ishning maqsadi. Real vaqt operatsion tizimlarda dasturiy ta'minot taymerlari muayyan vaqt oralig'idan keyin vazifa yoki funktsiyani bajarish uchun funksionallikni ta'minlash.
Idle bu - rejalashtiruvchi ishga tushganda bo'sh turgan vazifa avtomatik ravishda yaratiladi.
Agar CPU uchun hech qanday vazifa mavjud bo'lmasa, bu vazifa bajariladi.
Vazifa o'chirilganda, u tomonidan ishlatiladigan xotira darhol bo'sh bo'lmaydi. Bu bo'sh ishda amalga oshiriladi.
Misol. Ushbu misolda biz turli xil ustuvorliklarga ega 2-vazifa yaratmoqchimiz.
Har bir vazifa bir muncha vaqt ishlaydi va keyin boshqa vazifalarni bajarishga ruxsat beruvchi bloklangan holatga o'tadi. Kutish vaqti tugagandan so'ng, rejalashtiruvchi vazifani tayyor holatga keltiradi va oxir-oqibat, agar uning ustuvorligi hozirgi bajarilayotgan vazifaga nisbatan yuqoriroq bo'lsa, uni ishga tushirish holatiga keltiradi. Loop() funktsiyasi protsessor ishlamay qolganda ishlaydi.
#include
void setup()
{
Serial.begin(9600);
Serial.println(F("In Setup function"));
/* Create two tasks with priorities 1 and 2.
* Enable the Idle Task Hook by setting configUSE_IDLE_HOOK to 1, by this the loop function can be used as Idle task*/
xTaskCreate(MyTask1, "Task1", 100, NULL, 1, NULL);
xTaskCreate(MyTask2, "Task2", 100, NULL, 2, NULL);
}
void loop()
{
// Hooked to IDle task, it will run whenever CPU is idle
Serial.println(F("Loop function"));
delay(50);
}
/* Task1 with priority 1 */
static void MyTask1(void* pvParameters)
{
while(1)
{
Serial.println(F("Task1"));
vTaskDelay(100/portTICK_PERIOD_MS);
}
}
/* Task2 with priority 2 */
static void MyTask2(void* pvParameters)
{
while(1)
{
Serial.println(F("Task2"));
vTaskDelay(150/portTICK_PERIOD_MS);
}
}
Natija. Tekshirish moslamasi o'rnatish funktsiyasidan bajarishni boshlaydi. Seriya port 9600 bod tezligida ishga tushiriladi va sozlash xabari chop etiladi.
Keyinchalik 2,1,0 ustuvorliklari bo'yicha 3-Tasks (Vazifa 1, Vazifa 2 va Ishsiz) yaratiladi. O'rnatish funksiyasining oxirida, rejalashtiruvchi/yadro boshqaruvni oladi.
Tayyor holatda 3 ta vazifa mavjud va Vazifa 2 eng yuqori ustuvorlikka ega bo'lgani uchun u birinchi bo'lib ishga tushadi va 150 ms uchun blokirovka holatiga o'tadi.
Endi 2 ta vazifa rejalashtiruvchi uchun mavjud va u Vazifa 1 ni tanlaydi, chunki u mavjud yuqoriroq vazifa hisoblanadi.
Endi Task1 biroz vaqt ishlaydi va keyin 100ms uchun bloklangan holatga o'tadi.
Protsessor Kutish vazifasidan tashqarida qoladi va u ishlay boshlaydi.
Vazifa 2 bloklangan holatda 150 ms va vazifa 1 100 ms bo'ladi. Shunday qilib, vazifa 1 avval bloklangan holatdan chiqadi.
Task1 kutish vaqti tugagandan so'ng, u Tayyor holatga keladi. Ishlamaslik vazifasi bilan solishtirganda u ko'proq ustuvorlikka ega bo'lganligi sababli, u Bekor bo'lgan vazifani oldini oladi va ishlay boshlaydi. U yana 100ms uchun bloklangan holatga o'tadi.
Endi CPU IDLE vazifasidan tashqarida qoldi va u uni ishga tushira boshlaydi.
Task2 kutish vaqti tugagandan so'ng, u Tayyor holatiga keladi. Ishlamaslik vazifasi bilan solishtirganda u ko'proq ustuvorlikka ega bo'lganligi sababli, u Bekor bo'lgan vazifani oldini oladi va ishlay boshlaydi. U yana 150ms uchun bloklangan holatga o'tadi.
Dastur kodi:
#include
void setup()
{
Serial.begin(9600);
Serial.println(F("In Setup function"));
/* Create two tasks with priorities 1 and 2.
* Enable the Idle Task Hook by setting configUSE_IDLE_HOOK to 1, by this the loop function can be used as Idle task*/
xTaskCreate(MyTask1, "Javlon", 100, NULL, 1, NULL);
xTaskCreate(MyTask3, "Oxun", 100, NULL, 1, NULL);
xTaskCreate(MyTask2, "Xusniddin", 100, NULL, 2, NULL);
}
void loop()
{
// Hooked to IDle task, it will run whenever CPU is idle
Serial.println(F("Loop function"));
delay(50);
}
/* Task1 with priority 1 */
static void MyTask1(void* pvParameters)
{
while(1)
{
Serial.println(F("Javlon"));
vTaskDelay(300/portTICK_PERIOD_MS);
}
}
static void MyTask3(void* pvParameters)
{
while(1)
{
Serial.println(F("Oxun"));
vTaskDelay(300/portTICK_PERIOD_MS);
}
}
/* Task2 with priority 2 */
static void MyTask2(void* pvParameters)
{
while(1)
{
Serial.println(F("Xusniddin"));
vTaskDelay(1000/portTICK_PERIOD_MS);
}
}
Natija
Do'stlaringiz bilan baham: |