Ну ОК. Вроде работает. И уже достаточно изящно - не генерирует
лишнего кода.
uint16_t SelectMask = (uint16_t)(RegSost_t){.En=1, .Reset=1};
Так сработает? Не уверен насчёт произвольности порядка...
UPD:
Компилируется такое:
RegSost_t SelectMask = (RegSost_t){.En=1, .Reset=1}; *(uint16_t*)&RegSost &= ~*(uint16_t*)&SelectMask | ModBusOutReg[0]; *(uint16_t*)&RegSost |= *(uint16_t*)&SelectMask & ModBusOutReg[0];
Компилируется в такое:
ldr r2, .L2 ldrh r0, [r2] ldrh r3, [r2, #32] @ unaligned ldrh r1, [r2] orn r0, r0, #160 ands r3, r3, r0 and r1, r1, #160 orrs r3, r3, r1 strh r3, [r2, #32] @ unaligned bx lr
Что меньше исходного кода поштучного присвоения:
ldr r3, .L2 ldrb r1, [r3] @ zero_extendqisi2 ldrb r2, [r3, #32] @ zero_extendqisi2 ubfx r1, r1, #5, #1 bfi r2, r1, #5, #1 strb r2, [r3, #32] ldrb r1, [r3] @ zero_extendqisi2 ldrb r2, [r3, #32] @ zero_extendqisi2 lsrs r1, r1, #7 bfi r2, r1, #7, #1 strb r2, [r3, #32] bx lr
-
- Маленькое дополнение, вместо .En=1 писать .En=~0 что бы оно
работало независимо от размера в битах поля En - AlexBi(02.07.2025 11:44)
- Спасибо. - Nikolay_Po(02.07.2025 13:49)
- Маленькое дополнение, вместо .En=1 писать .En=~0 что бы оно
работало независимо от размера в битах поля En - AlexBi(02.07.2025 11:44)