Перейти к содержанию
    

InterlockedExchangeAdd под ARM

Никто не поможет с атомарной реализацией под 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;
}

Изменено пользователем IgorKossak
[code]!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Какой из ARM?

Под ARM7/Cortex-M3 такое по-моему невозможно, только запретом прерываний.

Просто InterlockedExchange можно:

LONG InterlockedExchange(LONG val, LONG volatile *dest);

_InterlockedExchange:

SWP R0, R0, [R1]

BX LR

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Под ARM7/Cortex-M3 такое по-моему невозможно, только запретом прерываний.

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, интересные команды, не знал.

Вот только не очень ясен механизм их работы...

Нужно-ли во всех обработчиках прерываний ставить CLREX или она выполняется аппаратно при любом прерывании?

Или там какой-то другой механизм работы?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я немного писал про команды ldrex/strex и как их использовать тут. Правда я не совсем точно описал работу этих команд. Фразу "любая запись в память нарушает эксклюзивный доступ" следует читать как "использование команд ldrex/strex/clrex с другим адресом или ldrex/clrex с тем-же нарушает эксклюзивный доступ".

Еще в GCC есть встроенные фкнкции для атомарных операций: http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gc...c-Builtins.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ARM9

Нужно именно InterlockedExchangeAdd. Эта функция реализована под многие платформы в коде, а под ARM9 пока стоит неатомарная сишная версия(

Изменено пользователем Kris2007

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нужно-ли во всех обработчиках прерываний ставить CLREX или она выполняется аппаратно при любом прерывании?

Или там какой-то другой механизм работы?

CLREX ставить не нужно! в прерываниях нужно тоже использовать LDREX STREX и по STREX флаг снимется.

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...