Ну ОК. Вроде работает. И уже достаточно изящно - не генерирует
лишнего кода.
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)