ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
10 марта
1575126 Топик полностью
Nikolay_Po (Сегодня, 01:37, просмотров: 20) ответил Nikolay_Po на RISC-V QingKe-V4C. Как воспользоваться инструкциями атомарного доступа? Нужно взвести/сбросить бит в регистре периферии, при этом, сброс/взведение бита в обычном случае - это R-M-W, которые могут быть прерваны другим процессом, чего хотелось бы избежать без блокировки прерываний.
Вот как используются нормальные, не упрощённые инструкции Load+Reserve (lr) и Store Conditional (sc): 

Example 1. Sample code for compare-and-swap function using LR/SC.


# a0 holds address of memory location
# a1 holds expected value
# a2 holds desired value
# a0 holds return value, 0 if successful, !0 otherwise
cas:
lr.w t0, (a0) # Load original value.
bne t0, a1, fail # Doesn't match, so fail.
sc.w t0, a2, (a0) # Try to update.
bnez t0, cas # Retry if store-conditional failed.
li a0, 0 # Set return to success.
jr ra # Return.
fail:
li a0, 1 # Set return to failure.
jr ra # Return.

LR/SC can be used to construct lock-free data structures. An example using LR/SC to implement a compare-and-swap function is shown in Example 1. If inlined, compare-and-swap functionality need only take four instructions.

взято отсюда:

https://www.five-embeddev.com/riscv-user-isa-manual/latest-adoc/a-st-ext


Но у китайцев эти lr/sc вырождены в LW и SW и возврат всегда успешен. Не могу уловить, возврат всегда успешен потому, что в одноядерной системе нет проблемы блокировать доступ к резервированной памяти из прерываний (блокировать прерывания?) между выполнением этих инструкций и потому sc всегда успешно? Или атомарность просто не работает, а инструкции присутствуют формально?