|
|
  |
Требуется совет по выбору RTOS, программист я хреновый |
|
|
|
Apr 21 2006, 07:44
|
Профессионал
    
Группа: Свой
Сообщений: 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
|
|
|
|
|
Apr 21 2006, 08:02
|

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

|
Цитата(sensor_ua @ Apr 21 2006, 10:44)  Вообще же, как по мне - не очень-то и разнится код - похоже, смысл тот же. Ага, для этого вывода и приводились эти куски. Только один почему-то в результате "анализа" был признан непонятным и некошерным. Что меня и удивило и подвигнуло на мой первый пост. Вот собственно и все.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 21 2006, 08:13
|

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

|
Цитата(zuy @ Apr 21 2006, 13:35)  А DASM вроде как прав получается, касательно критической секции. Если Таненбаума книгу "Современные ОС" посмотреть, так там написано, что Критическая секция служит для того, чтобы предотвратить одновременный доступ к обшим данным. Одно из требований, это то, что в критической области не могут находиться одновременно 2 процесса. Но для этого действительно не обязательно запрещать прерывания. Поток находящийся в крит.секции, может вытесниться, но если какой другой поток захочет в нее войти, он должен ожидать пока она освободится. В общем, спор о терминах. В принципе можно называть критической секцией любую секцию, где предотвращается одновременный доступ к каким-либо ресурсам из разных процессов. Способ реализации может быть, как методом запрета прерываний, так и с организацией доступа через бинарный семафор (или можно применить модное слово мютекс  ) или какой-нибудь флаг. Причем иногда доступ запретом прерываний вообще может оказаться не приемлем, потому как ресурс, доступ к которому разделяется, может сам работать через прерывания, например захватили 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.
--------------------
Пасу котов...
|
|
|
|
|
Apr 21 2006, 08:13
|
Гуру
     
Группа: Свой
Сообщений: 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; }
|
|
|
|
|
Apr 21 2006, 08:20
|
Профессионал
    
Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387

|
У меня железка с неким ногодрыганием, устроенным типа импровизированной шины. Как известно, GPIO сами не имеют в АРМ операций чтение-модификация-запись, дык ещё в железке есть выборки внешних устройств на "шине" через опять же GPIO. Если подвигать GPIO в прерывании, а оно может возникнуть когда двигались GPIO вне прерывания, чегой-то нужно сохранять. Т.е. либо в административном порядке запрещать использовать GPIO в прерывании, либо реализовать атомарность каким-либо способом. АРМ позволяет, например, выполнить SWI, можно просто запрещать прерывания на входе в критическую секцию, при выходе - разрешать, но тогда если при входе если были запрещены прерывания, при выходе они разрешатся... иначе нужно при входе не просто запрещать, а сохранять регистр статуса, затем запрещать прерывания, а при выходе всего-лишь восстанавливать что было. Можно вообще завести обработчик IRQ, в который вваливаться через VICSoftInt, а там творить чего угодно, пока не разрешили вложенные прерывания  ... Цитата(Andy Mozzhevilov @ Apr 21 2006, 11:13)  Цитата(zuy @ Apr 21 2006, 13:35)  А DASM вроде как прав получается, касательно критической секции. Если Таненбаума книгу "Современные ОС" посмотреть, так там написано, что Критическая секция служит для того, чтобы предотвратить одновременный доступ к обшим данным. Одно из требований, это то, что в критической области не могут находиться одновременно 2 процесса. Но для этого действительно не обязательно запрещать прерывания. Поток находящийся в крит.секции, может вытесниться, но если какой другой поток захочет в нее войти, он должен ожидать пока она освободится.
В общем, спор о терминах. В принципе можно называть критической секцией любую секцию, где предотвращается одновременный доступ к каким-либо ресурсам из разных процессов. Способ реализации может быть, как методом запрета прерываний, так и с организацией доступа через бинарный семафор (или можно применить модное слово мютекс  ) или какой-нибудь флаг. Причем иногда доступ запретом прерываний вообще может оказаться не приемлем, потому как ресурс, доступ к которому разделяется, может сам работать через прерывания, например захватили 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
|
|
|
|
|
Apr 21 2006, 08:42
|

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

|
Цитата(sensor_ua @ Apr 21 2006, 14:20)  Простите, не указал точно - мне непонятно только "#+" Ну, это значит "не минус"  Цитата(DASM @ Apr 21 2006, 14:13)  тогда предлагаю прямо и говорить "я называю критической секцией стакан с пивом, поэтому у нас несогласованность терминологий" Простенький пример, скажите, что тут защищает КОД ?? понятия не имею.
--------------------
Пасу котов...
|
|
|
|
|
Apr 21 2006, 08:46
|
Профессионал
    
Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387

|
Цитата Ну, это значит "не минус" smile.gif Спасибо.
--------------------
aka Vit
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|