ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
5 июля
1527645 Топик полностью
Nikolay_Po (01.07.2025 19:13, просмотров: 168) ответил IBAH на Как изящней преобразовать битовое поле в битовую маску?
Ну ОК. Вроде работает. И уже достаточно изящно - не генерирует лишнего кода. 
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

https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1 AB9U8lJL6yAngGVG6AMKpaAVxYM9DgDJ4GmADl3ACNMYhAAZgjSAAdUBUJbBmc3Dz04hJsBX38gllDwqItMKyyGIQImYgIU908uYtKkiqqCHMCQsMjohUrq2rSG3tb2v ILugEoLVFdiZHYOAFIAJgi/ZDcsAGpFiMde/EEAOgRd7EWNAEELy4IATxjMLCot3uJXax2AdgAhG62AVtXAwEsB/OgtsgEFUtjkANZbEBbLi7P5XQFAkF4MFPSHQ4hbI SPJ5cDQaRHI1H/QHA0HgvEwgAirhi9FUFJRETRlwxtOx9KhMOwxAJSM53N5WJxEMFBIA0gJkByqeiaVKBfittgGMquRitgB6A1bACsgMWjI0i0uVstix%2BtqtPy%2BF pRAA5HfaTa7Fm63Rand67T9GQH7f7g2aw87o56fgAxaMR90o4P%2B1UAvnShkEoRMABumF1P0BRq2ADZzXaAJwu4NxxNpn1u1PuxzUzPq3GyrYAJUwSgIxYBZa%2BVat l1TTtbvrj50ZKY7mLp3c1jmhRmLS6zGphlwMxBYW4zy/5q5hAHkdWKVTy1SuZZrewAvML5rhcY93zsPnN91/EO%2ByxfpKv49i%2Bb5cBEIH3mej4whBgFSDBP5wX%2B iHvmaN5cjcixfIyfaYMAQjxAQxgELeNz5i4TA2PQhHEaR5EMSRvQ7BEBF4Q6eGhjhVxUTRdFFq4fgEFw5bMQAshgPyuAoF6uAQ/bAIsJo/OJqmcRx3zcfhlFXNReAQvG wLIBAhnoBMOk3GWgLKaxBBHNqGK7ARUD2UxBAAFQTBAKzlhA0noLJ8mKcpqncSajITDFAC0ZzaqiAI2cadlEQ5Rz9oO7FuRAHm9ORPl%2BcsAVBSFClKUREVWlFMUTPF ETYFlmAUXqOwnvlZFDkIJSYNYklMAoCKuVseXpZ5ExcU5DCuQ0WyZQOLWzTxt4Yl5EAiYI4mFZNJWdTsJUjQAfutm1iRJ3m7eWPWlANQ3fI4WxlXJFXhWpNW8RKgKnaJ 22Xf5%2B14e22k/VtF0%2Bf5N19QQd3DSVT0yS9YVVe9mmUXpVwcFMtCcCavCeBwWikKgnCPQoMxzEWKwRDwpAEJoWNTHCICSFwRwRBoJqSG6HPLG6XzLBo5bLPonCSP jDPE5wvAKCAGh0wzUxwLASBoCwMR0GE5CUGrGv0OEoiHh%2BywNDQtAEGEssQMEkvBH4VR3JwtN28wxB3BewTaNDTu8GrbCCFetCO4TvBYMErjAI4Yi0LL3Ch5gLCGMA 4gh6Q%2BDENDeCFrHROYKofWKQstOiSUku0HgwTEA7zhYJLBDEHgLA%2B6QhbEME8SYIyCdJ%2BXRiK3wBjAAoABqeCYAA7hejwE7T/CCCIYjsFIMiCIoKjqKnugNAYf emMY5jl8EsuQFMqAxGUsexSwyAxK4rloNUedX9BsUXgovCoK3DdYMfEBTJYmc7AQAcAMeopAfB%2BA6PkLoDQMiJAEKA9I8R4EMFGJ0cIQxerWGaH0GoLg6h6AAdggQL RqhoOgRgiwuDEFDFweQ8YXB/4U3mBIbGuMJapxJhwLYlxeySS2AAcUcI9D8RxlhHE/BABgAhMBWQgLgQgJADo0wmLwemIcYqkGZiaN0RxyzVkkCacStYuDLC%2BNWCIb pRYcHFqQAmRMuEyzlgrDRbCODLA4Q46WLitCaNbgkOwkggA