@R .. Нет, цель эффективного типа хорошо объяснена в обосновании. Никогда не предполагалось, что, например, int * и double * могут иметь псевдоним. Точка, в которой этим стали злоупотреблять, заключалась в том, что такие вещи, как uint16_t *, не могли использовать псевдоним uint32_t * и т. Д., Эффективно превращая все виды аппаратного программирования с gcc в особую угрозу безопасности. В результате мы видим, что встроенные системы, написанные на gcc, разрушаются каждый день, потому что обычный программист на Си даже не знает о строгом псевдониме и эффективном типе. Так было с тех пор, как Cortex M стал мейнстримом.
сматриваю сборку, сгенерированную GCC для ARM Cortex M4, и заметил, чтоatomic_compare_exchange_weak
получает дваDMB
инструкции, вставленные вокруг условия (собранные с помощью GCC 4.9 с использованием-std=gnu11 -O2
):
// if (atomic_compare_exchange_weak(&address, &x, y))
dmb sy
ldrex r0, [r3]
cmp r0, r2
itt eq
strexeq lr, r1, [r3]
cmpeq.w lr, #0
dmb sy
bne.n ...
ПосколькуРуководство по программированию барьерных инструкций для ARM Cortex M4 говорится, что:
Пропуск инструкции DMB или DSB в примерах на рис. 41 и рис. 42 не приведет к возникновению ошибки, поскольку процессоры Cortex-M:
не переупорядочивать передачи памятине допускайте дублирования двух операций записи.Есть ли причина, по которой эти инструкции нельзя было удалить при нацеливании на Cortex M?