Перейти к содержанию
    

Поясните смысл прерываний для FreeRTOS

Системный таймер это как бы понятно.

Я использую STM32, там дополнительно еще 2 ISR для FreeRTOS:

xPortPendSVHandler:

vPortSVCHandler:

В них вроде бы переключение контекста. Зачем прерываниями это сделано? Почему 2? Прошу пояснить доходчиво...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я использую STM32, там дополнительно еще 2 ISR для FreeRTOS:

xPortPendSVHandler:

vPortSVCHandler:

В них вроде бы переключение контекста.

Переключение контекста в PendSVHandler.

SVCHandler - вызывается командой svc - Supervisor Call.

Зачем прерываниями это сделано

Какие ещё варианты реализации переключения?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня был опыт использования embos на avr - контекст там переключался по системному таймеру..

Хорошо, пусть контекст переключается в PendSVHandler, а системный таймер взводит это прерывание, так?

а зачем еще SVHandler и что он все таки делает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня был опыт использования embos на avr - контекст там переключался по системному таймеру..

То есть в прерывании.

 

Хорошо, пусть контекст переключается в PendSVHandler, а системный таймер взводит это прерывание, так?

В частности может и таймер.

Задачи также могут его вызать при переходе в неактивное состояние.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а зачем еще SVHandler и что он все таки делает?

Чтобы вручную досрочно вызывать планировщик из задачи

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чтобы вручную досрочно вызывать планировщик из задачи

Почему задача не может сама вызвать планировщик? Если ей уже делать нечего?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

xPortPendSVHandler:

vPortSVCHandler:

vPortSVCHandler используется один раз - для запуска самой первой задачи. На кортексе для прерываний используется отдельный стек. Вот для того, чтобы на него переключиться и используется инструкция SVC.

xPortPendSVHandler используется для переключения задач во всех остальных случаях. Потому что:

1) этому прерыванию можно назначить самый низкий приоритет - переключение задач не вызовет блокировку обработки важных событий

2) это прерывание асинхронно - можно взвести битик, доделать текущие дела, обработать более приоритетные прерывания и т.д. Не нужно где-то запоминать флажок "надо переключить задачу", выполнять какие-то вызовы, учитывать что требование переключить задачу может проистекать из нескольких источников и т.д.

3) это прерывание можно вызвать программно откуда угодно (из задачи или из обработчика другого прерывания) - переключение контекста в одном месте кода ОС, меньше глюков, проще отладка.

4) это прерывание имеется на любом Кортексе-М - не нужно писать вариации под каждый новый камень

 

Почему задача не может сама вызвать планировщик? Если ей уже делать нечего?

Чтобы не делать несколько разных точек входа в планировщик (одна для входа из задачи, другая для входа из прерывания, третья из таймера systick).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почитайте книжку "THE DEFINITIVE GUIDE TO THE ARM CORTEX-M3 SECOND EDITION" (Joseph Yiu) чтобы понять как вообще ядро работает, какие аппаратные "фичи" заложила компания ARM в ядро, чтобы облегчить работу многопоточных приложений под управлением малениких RTOS (и FreeRTOS в том числе).

Там написано, что прерывание PendSV задумывалось как прерывание для переключения контекста.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...