repstosw 18 23 октября, 2023 Опубликовано 23 октября, 2023 (изменено) · Жалоба Вот есть ещё такие - софтовые спинлоки для камней Allwinner: https://github.com/uli/allwinner-bare-metal/blob/master/spinlock.c 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"); } Изменено 23 октября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 180 23 октября, 2023 Опубликовано 23 октября, 2023 · Жалоба 24 минуты назад, repstosw сказал: Вот есть ещё такие - софтовые спинлоки для камней Allwinner: https://github.com/uli/allwinner-bare-metal/blob/master/spinlock.c Это не отменяет мною написанного - в данном случае спин-блокировки реализованы на инструкциях эксклюзивного доступа ARM-процессора, однако тут есть нюансы, связанные с гранулярностью областей памяти, подлежащих обследованию глобальным монитором системы памяти на предмет изменений. Мне неизвестны ARM-ы, где глобальный (вернее, для одноядерных микроконтроллеров - локальный) монитор "следил" бы за каждой ячейкой ОЗУ. Обычно это ячейки в несколько кБайт - при записи в любую часть такой "гранулы" памяти триггер эксклюзивного доступа сбросится. Поэтому в системе с кучей спинлок-переменных это может быть проблемой... 24 минуты назад, repstosw сказал: Допустим во время операции спинлока произошло прерывание. ... в котором попытались захватить тот же спинлок и мир схлопнулся. Цитата Так а где эта атомарность полезна? Вы не сможете написать корректный спинлок без атомарных операций обмена или эксклюзивного доступа Вот и вся полезность. Ну, вернее, написать сможете (только не для CPU с внеочередным исполнением), но результирующий код Вам не понравится совершенно😆 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 23 октября, 2023 Опубликовано 23 октября, 2023 (изменено) · Жалоба 1 hour ago, Arlleex said: Ну, вернее, написать сможете (только не для CPU с внеочередным исполнением), но результирующий код Вам не понравится совершенно😆 А если я дам гарантии, что ни один обработчик прерывания не работает со спинлоками и с расшаренной памятью? У меня строго цикл. Только в main() идут операции с SHARED memory. А обработчики прерываний работают в пределах ресурсов управляющего процессора Изменено 23 октября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 180 23 октября, 2023 Опубликовано 23 октября, 2023 · Жалоба 23 минуты назад, repstosw сказал: А если я дам гарантии, что ни один обработчик прерывания не работает со спинлоками и с расшаренной памятью? Тогда вольны придумывать свои механизмы, главное, чтобы работали правильно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться