Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Поясните смысл прерываний для FreeRTOS
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > FreeRTOS
kan35
Системный таймер это как бы понятно.
Я использую STM32, там дополнительно еще 2 ISR для FreeRTOS:
xPortPendSVHandler:
vPortSVCHandler:
В них вроде бы переключение контекста. Зачем прерываниями это сделано? Почему 2? Прошу пояснить доходчиво...
_Артём_
Цитата(kan35 @ Nov 29 2012, 20:14) *
Я использую STM32, там дополнительно еще 2 ISR для FreeRTOS:
xPortPendSVHandler:
vPortSVCHandler:
В них вроде бы переключение контекста.

Переключение контекста в PendSVHandler.
SVCHandler - вызывается командой svc - Supervisor Call.
Цитата(kan35 @ Nov 29 2012, 20:14) *
Зачем прерываниями это сделано

Какие ещё варианты реализации переключения?
kan35
У меня был опыт использования embos на avr - контекст там переключался по системному таймеру..
Хорошо, пусть контекст переключается в PendSVHandler, а системный таймер взводит это прерывание, так?
а зачем еще SVHandler и что он все таки делает?
_Артём_
Цитата(kan35 @ Nov 30 2012, 07:43) *
У меня был опыт использования embos на avr - контекст там переключался по системному таймеру..

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

Цитата(kan35 @ Nov 30 2012, 07:43) *
Хорошо, пусть контекст переключается в PendSVHandler, а системный таймер взводит это прерывание, так?

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

MrYuran
Цитата(kan35 @ Nov 30 2012, 09:43) *
а зачем еще SVHandler и что он все таки делает?

Чтобы вручную досрочно вызывать планировщик из задачи
_Артём_
Цитата(MrYuran @ Nov 30 2012, 09:11) *
Чтобы вручную досрочно вызывать планировщик из задачи

Почему задача не может сама вызвать планировщик? Если ей уже делать нечего?
LightElf
QUOTE (kan35 @ Nov 29 2012, 22:14) *
xPortPendSVHandler:
vPortSVCHandler:

vPortSVCHandler используется один раз - для запуска самой первой задачи. На кортексе для прерываний используется отдельный стек. Вот для того, чтобы на него переключиться и используется инструкция SVC.
xPortPendSVHandler используется для переключения задач во всех остальных случаях. Потому что:
1) этому прерыванию можно назначить самый низкий приоритет - переключение задач не вызовет блокировку обработки важных событий
2) это прерывание асинхронно - можно взвести битик, доделать текущие дела, обработать более приоритетные прерывания и т.д. Не нужно где-то запоминать флажок "надо переключить задачу", выполнять какие-то вызовы, учитывать что требование переключить задачу может проистекать из нескольких источников и т.д.
3) это прерывание можно вызвать программно откуда угодно (из задачи или из обработчика другого прерывания) - переключение контекста в одном месте кода ОС, меньше глюков, проще отладка.
4) это прерывание имеется на любом Кортексе-М - не нужно писать вариации под каждый новый камень

QUOTE (_Артём_ @ Nov 30 2012, 16:55) *
Почему задача не может сама вызвать планировщик? Если ей уже делать нечего?

Чтобы не делать несколько разных точек входа в планировщик (одна для входа из задачи, другая для входа из прерывания, третья из таймера systick).
sysel
Почитайте книжку "THE DEFINITIVE GUIDE TO THE ARM CORTEX-M3 SECOND EDITION" (Joseph Yiu) чтобы понять как вообще ядро работает, какие аппаратные "фичи" заложила компания ARM в ядро, чтобы облегчить работу многопоточных приложений под управлением малениких RTOS (и FreeRTOS в том числе).
Там написано, что прерывание PendSV задумывалось как прерывание для переключения контекста.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.