Kris2007 0 4 апреля, 2012 Опубликовано 4 апреля, 2012 (изменено) · Жалоба Никто не поможет с атомарной реализацией под ARM? Неатомарная на Си(логика работы): LONG InterlockedExchangeAdd(LONG volatile *dest, LONG incr) { LONG res = (*dest); (*dest) += incr; return res; } Атомарная под x86(для linux): static inline LONG InterlockedExchangeAdd (LONG volatile * dest, LONG incr) { int ret; __asm __volatile__( "lock\n\t"\ "xaddl %0,(%1)" : "=r" (ret) : "r" (dest), "0" (incr) : "memory" ); return ret; } Изменено 4 апреля, 2012 пользователем IgorKossak [code]!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 236 4 апреля, 2012 Опубликовано 4 апреля, 2012 · Жалоба Какой из ARM? Под ARM7/Cortex-M3 такое по-моему невозможно, только запретом прерываний. Просто InterlockedExchange можно: LONG InterlockedExchange(LONG val, LONG volatile *dest); _InterlockedExchange: SWP R0, R0, [R1] BX LR Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 4 апреля, 2012 Опубликовано 4 апреля, 2012 · Жалоба Под ARM7/Cortex-M3 такое по-моему невозможно, только запретом прерываний. под Cortex-M3 есть ldrex/strex можно без запрета прерываний обойтись! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 236 5 апреля, 2012 Опубликовано 5 апреля, 2012 · Жалоба Да, интересные команды, не знал. Вот только не очень ясен механизм их работы... Нужно-ли во всех обработчиках прерываний ставить CLREX или она выполняется аппаратно при любом прерывании? Или там какой-то другой механизм работы? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
neiver 0 5 апреля, 2012 Опубликовано 5 апреля, 2012 · Жалоба Я немного писал про команды ldrex/strex и как их использовать тут. Правда я не совсем точно описал работу этих команд. Фразу "любая запись в память нарушает эксклюзивный доступ" следует читать как "использование команд ldrex/strex/clrex с другим адресом или ldrex/clrex с тем-же нарушает эксклюзивный доступ". Еще в GCC есть встроенные фкнкции для атомарных операций: http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gc...c-Builtins.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kris2007 0 5 апреля, 2012 Опубликовано 5 апреля, 2012 (изменено) · Жалоба ARM9 Нужно именно InterlockedExchangeAdd. Эта функция реализована под многие платформы в коде, а под ARM9 пока стоит неатомарная сишная версия( Изменено 5 апреля, 2012 пользователем Kris2007 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 5 апреля, 2012 Опубликовано 5 апреля, 2012 · Жалоба Нужно-ли во всех обработчиках прерываний ставить CLREX или она выполняется аппаратно при любом прерывании? Или там какой-то другой механизм работы? CLREX ставить не нужно! в прерываниях нужно тоже использовать LDREX STREX и по STREX флаг снимется. в доках на АРМ есть примеры как использовать. там практически любую конструкцию можно сделать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 236 5 апреля, 2012 Опубликовано 5 апреля, 2012 · Жалоба вот только с ARM9 это не поможет... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться