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

Многоядерность, параллельность: работает, но после сброса

Вот есть ещё такие - софтовые спинлоки для камней Allwinner: https://github.com/uli/allwinner-bare-metal/blob/master/spinlock.c :biggrin:

38 minutes ago, Arlleex said:

Да, спинлоки реализуются на инструкциях атомарного доступа CPU

Так а где эта атомарность полезна?  Допустим во время операции спинлока произошло прерывание.  Почему это может быть нежелательно?

 

P.S. Вопрос-оффтопик:  как запретить прерывания на уровне  ядра Xtensa?

Пока делаю так, но хочется более атомарнее:

static inline void CLI(void) //disable all interrupt levels
{
 u32 i;
 __asm__ __volatile__ ("rsr.ps %0" : "=r"(i));
 i|=0xF;
 __asm__ __volatile__ ("wsr.ps %0" :: "r"(i));
 __asm__ __volatile__ ("rsync");
}

static inline void STI(void) //enable all interrupt levels
{
 u32 i;
 __asm__ __volatile__ ("rsr.ps %0" : "=r"(i));
 i&=~0xF;
 __asm__ __volatile__ ("wsr.ps %0" :: "r"(i));
 __asm__ __volatile__ ("rsync");
}

 

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

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


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

24 минуты назад, repstosw сказал:

Вот есть ещё такие - софтовые спинлоки для камней Allwinner: https://github.com/uli/allwinner-bare-metal/blob/master/spinlock.c :biggrin:

Это не отменяет мною написанного - в данном случае спин-блокировки реализованы на инструкциях эксклюзивного доступа ARM-процессора, однако тут есть нюансы, связанные с гранулярностью областей памяти, подлежащих обследованию глобальным монитором системы памяти на предмет изменений. Мне неизвестны ARM-ы, где глобальный (вернее, для одноядерных микроконтроллеров - локальный) монитор "следил" бы за каждой ячейкой ОЗУ. Обычно это ячейки в несколько кБайт - при записи в любую часть такой "гранулы" памяти триггер эксклюзивного доступа сбросится. Поэтому в системе с кучей спинлок-переменных это может быть проблемой...
 

24 минуты назад, repstosw сказал:

Допустим во время операции спинлока произошло прерывание.

... в котором попытались захватить тот же спинлок и мир схлопнулся.
 

Цитата

Так а где эта атомарность полезна?

Вы не сможете написать корректный спинлок без атомарных операций обмена или эксклюзивного доступа:wink: Вот и вся полезность.
Ну, вернее, написать сможете (только не для CPU с внеочередным исполнением), но результирующий код Вам не понравится совершенно😆

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


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

1 hour ago, Arlleex said:

Ну, вернее, написать сможете (только не для CPU с внеочередным исполнением), но результирующий код Вам не понравится совершенно😆

А если я дам гарантии, что ни один обработчик прерывания не работает со спинлоками и с расшаренной памятью?

У меня строго цикл. Только в main() идут операции с SHARED memory.  А обработчики прерываний работают в пределах ресурсов управляющего процессора

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

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


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

23 минуты назад, repstosw сказал:

А если я дам гарантии, что ни один обработчик прерывания не работает со спинлоками и с расшаренной памятью?

Тогда вольны придумывать свои механизмы, главное, чтобы работали правильно.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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