Аппаратные регистры всегда квалифицированы volatile
, и компилятору не разрешено оптимизировать код, содержащий volatile
доступ. Так что, если вы напишите им 8 раз, то вы получите 8 записей. Это, конечно, намного медленнее, чем 1 запись.
Кроме того, очень плохо записывать в регистры несколько раз подряд, как если бы они были временной переменной в ОЗУ. Аппаратные регистры, как правило, имеют различные побочные эффекты. Они могут иметь атрибут «однократная запись» или принимать записи только в определенных режимах. Записывая их в несколько этапов, вы приобретаете привычку создавать всевозможные сумасшедшие, тонкие проблемы, вызванные неправильными настройками регистра.
Правильная практика - записывать в регистры один или несколько раз по мере необходимости.
Например, вы можете подумать, что регистр направления данных, как в вашем примере, довольно тупой без побочных эффектов. Но часто аппаратному обеспечению GPIO требуется некоторое время для переключения цепей портов, от точки, где вы записываете данные в регистр направления данных, до точки, где вы получаете доступ к порту ввода / вывода. Таким образом, возможно, что несколько записей остановят порт без необходимости.
Предположим, REGISTER
- это имя аппаратного регистра, сопоставленного с памятью, volatile
, затем ...
Не делай этого:
MASK1 = calculation();
REGISTER |= MASK1;
MASK2 = calculation();
REGISTER |= MASK2;
Сделайте это:
uintx_t reg_val=0; // temp variable in RAM
MASK1 = calculation();
reg_val |= MASK1;
MASK2 = calculation();
reg_val |= MASK2;
REGISTER = reg_val; // single write to the actual register