реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Поясните смысл прерываний для FreeRTOS, пользую 3 года, но до сих пор не понимаю
kan35
сообщение Nov 29 2012, 18:14
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



Системный таймер это как бы понятно.
Я использую STM32, там дополнительно еще 2 ISR для FreeRTOS:
xPortPendSVHandler:
vPortSVCHandler:
В них вроде бы переключение контекста. Зачем прерываниями это сделано? Почему 2? Прошу пояснить доходчиво...
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Nov 29 2012, 19:25
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(kan35 @ Nov 29 2012, 20:14) *
Я использую STM32, там дополнительно еще 2 ISR для FreeRTOS:
xPortPendSVHandler:
vPortSVCHandler:
В них вроде бы переключение контекста.

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

Какие ещё варианты реализации переключения?
Go to the top of the page
 
+Quote Post
kan35
сообщение Nov 30 2012, 05:43
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



У меня был опыт использования embos на avr - контекст там переключался по системному таймеру..
Хорошо, пусть контекст переключается в PendSVHandler, а системный таймер взводит это прерывание, так?
а зачем еще SVHandler и что он все таки делает?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Nov 30 2012, 07:01
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(kan35 @ Nov 30 2012, 07:43) *
У меня был опыт использования embos на avr - контекст там переключался по системному таймеру..

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

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

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

Go to the top of the page
 
+Quote Post
MrYuran
сообщение Nov 30 2012, 07:11
Сообщение #5


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



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

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


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Nov 30 2012, 12:55
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



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

Почему задача не может сама вызвать планировщик? Если ей уже делать нечего?
Go to the top of the page
 
+Quote Post
LightElf
сообщение Dec 19 2012, 17:00
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 180
Регистрация: 5-04-09
Пользователь №: 47 205



QUOTE (kan35 @ Nov 29 2012, 22:14) *
xPortPendSVHandler:
vPortSVCHandler:

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

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

Чтобы не делать несколько разных точек входа в планировщик (одна для входа из задачи, другая для входа из прерывания, третья из таймера systick).
Go to the top of the page
 
+Quote Post
sysel
сообщение Dec 25 2012, 14:22
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 3-07-07
Пользователь №: 28 852



Почитайте книжку "THE DEFINITIVE GUIDE TO THE ARM CORTEX-M3 SECOND EDITION" (Joseph Yiu) чтобы понять как вообще ядро работает, какие аппаратные "фичи" заложила компания ARM в ядро, чтобы облегчить работу многопоточных приложений под управлением малениких RTOS (и FreeRTOS в том числе).
Там написано, что прерывание PendSV задумывалось как прерывание для переключения контекста.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th June 2025 - 14:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01418 секунд с 7
ELECTRONIX ©2004-2016