|
|
  |
Требуется совет по выбору RTOS, программист я хреновый |
|
|
|
Apr 21 2006, 06:20
|

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

|
Цитата(dxp @ Apr 21 2006, 08:42)  А зачем такие навороты с подсчетом входов, анализом их при выходе и т.д.? -Ну про 'навороты' это уж перебор :-) -Безболезненная вложенность. -При использовании этого механизма без левых запретов прерывания будет отсутствовать это: Цитата во-вторых, а если при первом вызове прерывания были по какой-то причине запрещены? Ведь при выходе они будут разрешены, что есть нарушение логики работы программы. Цитата прилично кода - накладные расходы, т.е. Одного порядка, на самом деле, в FreeRTOS случае дополнительная работа со счетчиком в памяти, в варианте "с сохранением" тоже работа с памятью - считать-запомнить-прочитать-записать. Цитата Почему бы не использовать простую схему (псевдокод): .... Единственное требование - это необходимо жестко соблюдать комплементарность вызвовов этих функций, но это надо делать при любом подходе. -Увы, не единственное, вроде уже распинался :-(. - в варианте "со счетчиком" комплементарность можно слегка нарушить :-) лишними вызовами конца критической секции. Цитата(DASM @ Apr 21 2006, 08:46)  объясните неразумному, почему EnterCriticalSection у вас ассоцируется с запретом прерываний ? Мне это как-то неочевидно.. У меня не ассоциируется, просто здесь речь идет о двух реалиациях оных в двух конкретных системах, которые обе базируются на таком решении. Обсуждаются отличия, причем автором во главу угла была поставлена (если я правильно все это понимаю) мнимая большая дуракоустойчивость TNKernel в сравнении c FreeRTOS.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 21 2006, 06:26
|

Знающий
   
Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206

|
Цитата(DASM @ Apr 21 2006, 12:01)  а мне всегда казалось, что назначение критических секций - это не допустить одновременного использования одного расшаренного ресурса разными потоками...... Нет, этот сервис предоставляется семафорами. Цитата Про прерывания течения кода как-то читать не доводилось... Где я могу просветить свою темноту ? Да хоть не любимого тобой Лябрусса  , книгу по uCOS
--------------------
Пасу котов...
|
|
|
|
|
Apr 21 2006, 06:51
|
Гуру
     
Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493

|
Извините за ошибки распознования текста finereader -ом Семафоры Объекты ядра «семафор» используются для учета ресурсов. Как и все объекты ядра они содержат счетчик числа пользователей, но, кроме того, поддерживают два 32-битных значения со знаком: одно определяет максимальное число ресурсов (контролируемое семафором), другое используется как счетчик текущего числа ресурсов.
Мьютексы Объекты ядра «мьютексы» гарантируют потокам взаимоисключающий доступ к единственному ресурсу. Отсюда и произошло название этих объектов (mutual exclusion, mutex). Они содержат счетчик числа пользователей, счетчик рекурсии и переменную', в которой запоминается идентификатор потока. Мьютексы ведут себя точно так же, как и критические секции. Однако, если последние являются объектами пользовательского режима, то мьютексы — объектами ядра. Кроме того, единственный объект-мью-текс позволяет синхронизировать доступ к ресурсу нескольких потоков из разных процессов; при этом можно задать максимальное время ожидания доступа к ресурсу.
Критические секции Критическая секция (critical section) — это небольшой участок кода, требующий монопольного доступа к каким-то общим данным. Она позволяет сделать так, чтобы единовременно только один поток получал доступ к определенному ресурсу. Естественно, система может в любой момент вытеснить Ваш поток и подключить к процессору другой, но ни один из потоков, которым нужен занятый Вами ресурс, не получит процессорное время до тех пор, пока Ваш поток не выйдет за границы критической секции.
Насчет то чего читать - давай тогда Дейкстру поднимем, как основателя теории синхронизации.... Лябрус он больше по рюшечкам, сеггеру, и безумным ГУЯм
|
|
|
|
|
Apr 21 2006, 06:54
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(zltigo @ Apr 21 2006, 13:20)  -Безболезненная вложенность. -При использовании этого механизма без левых запретов прерывания будет отсутствовать это: Цитата во-вторых, а если при первом вызове прерывания были по какой-то причине запрещены? Ведь при выходе они будут разрешены, что есть нарушение логики работы программы.
В варианте с сохранением/восстановлением аналогично - вложенность безболезненная. Зато есть ограничение - нельзя самому рулить состоянием прерываний. Цитата(zltigo @ Apr 21 2006, 13:20)  Цитата прилично кода - накладные расходы, т.е.
Одного порядка, на самом деле, в FreeRTOS случае дополнительная работа со счетчиком в памяти, в варианте "с сохранением" тоже работа с памятью - считать-запомнить-прочитать-записать. Ну да, тут в корне меньше - записал в память, на выходе извлек. А со счетчиком - прочитал, проинкрементировал, записал. (на входе), прочитал, проанализировал, сделал переход (а переход сам по себе наклАдная инструкция, и чем толще проц, тем она наклАднее), декрементировал, записал обратно в память. Фигассе! Вот реализация по схеме сохранил/восстановил для AVR: Вход: Код TCritSect cs; B72F IN R18, 0x3F 8328 ST Y, R18 94F8 CLI выход Код 8108 LD R16, Y BF0F OUT 0x3F, R16 Что может быть короче и нативнее? Цитата(zltigo @ Apr 21 2006, 13:20)  Цитата Почему бы не использовать простую схему (псевдокод): .... Единственное требование - это необходимо жестко соблюдать комплементарность вызвовов этих функций, но это надо делать при любом подходе.
-Увы, не единственное, вроде уже распинался :-(. Прошу прощения, я как-то пропустил это. Можно для меня напомнить что там не единственное? Цитата(zltigo @ Apr 21 2006, 13:20)  - в варианте "со счетчиком" комплементарность можно слегка нарушить :-) лишними вызовами конца критической секции. Как это нарушить? Т.е. вход вызвали 3 раза и выход 4? Но ведь при этом работать-то оно будет неправильно - прерывания будут разрешены не в том месте, где были запрещены.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Apr 21 2006, 07:25
|

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

|
Цитата(dxp @ Apr 21 2006, 09:54)  Ну да, тут в корне меньше - записал в память, на выходе извлек. А со счетчиком - прочитал, проинкрементировал, записал. (на входе), прочитал, проанализировал, сделал переход (а переход сам по себе наклАдная инструкция, и чем толще проц, тем она наклАднее), декрементировал, записал обратно в память. Фигассе! Вот реализация по схеме сохранил/восстановил для AVR: Ну а теперь "на бис" для ARM, о которых здесь речь :-). И не в регистр сохранять. В ARM с памятью поработать - много хуже :-(. И заменитель 'CLI' выглядит тоскливо (выше приводил кусок кода). Зато у ARM "переходы" через несколько команд могут начисто отсутствовать. В результате разница будет крайне невелика. Цитата Прошу прощения, я как-то пропустил это. Можно для меня напомнить что там не единственное? Либо руками (Про C++ - не надо, я в курсе) будете выделять индивидуальную память для сохранения текущего зачения при каждом вызове, либо не будет вложенности. Про комплиментарноть - ниже. Цитата Как это нарушить? Т.е. вход вызвали 3 раза и выход 4? Но ведь при этом работать-то оно будет неправильно - прерывания будут разрешены не в том месте, где были запрещены. Хоть 444 раза - посмотрите код - действия просто будут проигнорированы, в отличие от варианта "с сохранением" в котором будет упорно переписываться последнее сохраненное бог всесть когда значение, а если еще и в регистре сохранить :-)
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 21 2006, 07:35
|

Частый гость
 
Группа: Свой
Сообщений: 173
Регистрация: 30-11-05
Из: San Francisco
Пользователь №: 11 593

|
А DASM вроде как прав получается, касательно критической секции. Если Таненбаума книгу "Современные ОС" посмотреть, так там написано, что Критическая секция служит для того, чтобы предотвратить одновременный доступ к обшим данным. Одно из требований, это то, что в критической области не могут находиться одновременно 2 процесса. Но для этого действительно не обязательно запрещать прерывания. Поток находящийся в крит.секции, может вытесниться, но если какой другой поток захочет в нее войти, он должен ожидать пока она освободится. Там есть рисунок, где рассматривается именно случай, когда 2-й поток вытесняет первый, пока он находится в крит.секции, и тоже пытается в нее войти. В результате он блокируется пока крит. секция не освободится.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|