Код: Выделить всё
void read_pma(uint8_t byte_count, volatile uint16_t * pma_address, uint8_t *buffer_out) {
int count_received_16 = (byte_count + 1) >> 1;
for(int i=0; ibuffer[0].EP_RX, buffer);
handle_setup_packet(reinterpret_cast(buffer));
}
Я добавляю дополнительную информацию для рассмотрения комментариев. Из предложений в комментариях я узнал больше о строгом псевдониме и обнаружил, что, по моему мнению, является основной проблемой. Компилятор clang 20.1.0, предоставленный ARM: https://github.com/arm/arm-toolchain с параметрами -target=armv7m-none-eabi -O3 -flto. Созданная сборка довольно велика из-за развертывания цикла, но обычно существует несколько разделов, как показано ниже, где она несколько раз загружает ячейку памяти pma_address и неоднократно записывает в рабочий регистр.
Код: Выделить всё
; ((uint16_t *) buffer_out)[i] = pma_address[i];
10000776: f835 3c1e ldrh r3, [r5, #-30]
1000077a: f835 3c1c ldrh r3, [r5, #-28]
1000077e: f835 3c1a ldrh r3, [r5, #-26]
10000782: f835 3c18 ldrh r3, [r5, #-24]
10000786: f835 3c16 ldrh r3, [r5, #-22]
1000078a: f835 3c14 ldrh r3, [r5, #-20]
Код: Выделить всё
; ((uint16_t *) buffer_out)[i] = pma_address[i];
8004370: 885f ldrh r7, [r3, #0x2]
8004372: eb00 0144 add.w r1, r0, r4, lsl #1
8004376: f8a1 704d strh.w r7, [r1, #0x4d]
800437a: eb08 0744 add.w r7, r8, r4, lsl #1
800437e: f8b7 20a2 ldrh.w r2, [r7, #0xa2]
; for(int i=0; i> 1;
for(int i=0; i> 8) & 0xFF;
}
}
fun() {
read_pma(byte_count, USBPMA->buffer[0].EP_RX, buffer);
usb_control_request ctrl_req {};
std::memcpy(&ctrl_req, buffer, sizeof(usb_control_request));
handle_setup_packet(&ctrl_req);
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... ile-memory