ИМХО версия CMSIS верна.
Внедрение инструкции барьера без памяти в списке клоббера позволяет добиться именно того, для чего она предназначена:
Если предыдущая запись в переменную "x" была буферизована, она фиксируется Это полезно, например, если вы собираетесь передать адрес «x» в качестве адреса DMA или если вы собираетесь настроить MPU.
Не влияет на возвращение "x" (ваша программа гарантированно будет правильной, даже если вы пропустите барьер памяти).
С другой стороны, вставив память в список клобберов, вы не получите никакого эффекта в ситуациях, подобных предыдущему (DMA, MPU ..).
Единственное отличие в последнем случае состоит в том, что если у вас есть, например, ISR, изменяющий значение «x» сразу после «strb», то возвращаемое значение будет значением, измененным ISR, потому что clobber заставил компилятор читать из памяти, чтобы зарегистрироваться снова.
Но если вы хотите получить эту вещь, то вам следует использовать «изменчивые» переменные.
Другими словами: барьер сил кеша против фиксации памяти, чтобы гарантировать согласованность с другими ресурсами HW, которые могут получить доступ к памяти RAM, в то время как сгущение памяти приводит к тому, что компилятор останавливается, предполагая, что память не изменилась, и снова читает в локальных регистрах, это другое дело с другими целями (не имеет значения, если изменение памяти все еще находится в кеше или уже зафиксировано в оперативной памяти, потому что возможная операция загрузки asm гарантированно будет работать в обоих случаях без барьеров).