Лучшие практики для разработки регистров в периферийное устройство, к которому будут обращаться C и C ++? - PullRequest
0 голосов
/ 01 ноября 2018

Я проектирую периферийное устройство последовательного порта в ПЛИС, в котором регистры отображения памяти будут видны моему процессору.

Гарантирует ли C / C ++ (я использую оба), что запись в ячейку памяти также не приведет к чтению из того же места?

Я спрашиваю, потому что чтение будет считывать данные, отличные от только что записанных, и потому что чтение имеет побочные эффекты (оно вытягивает следующий байт из очереди).

Я пытаюсь использовать одну ячейку памяти для данных TX и RX, чтобы минимизировать размер логики декодирования.

Смежный вопрос: Гарантирует ли C / C ++, что одно чтение ячейки памяти всегда будет одним чтением, а не каким-то образом закончится множественным чтением. Многолетний опыт говорит да, но мне интересно, что говорит спецификация.

Примечание. Я всегда объявляю указатели на периферийные регистры энергозависимыми, например: volatile uint32_t * p_reg;

1 Ответ

0 голосов
/ 01 ноября 2018

В C или C ++ не существует такой вещи, как запись в ячейку памяти. Есть только код и память с компилятором, решающим, читать или записывать в память, чтобы заставить код делать то, что требуется от кода, как он считает необходимым. Ваша платформа может заставить volatile делать то, что вы хотите, а может и нет, но это вопрос для конкретной платформы.

Если вы пишете j=1;, и у вас есть платформа, где константы, отличные от нуля, дороги, но приращения дешевы, реализация может воспринимать это как j=0; ++j;, если захочет.

Были даже случаи из реальной жизни, когда операции, которые выглядели как чистые операции чтения, действительно записывали в память. Ничто в стандартах C и C ++ не запрещает этого.

Вы можете проверить документацию вашего компилятора в volatile, чтобы увидеть, делает ли он то, что вам нужно. Если нет, посмотрите встроенный код сборки. Если это что-то разумное сделать на вашей платформе, достойный компилятор должен предоставить хороший способ сделать это.

...