В ARM-процессоре (HT32F1655) для конкретного раздела регистров требуется доступ к словам. Из инструкции по эксплуатации:Сила GCC для доступа к структурам со словами
Обратите внимание, что все периферийные регистры на шине AHB поддерживают только доступ к словам.
Но GCC генерирует некоторое ldrb
(нагрузки байт) и strb
(сохранить байты) инструкцию по упакованным структурам. В Структуры выглядеть следующим образом: использование
typedef union {
struct {
uint32_t CKOUTSRC : 3; //!< CKOUT Clock Source Selection
uint32_t : 5;
uint32_t PLLSRC : 1; //!< PLL Clock Source Selection
uint32_t : 2;
uint32_t CKREFPRE : 5; //!< CK_REF Clock Prescaler Selection
uint32_t : 4;
uint32_t URPRE : 2; //!< USART Clock Prescaler Selection
uint32_t USBPRE : 2; //!< USB Clock Prescaler Selection
uint32_t : 5;
uint32_t LPMOD : 3; //!< Lower Power Mode Status
} __attribute__((packed)) __attribute__ ((aligned(4)));
uint32_t word;
} reg;
Пример:
(*(volatile uint32_t*)0x40088000)->CKOUTSRC = 1;
Производит что-то похожее на:
ldrb r2, [r1]
orr r2, r2, #1
strb r2, [r1]
Когда мне нужно:
ldr r2, [r1]
orr r2, r2, #1
str r2, [r1]
Есть ли способ заставить gcc только g вызывать инструкции для доступа ко всему слову? Некоторые параметры (-mno-unaligned-access
) делают gcc генерировать слова доступа, но только тогда, когда байт не выравнивается по 4 словам.
Существует -mslow-bytes
, который должен делать правильные вещи, однако кажется, что опция не существует для arm-none-eabi-gcc.
В идеале был бы способ заставить это только на затронутые структуры.
Пожалуйста, нет ответов «не использовать битподы». Я знаю недостатки, но у меня есть возможность управлять используемыми компиляторами, поэтому я не беспокоюсь о переносимости.
Проводка кода, который делает «упакованное растровое изображение для наложения на регистр устройств», сделает его более понятным и понятным. – chux
Просто выберите хороший набор функций для обеспечения необходимого вам доступа и напишите код, используя встроенную сборку, где это необходимо. –
@DavidSchwartz Существует нетривиальное количество этих регистров для отображения. Отображаемые структуры прекрасно работают, за исключением этой проблемы, поэтому я считаю, что стоит приложить немного усилий, чтобы попытаться полностью работать, прежде чем перейти к другому решению. – Shade