|
|
  |
freertos и его enter_critical, в какой ртос как реализован CRITICAL |
|
|
|
May 4 2007, 10:53
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
May 4 2007, 11:16
|

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

|
Цитата(zltigo @ May 4 2007, 11:53)  На то она и железобетонная критическая секция. Что не мешает делать Вам что-то свое. У меня, например FIQ не запрещаются.
Ерунда какая-то - какие вложенные? Чего в ручную? Причем здесь критическая секция?
Не запускать другие задачи это не "критческая секция" - это "остановить шедулер", void vTaskSuspendAll() (в новых версиях переименовано в vTaskSuspendScheduler()), что естественно осуществляется без запретов прерываний. Причем во FreeRTOS при xTaskResumeScheduler() для простоявших задач восстановление делается максимально аккуратно. ну вобщем понятно . в ембосе под критической секцией понимается непереключение задач(как во фриртосе суспенд щедулер ) , а для "железобетона "есть __disable_interrupts(); а во фриртосе , наоборот - критическая секция это запрет прерывания, а для непереключения стоп щедулера. что более нужно неясно. я склюняюсь к тому что вариант ембоса - ибо когда мне нужен "железобетон" я просто запрещу перрывания , а когда у меня критический сектор - я просто хочу , чтобы у меня приложения например не вызывали перекрестное обращение к какой нибудь общей переменной.
--------------------
если еррата пуста - это не хорошо а плохо
|
|
|
|
|
May 4 2007, 11:42
|

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

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

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

|
Цитата(Abo @ May 4 2007, 16:13)  Чтобы трагически не закончилась можно делать disable ... restore. И вводить стек неизвестной длины? Со счетчиком проще. Можно, конечно, в статической переменной при входе в функцию запоминать состояние, но это неоправданный расход ресурсов, и централизация управления нарушается, к тому же операция должна быть атомарной. Хотя я лично себя с таким механизмом почему-то увереннее чувствую.
--------------------
Водку пьянствовать и безобразия нарушать!!!
|
|
|
|
|
May 4 2007, 13:31
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
May 5 2007, 07:54
|

Частый гость
 
Группа: Свой
Сообщений: 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 А использование одной локальной переменной не есть на мой взгляд транжирством стека. И никаких дополнительных ограничений на использование
|
|
|
|
|
May 5 2007, 09:37
|

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

|
Цитата(zltigo @ May 5 2007, 12:35)  Ограничение есть - disable() в одной функции а restore() в другой а то и в другой задаче. Это ограничение. Это как это - запрещать прерывания в одной задаче и разрешать в другой - я правильно понял? Если так - то не примите за хамство, но такой стиль программирования, на мой взгляд - просто извращение какое то. Запрещать прерывания (входить в критическую секцию) я всегда предпочитал лишь для коротких, детерминированных участков кода. Например для LPC это код сброса WDT, который действительно нельзя прервать. А вообще, по большому счету - на вкус и цвет ... , лишь бы в конце концов работало как требуеся.
|
|
|
|
|
May 5 2007, 12:18
|

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

|
Цитата(Abo @ May 5 2007, 12:37)  Это как это - запрещать прерывания в одной задаче и разрешать в другой - я правильно понял? Да. Цитата Если так - то не примите за хамство, но такой стиль программирования, на мой взгляд - просто извращение какое то. Обсуждались ограничения применения. Это ограничение. Стоит так бездумно делать? Нет конечно. Можно без такого обойитсь? Наверняка да. Но случаи бывают разными, особено при обработке нештатных ситуаций. Что касается конкретики - у меня, например, система собирается с двумя вариантами в зависимости от необходимости - c сохранением CPSR в локальной переменной и со счетчиком запретов прерывания. И плюс два подварианта - с запретом FIQ и без. Цитата Запрещать прерывания (входить в критическую секцию) я всегда предпочитал лишь для коротких, детерминированных участков кода. Это явные запрещения прерываний, которые Вы явно контролируете, но запрещения прерываний неявно используются и для внутрисистемных целей. Цитата А вообще, по большому счету - на вкус и цвет ... , лишь бы в конце концов работало как требуеся. Только на "в конце концов" крайне желательно получить с минимальными затратами ресурсов, с минимальным количеством рекламаций и максимально сопровождаемый (и что греха таить и заплаточным способом тоже) в будующем. Цитата(DASM @ May 5 2007, 12:50)  ИМХО - запрет прерываний - вообще не должен быть доступен на уровне написания приложения. Да, ну разве только в исключительнейших случаях, когда критическим участком является буквально несколько строк кода, причем часто вызываемых, с гарантированным временем исполнения, и при этом жаба душит  дергать систему.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|