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

 
 
7 страниц V  « < 3 4 5 6 7 >  
Reply to this topicStart new topic
> Требуется совет по выбору RTOS, программист я хреновый
vet
сообщение Apr 21 2006, 07:42
Сообщение #61


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



http://en.wikipedia.org/wiki/Critical_section


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Apr 21 2006, 07:44
Сообщение #62


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



Цитата(zltigo @ Apr 20 2006, 23:51) *
Цитата(sensor_ua @ Apr 20 2006, 23:12) *

Насчет "сложнее и ненадежнее", то интересны аргументы. Если только "персональность" переменной для хранения статуса, то уже обсуждали.

Еще раз повторить?
1. Сложнее - вместо простейшей обертки над стандартной де-факто библиотечной функции гарантированно работающей на любом процессоре. Писанная на асме чисто армовсая, да еще с заточкой под ARM Mode
2. Ненадежнее - легко ошибиться (особенно не зная потрохов и соответствено границ применимости)
при использовании вложеных критических секций. Про macros писал - ну просто подстава чистейшей воды. Практически использование недалеко ушло от аккуратного использования пресловутого запрещения прерывания.
Цитата
А насчет "Простое запрещение прерываний" хотелось бы отклониться в сторону

А ненадо отклоняться, ибо все равно оно имеет место быть.

Это TNKernel:
Код
tn_cpu_save_sr:

        mrs    r0,CPSR
        orr    r1,r0,#NOINT
        msr    CPSR_c,r1
;-- Atmel add-on
        mrs    r1,CPSR            ;-- Check CPSR for correct contents
        and    r1,r1,#NOINT
        cmp    r1,#NOINT
        bne    tn_cpu_save_sr     ;-- Not disabled - loop to try again
;--------

        bx     lr


Это кусок IARовской библиотеки:
Код
        cfi_ARM_BLOCK_start disableInterrupt_a
        
        CODE32
??DiI_a        
        mrs        r12,CPSR
        orr        r12,r12,#0xC0
        msr        CPSR_c,r12

        mrs   r12,CPSR
    ands  r12,r12,#+0xC0    
        beq   ??DiI_a

        bx        lr

        cfi_ARM_BLOCK_end disableInterrupt_a


Как Вам разница?


Мои познания в асме закончились на #+0xC0.
Вообще же, как по мне - не очень-то и разнится код - похоже, смысл тот же.
Правда чуть короче запись.
Пока пороюсь поищу что такое #+0xC0, а то "чукча не читатель";)))
Может подскажете, где? А то ARM7TDMI Data Sheet (ARM DDI 0029E) не помогает...


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
DASM
сообщение Apr 21 2006, 07:45
Сообщение #63


Гуру
******

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



Цитата(vet @ Apr 21 2006, 11:42) *

Глупость это. Причем тут КОД ? Представьте себе 128 экземпляров некоего класса. Код у них один и тот же, разные у них данные. Пусть объект один захватил за попку одну девушку (разделяемый ресурс, вошел в свою критическую секцию) Да, это не даст другим экземплярам трогать туже поку, но разве это запрещает другим экземплярам лапать другие попы ? В том же участке кода, теми же руками. Просто Критические секции будут разными, разными объектами в памяти. И запрещать тут прерывания - форменное свинство.
Go to the top of the page
 
+Quote Post
vet
сообщение Apr 21 2006, 07:57
Сообщение #64


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Продолжаю цитирование.
A solution to the critical section problem, first posed by Dijkstra [1], is a fundamental requirement for concurrent program control. The problem is to ensure that no two processes are in a specified area of their programs (the critical section) at the same time.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
DASM
сообщение Apr 21 2006, 07:58
Сообщение #65


Гуру
******

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



Продолжу несогласие, Критическая секция защишает РЕСУРС а не код, который исполняется (его вообще защищать не надо)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 21 2006, 08:02
Сообщение #66


Гуру
******

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



Цитата(sensor_ua @ Apr 21 2006, 10:44) *
Вообще же, как по мне - не очень-то и разнится код - похоже, смысл тот же.

Ага, для этого вывода и приводились эти куски. Только один почему-то в результате "анализа"
был признан непонятным и некошерным. Что меня и удивило и подвигнуло на мой первый пост.
Вот собственно и все.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
vet
сообщение Apr 21 2006, 08:04
Сообщение #67


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



DASM
Ресурс можно защищать и мьютексами, они для этого и придуманы. А критическая секция придумана для немного других вещей, на что и указывает цитируемый классик. В частности - для обеспечения реентерабельности кода, мьютексом её делать немного не с руки, а КС - в самый раз.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Apr 21 2006, 08:13
Сообщение #68


Знающий
****

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



Цитата(zuy @ Apr 21 2006, 13:35) *
А DASM вроде как прав получается, касательно критической секции.
Если Таненбаума книгу "Современные ОС" посмотреть, так там написано, что
Критическая секция служит для того, чтобы предотвратить одновременный доступ к обшим данным. Одно из требований, это то, что в критической области не могут находиться одновременно 2 процесса.
Но для этого действительно не обязательно запрещать прерывания. Поток находящийся в крит.секции, может вытесниться, но если какой другой поток захочет в нее войти, он должен ожидать пока она освободится.


В общем, спор о терминах.
В принципе можно называть критической секцией любую секцию, где предотвращается одновременный доступ к каким-либо ресурсам из разных процессов. Способ реализации может быть, как методом запрета прерываний, так и с организацией доступа через бинарный семафор (или можно применить модное слово мютекс smile.gif) или какой-нибудь флаг.
Причем иногда доступ запретом прерываний вообще может оказаться не приемлем, потому как ресурс, доступ к которому разделяется, может сам работать через прерывания, например захватили uart, передали строку символов, освободили uart. Понятно, что разделить доступ к такому ресурсу через запрет прерываний нельзя.
Другое дело, когда надо сделать действие, достаточно короткое и быстрое, но требующее также гарантий ограничения доступа к этом ресурсу. Например, работа со связанными списками. Вставка элемента списка в цепочку должна быть сделана в критической секции. Но пользование в этом случае системных сервисов ОС (типа мютексов) - нецелесообразно, потому как накладные расходы возрастут раз в 100 по сравнению с методом разрешения/запрещения прерываний.
И совсем другое дело, когда говорится о критических секциях, используемых в самой ОС, то есть когда сервисы ОС прописываются. Здесь термин "критическая секция" как раз всегда означает запрещение прерываний. А речь как раз о них и была (выше по теме).
У меня терминология (моя локальная) устоялась так, что критической секцией я называю секцию, где запрещены прерывания, и не важно, используется в проекте ОС или нет.


Цитата(sensor_ua @ Apr 21 2006, 13:44) *
Пока пороюсь поищу что такое #+0xC0, а то "чукча не читатель";)))
Может подскажете, где? А то ARM7TDMI Data Sheet (ARM DDI 0029E) не помогает...


#0xC0 маска для запрета IRQ и FIQ прерываний
Маска 0x80 для регистра CPSR - это запрет IRQ , а 0x40 - для запрета FIQ.


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
DASM
сообщение Apr 21 2006, 08:13
Сообщение #69


Гуру
******

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



тогда предлагаю прямо и говорить "я называю критической секцией стакан с пивом, поэтому у нас несогласованность терминологий"
Простенький пример, скажите, что тут защищает КОД ??
Код
CRITICAL_SECTION cs;
CRITICAL_SECTION cs1;
//
struct common_struct{
    int a;    
    CRITICAL_SECTION* myGuard;
};
//
DWORD WINAPI MyThread (LPVOID *p)
{
    common_struct *pstruct = (common_struct *)p;
    for (;;)
    {
        EnterCriticalSection(pstruct->myGuard);
        pstruct->a++;
        LeaveCriticalSection(pstruct->myGuard);
        Sleep(0);
    }
    return 0;
}
//
int _tmain(int argc, _TCHAR* argv[])
{
    DWORD dwID = 0;
    common_struct com1 =  {0, &cs}, com2 = {0, &cs1};
    InitializeCriticalSection(&cs); InitializeCriticalSection(&cs1);
    HANDLE hMyThr1 = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)MyThread, &com1, CREATE_SUSPENDED, &dwID);
    HANDLE hMyThr2 = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)MyThread,  &com2, CREATE_SUSPENDED, &dwID);
    ResumeThread(hMyThr1);
    ResumeThread(hMyThr2);
    for (;;)
    {
    }
    return 0;
}
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Apr 21 2006, 08:20
Сообщение #70


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



У меня железка с неким ногодрыганием, устроенным типа импровизированной шины. Как известно, GPIO сами не имеют в АРМ операций чтение-модификация-запись, дык ещё в железке есть выборки внешних устройств на "шине" через опять же GPIO. Если подвигать GPIO в прерывании, а оно может возникнуть когда двигались GPIO вне прерывания, чегой-то нужно сохранять. Т.е. либо в административном порядке запрещать использовать GPIO в прерывании, либо реализовать атомарность каким-либо способом. АРМ позволяет, например, выполнить SWI, можно просто запрещать прерывания на входе в критическую секцию, при выходе - разрешать, но тогда если при входе если были запрещены прерывания, при выходе они разрешатся... иначе нужно при входе не просто запрещать, а сохранять регистр статуса, затем запрещать прерывания, а при выходе всего-лишь восстанавливать что было. Можно вообще завести обработчик IRQ, в который вваливаться через VICSoftInt, а там творить чего угодно, пока не разрешили вложенные прерыванияwink.gif...

Цитата(Andy Mozzhevilov @ Apr 21 2006, 11:13) *
Цитата(zuy @ Apr 21 2006, 13:35) *

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


В общем, спор о терминах.
В принципе можно называть критической секцией любую секцию, где предотвращается одновременный доступ к каким-либо ресурсам из разных процессов. Способ реализации может быть, как методом запрета прерываний, так и с организацией доступа через бинарный семафор (или можно применить модное слово мютекс smile.gif) или какой-нибудь флаг.
Причем иногда доступ запретом прерываний вообще может оказаться не приемлем, потому как ресурс, доступ к которому разделяется, может сам работать через прерывания, например захватили uart, передали строку символов, освободили uart. Понятно, что разделить доступ к такому ресурсу через запрет прерываний нельзя.
Другое дело, когда надо сделать действие, достаточно короткое и быстрое, но требующее также гарантий ограничения доступа к этом ресурсу. Например, работа со связанными списками. Вставка элемента списка в цепочку должна быть сделана в критической секции. Но пользование в этом случае системных сервисов ОС (типа мютексов) - нецелесообразно, потому как накладные расходы возрастут раз в 100 по сравнению с методом разрешения/запрещения прерываний.
И совсем другое дело, когда говорится о критических секциях, используемых в самой ОС, то есть когда сервисы ОС прописываются. Здесь термин "критическая секция" как раз всегда означает запрещение прерываний. А речь как раз о них и была (выше по теме).
У меня терминология (моя локальная) устоялась так, что критической секцией я называю секцию, где запрещены прерывания, и не важно, используется в проекте ОС или нет.


Цитата(sensor_ua @ Apr 21 2006, 13:44) *
Пока пороюсь поищу что такое #+0xC0, а то "чукча не читатель";)))
Может подскажете, где? А то ARM7TDMI Data Sheet (ARM DDI 0029E) не помогает...


#0xC0 маска для запрета IRQ и FIQ прерываний
Маска 0x80 для регистра CPSR - это запрет IRQ , а 0x40 - для запрета FIQ.

Простите, не указал точно - мне непонятно только "#+"


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Apr 21 2006, 08:42
Сообщение #71


Знающий
****

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



Цитата(sensor_ua @ Apr 21 2006, 14:20) *
Простите, не указал точно - мне непонятно только "#+"


Ну, это значит "не минус" smile.gif

Цитата(DASM @ Apr 21 2006, 14:13) *
тогда предлагаю прямо и говорить "я называю критической секцией стакан с пивом, поэтому у нас несогласованность терминологий"
Простенький пример, скажите, что тут защищает КОД ??

понятия не имею.


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Apr 21 2006, 08:46
Сообщение #72


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



Цитата
Ну, это значит "не минус" smile.gif

Спасибо.


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
zuy
сообщение Apr 21 2006, 08:49
Сообщение #73


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

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



to: Andy Mozzhevilov
Действительно реализация крит.секций может быть как с прерываниями так и без. Но применительно к ОС (мы же в этой теме рассматриваем именно прерывания для организации крит.секции в ОС) имеет место быть целый параграф у Таненбаума. В в итоге он пишет, что запрет прерываний, бывает полезным при использовании крит.секции в самой ОС, но это решение не приемлемо в качестве механизма взаимного исключения для пользовательских процессов.

To DASM:
Пример IMHO не совсем корректен. Т.к. проблема синхронизации ставится при опастности свместного использования одних и тех же данных, и именно это общие данные защишаются запретом исполнения кода который их использует. А в Вашем примере, если я конечно правильно понял, две КС защищают каждая свои данные. Т.е. конкуренции то нет.
Go to the top of the page
 
+Quote Post
DASM
сообщение Apr 21 2006, 08:56
Сообщение #74


Гуру
******

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



правильно, конкуренции нет, но КУСОК КОДА то исполняется конкурентно ? Что и требовалсь показать. Всего лишь
Go to the top of the page
 
+Quote Post
zuy
сообщение Apr 21 2006, 09:01
Сообщение #75


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

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



Ааааа, все, понял к чему пример.
Как раз к прерываниям в КС. Все верно, если бы КС делалась через запрет прерывания, то тут была бы лажа, потоки бы блокировались без нужды.
Go to the top of the page
 
+Quote Post

7 страниц V  « < 3 4 5 6 7 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


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


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