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

 
 
 
Reply to this topicStart new topic
> freertos и его enter_critical, в какой ртос как реализован CRITICAL
cebotor
сообщение May 4 2007, 10:40
Сообщение #1


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

Группа: Свой
Сообщений: 135
Регистрация: 6-04-07
Из: Бронницы
Пользователь №: 26 809



Работал все время с ucos - клоном embos.
Решил протестировать freertos.

Сразу возник вопрос , как реализованы критические секции ?
в embos например

#define OS_EnterRegion() {OS_RegionCnt++; }

то есть при входе в участок увеличивается счетчик , и если он не нулевой ,
то не происходит переключение между задачами.

во фриртосе нашел

#define portENTER_CRITICAL() vPortEnterCritical()

void vPortEnterCritical( void )
{
/* Disable interrupts first! */
__disable_interrupt();

/* Now interrupts are disabled ulCriticalNesting can be accessed
directly. Increment ulCriticalNesting to keep a count of how many times
portENTER_CRITICAL() has been called. */
ulCriticalNesting++;
}

я правильно все понял ? прерывания запрещаються вообще? надо вызывать вложенные приложения в ручную ? не будут работать не только другие задачи , но и банальные обработчики таймеров и мастеров типа СПИ ?

Сообщение отредактировал cebotor - May 4 2007, 10:40


--------------------
если еррата пуста - это не хорошо а плохо
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 4 2007, 10:53
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(cebotor @ May 4 2007, 10:40) *
я правильно все понял ? прерывания запрещаються вообще?

На то она и железобетонная критическая секция. Что не мешает делать Вам что-то свое. У меня, например FIQ не запрещаются.
Цитата
надо вызывать вложенные приложения в ручную ?

Ерунда какая-то - какие вложенные? Чего в ручную? Причем здесь критическая секция?
Цитата
не будут работать не только другие задачи , но и банальные обработчики таймеров и мастеров типа СПИ ?

Не запускать другие задачи это не "критческая секция" - это "остановить шедулер",
void vTaskSuspendAll() (в новых версиях переименовано в vTaskSuspendScheduler()), что естественно осуществляется без запретов прерываний. Причем во FreeRTOS при xTaskResumeScheduler() для простоявших задач восстановление делается максимально аккуратно.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
cebotor
сообщение May 4 2007, 11:16
Сообщение #3


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

Группа: Свой
Сообщений: 135
Регистрация: 6-04-07
Из: Бронницы
Пользователь №: 26 809



Цитата(zltigo @ May 4 2007, 11:53) *
На то она и железобетонная критическая секция. Что не мешает делать Вам что-то свое. У меня, например FIQ не запрещаются.

Ерунда какая-то - какие вложенные? Чего в ручную? Причем здесь критическая секция?

Не запускать другие задачи это не "критческая секция" - это "остановить шедулер",
void vTaskSuspendAll() (в новых версиях переименовано в vTaskSuspendScheduler()), что естественно осуществляется без запретов прерываний. Причем во FreeRTOS при xTaskResumeScheduler() для простоявших задач восстановление делается максимально аккуратно.

ну вобщем понятно . в ембосе под критической секцией понимается непереключение задач(как во фриртосе суспенд щедулер ) , а для "железобетона "есть
__disable_interrupts();

а во фриртосе , наоборот - критическая секция это запрет прерывания, а для непереключения стоп щедулера.

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


--------------------
если еррата пуста - это не хорошо а плохо
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 4 2007, 11:30
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(cebotor @ May 4 2007, 11:16) *
что более нужно неясно. я склюняюсь к тому что вариант ембоса - ибо когда мне нужен "железобетон"
я просто запрещу перрывания

1. "Просто" запретить/разрешить недостаточно для общего случая вложенных критических секций.
2. Описанный Вами вариант c OS_RegionCnt++ это и есть останов шедулера, только примитивный.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
cebotor
сообщение May 4 2007, 11:42
Сообщение #5


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

Группа: Свой
Сообщений: 135
Регистрация: 6-04-07
Из: Бронницы
Пользователь №: 26 809



Цитата(zltigo @ May 4 2007, 12:30) *
1. "Просто" запретить/разрешить недостаточно для общего случая вложенных критических секций.
2. Описанный Вами вариант c OS_RegionCnt++ это и есть останов шедулера, только примитивный.


1. спасибо большое все понял ! а не могли бы вы отосллать меня куда нить где можно почитать про то что такое нестед критикал в теории ? а то я ника не могу представить , как из одной критической ситуации можно "вложиться в другую", если прерывания и переключения задач запрещены .

2. да и ето я тоже уже сообразил , посмотрел как во фриртосе реализован суспенд_щедулер -- понравилось , хотя глазу приятнее OS_RegionCnt++ (простите за упрямство smile.gif


--------------------
если еррата пуста - это не хорошо а плохо
Go to the top of the page
 
+Quote Post
AlexBoy
сообщение May 4 2007, 12:37
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 205
Регистрация: 19-12-05
Из: Kiev
Пользователь №: 12 394



Цитата(cebotor @ May 4 2007, 11:16) *
что более нужно неясно. я склюняюсь к тому что вариант ембоса - ибо когда мне нужен "железобетон"
я просто запрещу перрывания , а когда у меня критический сектор - я просто хочу , чтобы у меня приложения например не вызывали перекрестное обращение к какой нибудь общей переменной.

Вобщето для доступа к общим ресурсам есть более подходящие способы чем остановка шедулера, в UCOS например семафоры и мютексы, наверно и во freertos такое есть. Другие задачи при этом не останавливаются. Я использую для вызова malloc и доступа к sd карте.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 4 2007, 12:42
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(cebotor @ May 4 2007, 11:42) *
а не могли бы вы отосллать меня куда нить где можно почитать про то что такое нестед критикал в теории ? а то я ника не могу представить , как из одной критической ситуации можно "вложиться в другую", если прерывания и переключения задач запрещены .

Да все очень просто - при тупом disable после него вызываем, подпрограмму которая тоже хочет себе тоже "просто" критическую секцию организовать disable .... enable и ... после enable "простая" критическая секция начатая в головной программе трагически закончилась sad.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Abo
сообщение May 4 2007, 12:13
Сообщение #8


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

Группа: Свой
Сообщений: 101
Регистрация: 9-01-06
Пользователь №: 12 967



Цитата(zltigo @ May 4 2007, 16:42) *
Да все очень просто - при тупом disable после него вызываем, подпрограмму которая тоже хочет себе тоже "просто" критическую секцию организовать disable .... enable и ... после enable "простая" критическая секция начатая в головной программе трагически закончилась sad.gif


Чтобы трагически не закончилась можно делать disable ... restore.
Go to the top of the page
 
+Quote Post
v_shamaev
сообщение May 4 2007, 12:46
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 304
Регистрация: 5-07-04
Из: г. Москва
Пользователь №: 259



Цитата(Abo @ May 4 2007, 16:13) *
Чтобы трагически не закончилась можно делать disable ... restore.

И вводить стек неизвестной длины? Со счетчиком проще. Можно, конечно, в статической переменной при входе в функцию запоминать состояние, но это неоправданный расход ресурсов, и централизация управления нарушается, к тому же операция должна быть атомарной. Хотя я лично себя с таким механизмом почему-то увереннее чувствую.


--------------------
Водку пьянствовать и безобразия нарушать!!!
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 4 2007, 13:31
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Abo @ May 4 2007, 15:13) *
Чтобы трагически не закончилась можно делать disable ... restore.

Это если restore()
1. вообще штатно реализовано;
2. реализовано, так, что не вносит дополнительных ограничений на использование.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Abo
сообщение May 5 2007, 07:54
Сообщение #11


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

Группа: Свой
Сообщений: 101
Регистрация: 9-01-06
Пользователь №: 12 967



Цитата(zltigo @ May 4 2007, 17:31) *
Это если restore()
1. вообще штатно реализовано;
2. реализовано, так, что не вносит дополнительных ограничений на использование.



Вот пример из CW help

Код
int s;

  // Disable IRQ and FIQ interrupts
  s = libarm_disable_irq_fiq();

  ...

  // Restore IRQ and FIQ interrupts
  libarm_restore_irq_fiq(s);

Вот реализация функций:
libarm_disable_irq_fiq:
       E10F0000   mrs r0, cpsr
       E3802080   orr r2, r0, #0x00000080
       E121F002   msr cpsr_c r2
       E38020C0   orr r2, r0, #0x000000c0
       E121F002   msr cpsr_c r2
       E12FFF1E   bx lr
libarm_restore_irq_fiq:
       E1A00000   mov r0, r0
       E121F000   msr cpsr_c r0
       E12FFF1E   bx lr



А использование одной локальной переменной не есть на мой взгляд транжирством стека.
И никаких дополнительных ограничений на использование
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 5 2007, 08:35
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Abo @ May 5 2007, 10:54) *
А использование одной локальной переменной не есть на мой взгляд транжирством стека.
И никаких дополнительных ограничений на использование

Ограничение есть - disable() в одной функции а restore() в другой а то и в другой задаче.
Это ограничение.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Abo
сообщение May 5 2007, 09:37
Сообщение #13


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

Группа: Свой
Сообщений: 101
Регистрация: 9-01-06
Пользователь №: 12 967



Цитата(zltigo @ May 5 2007, 12:35) *
Ограничение есть - disable() в одной функции а restore() в другой а то и в другой задаче.
Это ограничение.


Это как это - запрещать прерывания в одной задаче и разрешать в другой - я правильно понял?
Если так - то не примите за хамство, но такой стиль программирования, на мой взгляд - просто извращение какое то.
Запрещать прерывания (входить в критическую секцию) я всегда предпочитал лишь для коротких, детерминированных участков кода. Например для LPC это код сброса WDT, который действительно нельзя прервать.

А вообще, по большому счету - на вкус и цвет ... , лишь бы в конце концов работало как требуеся.
Go to the top of the page
 
+Quote Post
DASM
сообщение May 5 2007, 09:50
Сообщение #14


Гуру
******

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



Что-то ничего не понял. Ну хорошо, запретили мы прерывания, потом по ходу осоводили какой-нить event который тут же сделал более приоритетную задачу готовой и тут же перешли в её код. Вот и фсе. И нарушится вся логика, так как в той задаче куда перешли шедулер уже не выручит по таймеру в частности. ИМХО - запрет прерываний - вообще не должен быть доступен на уровне написания приложения.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 5 2007, 12:18
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Abo @ May 5 2007, 12:37) *
Это как это - запрещать прерывания в одной задаче и разрешать в другой - я правильно понял?

Да.
Цитата
Если так - то не примите за хамство, но такой стиль программирования, на мой взгляд - просто извращение какое то.

Обсуждались ограничения применения. Это ограничение. Стоит так бездумно делать? Нет конечно. Можно без такого обойитсь? Наверняка да. Но случаи бывают разными, особено при обработке нештатных ситуаций.
Что касается конкретики - у меня, например, система собирается с двумя вариантами в зависимости от необходимости - c сохранением CPSR в локальной переменной и со счетчиком запретов прерывания. И плюс два подварианта - с запретом FIQ и без.
Цитата
Запрещать прерывания (входить в критическую секцию) я всегда предпочитал лишь для коротких, детерминированных участков кода.

Это явные запрещения прерываний, которые Вы явно контролируете, но запрещения прерываний неявно используются и для внутрисистемных целей.
Цитата
А вообще, по большому счету - на вкус и цвет ... , лишь бы в конце концов работало как требуеся.

Только на "в конце концов" крайне желательно получить с минимальными затратами ресурсов, с минимальным количеством рекламаций и максимально сопровождаемый (и что греха таить и заплаточным способом тоже) в будующем.

Цитата(DASM @ May 5 2007, 12:50) *
ИМХО - запрет прерываний - вообще не должен быть доступен на уровне написания приложения.

Да, ну разве только в исключительнейших случаях, когда критическим участком является буквально несколько строк кода, причем часто вызываемых, с гарантированным временем исполнения, и при этом жаба душит smile.gif дергать систему.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


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


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