Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: InterlockedExchangeAdd под ARM
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Kris2007
Никто не поможет с атомарной реализацией под 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;
}
jcxz
Какой из ARM?
Под ARM7/Cortex-M3 такое по-моему невозможно, только запретом прерываний.
Просто InterlockedExchange можно:
LONG InterlockedExchange(LONG val, LONG volatile *dest);
_InterlockedExchange:
SWP R0, R0, [R1]
BX LR
KRS
Цитата(jcxz @ Apr 4 2012, 22:45) *
Под ARM7/Cortex-M3 такое по-моему невозможно, только запретом прерываний.

под Cortex-M3 есть ldrex/strex можно без запрета прерываний обойтись!

jcxz
Да, интересные команды, не знал.
Вот только не очень ясен механизм их работы...
Нужно-ли во всех обработчиках прерываний ставить CLREX или она выполняется аппаратно при любом прерывании?
Или там какой-то другой механизм работы?
neiver
Я немного писал про команды ldrex/strex и как их использовать тут. Правда я не совсем точно описал работу этих команд. Фразу "любая запись в память нарушает эксклюзивный доступ" следует читать как "использование команд ldrex/strex/clrex с другим адресом или ldrex/clrex с тем-же нарушает эксклюзивный доступ".
Еще в GCC есть встроенные фкнкции для атомарных операций: http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gc...c-Builtins.html
Kris2007
ARM9
Нужно именно InterlockedExchangeAdd. Эта функция реализована под многие платформы в коде, а под ARM9 пока стоит неатомарная сишная версия(
KRS
Цитата(jcxz @ Apr 5 2012, 10:48) *
Нужно-ли во всех обработчиках прерываний ставить CLREX или она выполняется аппаратно при любом прерывании?
Или там какой-то другой механизм работы?

CLREX ставить не нужно! в прерываниях нужно тоже использовать LDREX STREX и по STREX флаг снимется.
в доках на АРМ есть примеры как использовать. там практически любую конструкцию можно сделать.

jcxz
вот только с ARM9 это не поможет...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.