Нужно чтобы не было ситуации, когда запись в эту переменную в прерывании приводит ее в некорректное состояние (когда первые два байта уже записаны, остальные нет или наоборот)
Если переменная выровнена, то атомарно.
А как ее принудительно выровнять? IAR
все сильно зависит, есть ли кеш
ее принудительно можно не выровнено положить, а если ничего не делать, то она будет выровнена
используй барьеры, перед доступом к ней и критическую секцию (запрет прерываний) и будет тебе счастье, не только с 32 битными переменными) А вообще, опиши кейс, что ты хочешь конкретно. Есть разные способы получить желаемое
Да, для Си в stm32 чтение и запись 1, 2 и 4 байтовых переменных - атомарны
А если переменная находится в составе не выровненной структуры? Просто интересно
для него это избыточно, как я понял у него такой кейс: есть: volatile uint32_t cnt; есть irq (одно) он в нем как то модифицирует скажем так: cnt++ Вопрос, нужно ли выравнивать данные и не будет ли ситуация что при чтении cnt из основной программы в cnt будет каша из-за отсутствия атомарности чтения. Так как прерывания одно и данные по дефолту компилятром выровнены, ему никаких телодвижений больше делать не нужно. ибо ldr будет один. а так как волотайл есть, то чтение будет всегда актуальным., атомик был бы нужен, если cnt модифицировалась в разных прерываниях с разными приоритетами.
но в идеале, лучше критической секцией обмазать. Чтобы прерывание не поменяло чего. Ибо бывают кейсы разные, потому чтобы наверняка - критические секции
Как оно поменяет в случае к доступа к базовым 4битный данным? )
In ARMv7-M, the single-copy atomic processor accesses are: • all byte accesses. • all halfword accesses to halfword-aligned locations. • all word accesses to word-aligned locations.
если структура упакована, то компилятор будет судить по своим ивристикам, как лучше (быстрее) это дело прочитать. но М3 и старше невыровненное чтение есть из коробки. просто ldr будет один как команда, но вот на шине команда разабьется на несколько транзакций. на M0 он получит UsageFault (если сам ручками будет читать) компилятор же зная что выровнено а что нет, сам разрулит вплоть до побайтного чтения
4 байтным наверное все же. Например у тебя структуру читает, которая выровненная и состоит из нескольких полей и потом созраняет. Вместо нескольких LDR-STR можент оказаться пара LDM-STM - вот один из примеров
ldm невыровненным быть не может, т.е. оно будет читать отдельные 32битные -- атомарно. так что нет, не может
да, но вот как раз между чтениями 32битных переменных может и вклинится прерывание и сломать всю малину. Ибо асинхронное
ну блин тут мы щас и до РТОСь дойдем а там мьютексы, или ДМА и сброса и инвалидации кэша :)
Обсуждают сегодня