Оперативная память для этого чипа встроена в чип.Компилятор согласен с процессором в отношении размера указателя, я думаю, с вами все будет в порядке.
Кеша нет, так что вам даже не придется беспокоиться об ограждениях для синхронизации доступа.
РЕДАКТИРОВАТЬ: множество другихответы здесь +1 ко всем.Вопрос OP - это скорее вопрос компилятора MSP430 / gcc, чем вопрос о языке C, и, поспешно, вчера вечером перед тем, как выключить свет и лечь спать, я дал вышеуказанный ответ.У меня нет предыдущего опыта работы с MSP430, поэтому я подключился к сети и сделал несколько замечаний, попросил OP проверить пару констант в их среде и пришел к выводу, что им, вероятно, не о чем беспокоиться в заявленном сценарии.,Я привык работать со встроенными компиляторами C, которые едва соответствуют стандартам K & R, намного меньше C99 или C11, но этот опыт на самом деле предшествует C11, поэтому я не думал спросить, было ли доступно ключевое слово _Atomic
(я должен был!).Итак, вот еще один вариант:
Если вы можете объявить _Atomic(void*) ptr;
, сделайте это во что бы то ни стало.Это обеспечит необходимое выравнивание и сгенерирует код, который пишет и читает значение указателя атомарно.Как указывает @Lundin, это единственная надежная вещь в C, когда дело доходит до атомарности.При отсутствии _Atomic
, assert(sizeof(void*) == 2)
и assert(&(my_struct[index]->ptr) % 2 == 0)
, последний будет гарантировать, что значение указателя будет сохранено в выровненном адресном местоположении.Если / когда эти утверждения не выполняются, вы рискуете прочитать частично записанное значение указателя из-за смещения или размера указателя, превышающего размер слова процессора.Даже эти утверждения не являются гарантией, поскольку они верны только для кода, скомпилированного с определенным DEBUG.Если вы чувствуете необходимость всегда проверять эти ограничения, используйте вместо этого if(expression)
.
@CL. В отношении ключевого слова volatile
также следует принять близко к сердцу, так как компилятор может свободно оптимизировать иПереупорядочив доступ, возможно, что подпрограмма прерывания никогда не увидит действительного значения указателя, и если эти данные не были инициализированы в NULL до какого-либо использования в вашем коде, что может стать причиной некоторых очень серьезных, трудно диагностируемых ошибок.Это маловероятный сценарий для простых микросхем без кеша и спекулятивных конвейеров выполнения, но его нельзя исключать.Поэтому используйте ключевое слово volatile
.