@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?

Ответы на вопрос(1)

Ваш ответ на вопрос