Как работает portYIELD в freeRTOS

Я совсем новичок в freeRTOS. В freeRTOS документация taskYIELD используется для запроса переключения контекста. , taskYIELD определяется следующим образом

#define taskYIELD()                 portYIELD()

и portYIELD определяется следующим образом:

#define portYIELD()                 {__asm__ __volatile__ ("scall");}

если я не понимаю, это вызовет исключение системного вызова.

В исключениях моего порта системные вызовы обрабатываются следующим образом:

.org  0x100
  // Supervisor Call.
  _handle_Supervisor_Call:
  rjmp $

Это означает, что программа войдет в бесконечный цикл, поэтому вопрос в том, как программа выйдет из этого бесконечного цикла? Если какая-то ошибка в моем понимании, не стесняйтесь комментировать.

Я использую Atmel uc3a0512 и Atmel Studio 7.0.


person Mouin    schedule 27.08.2016    source источник
comment
Я не использовал FreeRTOS, но нормально ли использовать бесконечный цикл в качестве обработчика инструкции системного вызова? Я подозреваю, что идея состоит в том, чтобы уступить, сделав системный вызов, которому разрешено блокировать/планировать. то есть обработчик системных вызовов должен быть чем-то, что проверяет, выполняется ли текущая задача слишком долго, и если это так, переходите к планировщику, чтобы узнать, что ЦП должен делать прямо сейчас.   -  person Peter Cordes    schedule 27.08.2016
comment
Да, действительно, мне тоже надоело.   -  person Mouin    schedule 27.08.2016
comment
Вы написали этот бесконечный цикл? Если все так и было, предназначено ли это для замены большинства проектов?   -  person Peter Cordes    schedule 27.08.2016
comment
Нет, я ничего не менял, код, который я показываю, извлечен из работающего примера freeRTOS.   -  person Mouin    schedule 27.08.2016


Ответы (1)


Какую версию FreeRTOS вы используете? Какой компилятор вы используете? У меня версии 8.2.3 и 9.0.0. В обеих версиях AVR32 UC3 есть два порта: GCC и IAR.

В FreeRTOS\Source\portable\GCC\AVR32_UC3\exception.S мы видим:

        .org  0x100
        // Supervisor Call.
_handle_Supervisor_Call:
        lda.w   pc, SCALLYield

Для IAR у нас примерно такой же код. Итак, вы видите, что есть призвание SCALLYield. Загрузите последнюю версию и наслаждайтесь!

person Stephen Plyaskin    schedule 27.08.2016
comment
это freeRTOS 7.0.0 и компилятор AVR32/GNU, уверяю вас, что я пытался запустить несколько задач, и все работает нормально, но вопрос в том, КАК все хорошо работает с кодом, который я показываю выше? - person Mouin; 27.08.2016
comment
Ух ты. Вы уверены, что звоните taskYIELD() или portYIELD()? Проверьте это с помощью отладчика или printf в UART! Есть и другой способ переключения контекста: vTick() вызывает vTaskSwitchContext() - person Stephen Plyaskin; 27.08.2016
comment
@Mouin: ты не сказал в вопросе, что это сработало!! Я предполагал, что он действительно входит в бесконечный цикл, как вы сказали, и вы спрашивали, как он должен выйти из строя. (т.е. какое изменение в коде позволит ему работать). - person Peter Cordes; 28.08.2016