Вся глава 12 MISRA-C: 2012, касающаяся преобразования указателей, довольно требовательна. И это правильно, так как это очень опасная территория.
11.6 - правильное правило, запрещающее преобразование целых чисел в void*
. Обоснование заключается в блокировании ошибок выравнивания. Существует не так много причин, почему вы все равно захотите сделать такие преобразования.
Примечательно, что есть также два жестких, но рекомендательных правила 11.4, которые запрещают преобразования из целых чисел в указатели, и 11.5, которые в значительной степени запрещают использование void*
полностью. Невозможно заниматься аппаратным программированием и следовать 11.4, поэтому это правило следует игнорировать. Но у вас мало причин использовать void*
.
В этом конкретном броске вы можете уйти, используя uint32_t
и полностью избегая указателей.
В общем случае доступа к регистру необходимо выполнить преобразование с volatile
-квалифицированными указателями: (volatile uint32_t*)ADDRESS
, при условии, что MCU использует 32-битные регистры.