4 RESURSLARNI BOSHQARISh Agar bitta vazifa resursga kirishni boshlasa, lekin Ishlayotgan holatdan o'tishdan oldin unga kirishni tugatmasa, ko'p vazifali tizimda ziddiyat yuzaga kelishi mumkin. Agar vazifa resursni nomuvofiq holatda qoldirgan bo'lsa, boshqa har qanday vazifa yoki uzilish orqali bir xil manbaga kirish ma'lumotlarning buzilishi yoki boshqa shunga o'xshash xatolikka olib kelishi mumkin.
• A topshirig'i oldindan topshirilgan nuqtadan davom etadi va chiqishni tugatadi
• A vazifasi bajariladi va LCD displeyga “Salom dunyo” qatorini yozishni boshlaydi.
Quyida ba'zi misollar keltirilgan:
qolgan belgilar - "orld".
Endi LCD displeyda "Hello wAbort, Retry, Fail?orld" buzilgan qator ko'rsatiladi.
• A topshirig‘i satrning faqat boshini chiqargandan so‘ng B topshirig‘i bilan oldindan bajariladi – “Salom
1. Periferik qurilmalarga kirish
2. O'qish, o'zgartirish, yozish operatsiyalari
w”.
Machine Translated by Google
FreeRTOS 98
Mikrokontrollerlar uchun mo'ljallangan;
http://www.FreeRTOS.org
• B vazifasi PORTA qiymatini yangilaydi, keyin Bloklangan holatga kiradi.
Bu "atom bo'lmagan" operatsiya, chunki uni bajarish uchun bir nechta ko'rsatmalar talab qilinadi va uni to'xtatib qo'yish mumkin. Quyidagi stsenariyni ko'rib chiqing, unda ikkita vazifa PORTA deb nomlangan xotira xaritasi registrini yangilashga harakat qiladi:
3. O'zgaruvchilarga atomsiz kirish
• Vazifa A PORTA qiymatini registrga yuklaydi - operatsiyaning o'qilgan qismi.
Strukturaning bir nechta a'zolarini yangilash yoki arxitekturaning tabiiy so'z hajmidan kattaroq bo'lgan o'zgaruvchini yangilash (masalan, 16 bitli mashinada 32 bitli o'zgaruvchini yangilash) ikkalasi ham atom bo'lmagan operatsiyalarga misoldir. Agar ular uzilib qolsa, ular ma'lumotlarning yo'qolishiga yoki buzilishiga olib kelishi mumkin.
• A topshiriq oldindan topshirilgan nuqtadan davom etadi. U yangilangan qiymatni PORTAga yozishdan oldin
registrda mavjud bo'lgan PORTA qiymatining nusxasini o'zgartiradi.
• A topshirig'i B topshirig'ining o'zgartirish va yozish qismlarini bajarishdan oldin oldindan topshiriladi
4. Funktsiyani qayta kiritish
Agar funktsiyani bir nechta vazifalardan yoki ikkala vazifa va uzilishlardan chaqirish xavfsiz bo'lsa, funktsiya qayta kiradi.
Vazifa A PORTA uchun yangilangan va eskirgan qiymatni yozgan. B vazifasi PORTA qiymatining nusxasini olish va A topshirig'i uning o'zgartirilgan qiymatini PORTA registriga yozish o'rtasida PORTA ni o'zgartirdi. Vazifa A PORTA ga yozganda, u B vazifasi tomonidan allaqachon bajarilgan modifikatsiyani qayta yozadi va bu PORTA registr qiymatini samarali ravishda buzadi.
bir xil operatsiya.
Har bir vazifa o'z stekini va o'zining asosiy registr qiymatlarini saqlaydi. Agar funktsiya stekga ajratilgan yoki registrda saqlanadigan ma'lumotlardan boshqa hech qanday ma'lumotlarga kira olmasa, funktsiya qayta kiritiladi. Ro'yxat 58 reentrant funktsiyasiga misoldir. Ro'yxat 59 - bu reentrant bo'lmagan funktsiyaga misol.
Ushbu misolda periferik registrdan foydalaniladi, lekin global o'zgaruvchilarda o'qish, o'zgartirish, yozish amallarini bajarishda xuddi shu printsip qo'llaniladi.
/* Funksiyaga parametr uzatiladi. Bu stekga yoki CPU registriga uzatiladi. Ikkala usul ham xavfsizdir, chunki har bir vazifa o'z stackini va o'ziga xos registr qiymatlarini saqlaydi. */ long lAddOneHundered( long lVar1 ) { /* Ushbu funksiya doirasi o‘zgaruvchisi kompilyator va optimallashtirish darajasiga qarab stek yoki registrga ham ajratiladi. Ushbu
funktsiyani chaqiradigan har bir vazifa yoki uzilish o'z lVar2
nusxasiga ega bo'ladi. */ uzun lVar2;
hol 0 : lReturn = lVar1 + 10; lState = 1; sindirish;
lVar2 = lVar1 + 100;
1-holat: lQaytish = lVar1 + 20; lState = 0; sindirish;
/* Bunday holda lVar1 global o'zgaruvchidir, shuning uchun funktsiyani chaqiradigan har bir vazifa o'zgaruvchining bir xil nusxasiga kirish huquqiga ega bo'ladi. */ uzun lVar1;
/* Qaytish qiymati protsessor registriga joylashtirilishi mumkin, lekin u ham stekga joylashtirilishi mumkin. */ lVar2 ni qaytarish;
}
long lNonsenseFunction( void ) { /* Bu o'zgaruvchi
statik, shuning uchun stekda ajratilmagan. Funktsiyani chaqiradigan har bir vazifa o'zgaruvchining bir xil nusxasiga kirish huquqiga ega bo'ladi. */ statik uzun lState = 0; uzoq lQaytish;