FreeRTOS-da oldindan ogohlantirish

FreeRTOS dan foydalanishni boshlayman va men qanday vazifani bajarish kerakligini oldindan ko'rishni to'xtatmoqchiman va tanqidiy ravishda ishlashim kerak bo'lgan vazifani bajaraman.

Buni FreeRTOS-da qilishning usullari bormi? (Bu vazifa ustuvorligi bilan amalga oshdimi?)

2

7 javoblar

Yo'q! Yuqoridagi javoblarning ikkalasi ham xavflidir.

ISR ichidagi "COUNTER_CRITICAL"() yoki taskEXIT_CRITICAL() funktsiyasidan foydalanmang - ISR ichidagi juda muhim bo'limga ehtiyoj tug'ilishi odatiy hol, lekin keyin " taskENTER_CRITICAL_FROM_ISR ()/taskEXIT_CRITICAL_FROM_ISR() . (AVR32 porti bu qoida uchun istisno emasmi?)

XTaskResumeFromISR() funktsiyasini interrupt bilan sinxronizatsiya qilish uchun ishlatmang. Ushbu funksiya uchun hujjat allaqachon chop etilgan bu hattoki buni ham aytadi.

If my understanding of your question is correct you want the ability to have an interrupt unblock a task, and then if that task is the highest priority task in that is able to run, have the interrupt return directly to the unblocked task. If my understanding is right then there is an example of how to do that in an efficient way on the following page: http://www.freertos.org/RTOS_Task_Notification_As_Counting_Semaphore.html

3
qo'shib qo'ydi
Ushbu link bu savolga javob berishi mumkin bo'lsa-da, javobning muhim qismlarini bu yerga qo'shishingiz va havola qilish uchun havolani taqdim qilish yaxshiroqdir. Linkli sahifalar o'zgartirilsa, faqat aloqa uchun javoblar bekor bo'lishi mumkin. - Ko'rib chiqishdan
qo'shib qo'ydi muallif robinCTS, manba
Ha, rahmat! Bu men izlayotgan narsadir. Men misolni amalga oshirishga harakat qilaman va narsalarning ishlashini ko'rishga harakat qilaman. Yordamingiz uchun rahmat.
qo'shib qo'ydi muallif Godspped, manba

Yo'q! Yuqoridagi javoblarning ikkalasi ham xavflidir.

ISR ichidagi "COUNTER_CRITICAL"() yoki taskEXIT_CRITICAL() funktsiyasidan foydalanmang - ISR ichidagi juda muhim bo'limga ehtiyoj tug'ilishi odatiy hol, lekin keyin " taskENTER_CRITICAL_FROM_ISR ()/taskEXIT_CRITICAL_FROM_ISR() . (AVR32 porti bu qoida uchun istisno emasmi?)

XTaskResumeFromISR() funktsiyasini interrupt bilan sinxronizatsiya qilish uchun ishlatmang. Ushbu funksiya uchun hujjat allaqachon chop etilgan bu hattoki buni ham aytadi.

If my understanding of your question is correct you want the ability to have an interrupt unblock a task, and then if that task is the highest priority task in that is able to run, have the interrupt return directly to the unblocked task. If my understanding is right then there is an example of how to do that in an efficient way on the following page: http://www.freertos.org/RTOS_Task_Notification_As_Counting_Semaphore.html

3
qo'shib qo'ydi
Ushbu link bu savolga javob berishi mumkin bo'lsa-da, javobning muhim qismlarini bu yerga qo'shishingiz va havola qilish uchun havolani taqdim qilish yaxshiroqdir. Linkli sahifalar o'zgartirilsa, faqat aloqa uchun javoblar bekor bo'lishi mumkin. - Ko'rib chiqishdan
qo'shib qo'ydi muallif robinCTS, manba
Ha, rahmat! Bu men izlayotgan narsadir. Men misolni amalga oshirishga harakat qilaman va narsalarning ishlashini ko'rishga harakat qilaman. Yordamingiz uchun rahmat.
qo'shib qo'ydi muallif Godspped, manba

Buni amalga oshirish uchun xTaskResumeFromISR dan foydalanishingiz mumkin.

Berilgan topshiriq uchun boshqa vazifalar (masalan, ustuvorlik kabi yuqori darajada bo'lishi kerak) tomonidan to'xtatilmaslik uchun bir qator shartlar mavjud bo'lishi va hech qanday interruptning xizmatga berilmasligini ta'minlash uchun bir qator boshqa shartlar bajarilishi kerak keyingi vazifani bajarishdan oldin bajarilishi kerak bo'lgan vazifani bajarish kerak)

1
qo'shib qo'ydi

1. oldindan belgilashni yoqish:

Bu juda oson.

FreeRTOS ning barcha konfiguratsiya imkoniyatlari "FreeRTOSConfig.h" ostida

#define configUSE_PREEMPTION                    1

Buni RTOS rejalashtiruvchisini ishlatish uchun 1-ga yoki kooperativ RTOS-jadvalini ishlatish uchun 0-ga sozlang.

Qo'shimcha ma'lumot olish uchun bu havolani tekshiring.

2. ISR ichidagi muhim qismdan foydalaning

void taskENTER_CRITICAL( void );
//action

void taskEXIT_CRITICAL( void );

RTOS ushbu muhim qismda qo'shimcha qilishni xohlamaydi

ref: here

1
qo'shib qo'ydi

1. oldindan belgilashni yoqish:

Bu juda oson.

FreeRTOS ning barcha konfiguratsiya imkoniyatlari "FreeRTOSConfig.h" ostida

#define configUSE_PREEMPTION                    1

Buni RTOS rejalashtiruvchisini ishlatish uchun 1-ga yoki kooperativ RTOS-jadvalini ishlatish uchun 0-ga sozlang.

Qo'shimcha ma'lumot olish uchun bu havolani tekshiring.

2. ISR ichidagi muhim qismdan foydalaning

void taskENTER_CRITICAL( void );
//action

void taskEXIT_CRITICAL( void );

RTOS ushbu muhim qismda qo'shimcha qilishni xohlamaydi

ref: here

1
qo'shib qo'ydi

Qisqa javob quyidagicha bo'ladi: Ha, bu vazifa ustuvorligi bilan erishiladi.

FreeRTOS yadrosi ISR ​​tugallangandan so'ng tayyor vazifada almashtirishni o'ylaydi, shuning uchun yuqori ustuvor vazifa hozir tayyor bo'lsa, mavjud ishlaydigan vazifani bekor qiladi.

Shuni ta'kidlash kerakki, agar bu ishlov beruvchi FreeRTOS orqali chaqirilsa, bu haqiqatan ham to'g'ri. Cortex-A protsessorida IRQ yoki FIQ istisnosiz ishlov berish qurilmasida umumiy IRQ nuqtasi mavjud bo'lib, u, ehtimol FreeRTOS tomonidan yoki boshqacha tarzda, FreeRTOS tomonidan osongina o'ralgan IRQ dispetcher tomonidan odatda port qatlamidagi funktsiya orqali amalga oshiriladi. vApplicationIRQHandler() deb nomlangan.

Cortex-M da, bu vektor odatda sotuvchining MCU API tomonidan manipulyatsiya qilinganligi kabi holat emas. Cortex-M da ISR dagi portniYEELD_FROM_ISR() yordamida kernelni kontekstni almashtirish imkoniyatini taqdim qilish uchun amalga oshirilishi kerak edi.

1
qo'shib qo'ydi

Qisqa javob quyidagicha bo'ladi: Ha, bu vazifa ustuvorligi bilan erishiladi.

FreeRTOS yadrosi ISR ​​tugallangandan so'ng tayyor vazifada almashtirishni o'ylaydi, shuning uchun yuqori ustuvor vazifa hozir tayyor bo'lsa, mavjud ishlaydigan vazifani bekor qiladi.

Shuni ta'kidlash kerakki, agar bu ishlov beruvchi FreeRTOS orqali chaqirilsa, bu haqiqatan ham to'g'ri. Cortex-A protsessorida IRQ yoki FIQ istisnosiz ishlov berish qurilmasida umumiy IRQ nuqtasi mavjud bo'lib, u, ehtimol FreeRTOS tomonidan yoki boshqacha tarzda, FreeRTOS tomonidan osongina o'ralgan IRQ dispetcher tomonidan odatda port qatlamidagi funktsiya orqali amalga oshiriladi. vApplicationIRQHandler() deb nomlangan.

Cortex-M da, bu vektor odatda sotuvchining MCU API tomonidan manipulyatsiya qilinganligi kabi holat emas. Cortex-M da ISR dagi portniYEELD_FROM_ISR() yordamida kernelni kontekstni almashtirish imkoniyatini taqdim qilish uchun amalga oshirilishi kerak edi.

1
qo'shib qo'ydi