ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
28 апреля
918642 Топик полностью
йцукен (29.04.2019 16:51, просмотров: 118) ответил maleon на Когда-то подобные макросы (и не только для первого и второго байтов) применял в CodeVisionAVR, смотрел АСМ, всё было ОК. Попробовал такое в ИАР, там всё это превращается в кучу кода (может сейчас по другому). Думаю это из-за того, что в
Ну, прямо уж в кучу. Так, небольшая кучка. Макро с адресами оказываются несколько медленнее, чем с данными, но могут применяться слева от знака присваивания.  #define LSB(x) (((uint8_t *)&(x))[0]) #define MSB(x) (((uint8_t *)&(x))[1]) inline uint8_t hi( uint16_t x ) { return x >> 8; } inline uint8_t lo( uint16_t x ) { return x; } uint8_t a, b; void foo( uint16_t x ) { a = LSB(x); b = MSB(x); } void foo1( uint16_t x ) { a = lo(x); b = hi(x); } uint16_t bar( uint8_t hi, uint8_t lo ) { uint16_t r; MSB(r) = hi; LSB(r) = lo; return r; } uint16_t bar1( uint8_t hi, uint8_t lo ) { return hi << 8 | lo; } ///////////////////////////////////////////////////////////////////////////////// \ In section .text, align 2, keep-with-next 28 void foo( uint16_t x ) 29 { \ foo: (+1) \ 0x0 0xB401 PUSH {R0} 30 a = LSB(x); \ 0x2 0x.... LDR.N R0,??DataTable3 \ 0x4 0xF89D 0x1000 LDRB R1,[SP, #+0] 31 b = MSB(x); \ 0x8 0xF89D 0x2001 LDRB R2,[SP, #+1] \ 0xC 0x7001 STRB R1,[R0, #+0] \ 0xE 0x7042 STRB R2,[R0, #+1] 32 } \ 0x10 0xB001 ADD SP,SP,#+4 \ 0x12 0x4770 BX LR ;; return 33 \ In section .text, align 2, keep-with-next 34 void foo1( uint16_t x ) 35 { 36 a = lo(x); \ foo1: (+1) \ 0x0 0x.... LDR.N R1,??DataTable3 \ 0x2 0x7008 STRB R0,[R1, #+0] 37 b = hi(x); \ 0x4 0x0A00 LSRS R0,R0,#+8 \ 0x6 0x7048 STRB R0,[R1, #+1] 38 } \ 0x8 0x4770 BX LR ;; return 39 \ In section .text, align 2, keep-with-next 40 uint16_t bar( uint8_t hi, uint8_t lo ) 41 { \ bar: (+1) \ 0x0 0xB081 SUB SP,SP,#+4 42 uint16_t r; 43 MSB(r) = hi; \ 0x2 0xF88D 0x0001 STRB R0,[SP, #+1] 44 LSB(r) = lo; \ 0x6 0xF88D 0x1000 STRB R1,[SP, #+0] 45 return r; \ 0xA 0xF8BD 0x0000 LDRH R0,[SP, #+0] \ 0xE 0xB001 ADD SP,SP,#+4 \ 0x10 0x4770 BX LR ;; return 46 } 47 \ In section .text, align 2, keep-with-next 48 uint16_t bar1( uint8_t hi, uint8_t lo ) 49 { 50 return hi << 8 | lo; \ bar1: (+1) \ 0x0 0xEA41 0x2000 ORR R0,R1,R0, LSL #+8 \ 0x4 0x4770 BX LR ;; return 51 }