История изменений
Исправление shkolnick-kun, (текущая версия) :
Примерно так:
8003f94: b5f8 push {r3, r4, r5, r6, r7, lr}
IO_GPIO_SET_OUT(CENSORED_KEY, LL_GPIO_OUTPUT_PUSHPULL, LL_GPIO_SPEED_FREQ_HIGH);
8003f96: 4c27 ldr r4, [pc, #156] ; (8004034 <_some_pins_open+0xa0>)
8003f98: 2201 movs r2, #1
8003f9a: 4620 mov r0, r4
8003f9c: f44f 5180 mov.w r1, #4096 ; 0x1000
8003fa0: f7ff ff92 bl 8003ec8 <LL_GPIO_SetPinMode>
MODIFY_REG(GPIOx->OTYPER, PinMask, (PinMask * OutputType));
8003fa4: f4236863 vld2.16 {d6-d7}, [r3 :128], r3
8003fa8: 5380 strh r0, [r0, r6]
8003faa: 68a06063 stmiavs r0!, {r0, r1, r5, r6, sp, lr}
8003fae: f44f 5380 mov.w r3, #4096 ; 0x1000
8003fb2: f1a3fa93 ; <UNDEFINED> instruction: 0xf1a3fa93
MODIFY_REG(GPIOx->OSPEEDR, (GPIO_OSPEEDR_OSPEED0 << (POSITION_VAL(Pin) * 2U)),
8003fb6: fab1 f181 clz r1, r1
8003fba: f2a3fa93 ; <UNDEFINED> instruction: 0xf2a3fa93
8003fbe: 2503 movs r5, #3
8003fc0: f282fab2 ; <UNDEFINED> instruction: 0xf282fab2
8003fc4: 0049 lsls r1, r1, #1
8003fc6: f101fa05 ; <UNDEFINED> instruction: 0xf101fa05
8003fca: 2602 movs r6, #2
8003fcc: ea200052 b 880411c ;<CENSORED>
8003fd0: 0101 lsls r1, r0, #4
8003fd2: f202fa06 vpmax.s8 d15, d2, d6
8003fd6: 430a orrs r2, r1
8003fd8: 211060a2 tstcs r0, r2, lsr #1
WRITE_REG(GPIOx->BRR, PinMask);
8003fdc: 62a3 str r3, [r4, #40] ; 0x28
IO_OUT_CLR(CENSORED_KEY); /*Initiate with zeros*/
Правда не всё заинлайнилось… Хотя LL_GPIO_SetPinMode выглядит просто:
__STATIC_INLINE void LL_GPIO_SetPinMode(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Mode)
{
MODIFY_REG(GPIOx->MODER, (GPIO_MODER_MODE0 << (POSITION_VAL(Pin) * 2U)), (Mode << (POSITION_VAL(Pin) * 2U)));
}
Почему его не заинлайнило - не понятно.
Компилировал с -Os
Исправление shkolnick-kun, :
Примерно так:
8003f94: b5f8 push {r3, r4, r5, r6, r7, lr}
IO_GPIO_SET_OUT(CENSORED_KEY, LL_GPIO_OUTPUT_PUSHPULL, LL_GPIO_SPEED_FREQ_HIGH);
8003f96: 4c27 ldr r4, [pc, #156] ; (8004034 <_some_pins_open+0xa0>)
8003f98: 2201 movs r2, #1
8003f9a: 4620 mov r0, r4
8003f9c: f44f 5180 mov.w r1, #4096 ; 0x1000
8003fa0: f7ff ff92 bl 8003ec8 <LL_GPIO_SetPinMode>
MODIFY_REG(GPIOx->OTYPER, PinMask, (PinMask * OutputType));
8003fa4: f4236863 vld2.16 {d6-d7}, [r3 :128], r3
8003fa8: 5380 strh r0, [r0, r6]
8003faa: 68a06063 stmiavs r0!, {r0, r1, r5, r6, sp, lr}
8003fae: f44f 5380 mov.w r3, #4096 ; 0x1000
8003fb2: f1a3fa93 ; <UNDEFINED> instruction: 0xf1a3fa93
MODIFY_REG(GPIOx->OSPEEDR, (GPIO_OSPEEDR_OSPEED0 << (POSITION_VAL(Pin) * 2U)),
8003fb6: fab1 f181 clz r1, r1
8003fba: f2a3fa93 ; <UNDEFINED> instruction: 0xf2a3fa93
8003fbe: 2503 movs r5, #3
8003fc0: f282fab2 ; <UNDEFINED> instruction: 0xf282fab2
8003fc4: 0049 lsls r1, r1, #1
8003fc6: f101fa05 ; <UNDEFINED> instruction: 0xf101fa05
8003fca: 2602 movs r6, #2
8003fcc: ea200052 b 880411c ;<CENSORED>
8003fd0: 0101 lsls r1, r0, #4
8003fd2: f202fa06 vpmax.s8 d15, d2, d6
8003fd6: 430a orrs r2, r1
8003fd8: 211060a2 tstcs r0, r2, lsr #1
WRITE_REG(GPIOx->BRR, PinMask);
8003fdc: 62a3 str r3, [r4, #40] ; 0x28
IO_OUT_CLR(CENSORED_KEY); /*Initiate with zeros*/
Правда не всё заинлайнилось… Хотя LL_GPIO_SetPinMode выглядит так:
__STATIC_INLINE void LL_GPIO_SetPinMode(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Mode)
{
MODIFY_REG(GPIOx->MODER, (GPIO_MODER_MODE0 << (POSITION_VAL(Pin) * 2U)), (Mode << (POSITION_VAL(Pin) * 2U)));
}
Почему его не заинлайнило - не понятно.
Компилировал с -Os
Исправление shkolnick-kun, :
Примерно так:
8003f94: b5f8 push {r3, r4, r5, r6, r7, lr}
IO_GPIO_SET_OUT(CENSORED_KEY, LL_GPIO_OUTPUT_PUSHPULL, LL_GPIO_SPEED_FREQ_HIGH);
8003f96: 4c27 ldr r4, [pc, #156] ; (8004034 <_some_pins_open+0xa0>)
8003f98: 2201 movs r2, #1
8003f9a: 4620 mov r0, r4
8003f9c: f44f 5180 mov.w r1, #4096 ; 0x1000
8003fa0: f7ff ff92 bl 8003ec8 <LL_GPIO_SetPinMode>
MODIFY_REG(GPIOx->OTYPER, PinMask, (PinMask * OutputType));
8003fa4: f4236863 vld2.16 {d6-d7}, [r3 :128], r3
8003fa8: 5380 strh r0, [r0, r6]
8003faa: 68a06063 stmiavs r0!, {r0, r1, r5, r6, sp, lr}
8003fae: f44f 5380 mov.w r3, #4096 ; 0x1000
8003fb2: f1a3fa93 ; <UNDEFINED> instruction: 0xf1a3fa93
MODIFY_REG(GPIOx->OSPEEDR, (GPIO_OSPEEDR_OSPEED0 << (POSITION_VAL(Pin) * 2U)),
8003fb6: fab1 f181 clz r1, r1
8003fba: f2a3fa93 ; <UNDEFINED> instruction: 0xf2a3fa93
8003fbe: 2503 movs r5, #3
8003fc0: f282fab2 ; <UNDEFINED> instruction: 0xf282fab2
8003fc4: 0049 lsls r1, r1, #1
8003fc6: f101fa05 ; <UNDEFINED> instruction: 0xf101fa05
8003fca: 2602 movs r6, #2
8003fcc: ea200052 b 880411c ;<CENSORED>
8003fd0: 0101 lsls r1, r0, #4
8003fd2: f202fa06 vpmax.s8 d15, d2, d6
8003fd6: 430a orrs r2, r1
8003fd8: 211060a2 tstcs r0, r2, lsr #1
WRITE_REG(GPIOx->BRR, PinMask);
8003fdc: 62a3 str r3, [r4, #40] ; 0x28
IO_OUT_CLR(CENSORED_KEY); /*Initiate with zeros*/
Правда не всё заинлайнилось… Хотя LL_GPIO_SetPinMode выглядит так:
__STATIC_INLINE void LL_GPIO_SetPinMode(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Mode)
{
MODIFY_REG(GPIOx->MODER, (GPIO_MODER_MODE0 << (POSITION_VAL(Pin) * 2U)), (Mode << (POSITION_VAL(Pin) * 2U)));
}
Исправление shkolnick-kun, :
Примерно так:
8003f94: b5f8 push {r3, r4, r5, r6, r7, lr}
IO_GPIO_SET_OUT(CENSORED_KEY, LL_GPIO_OUTPUT_PUSHPULL, LL_GPIO_SPEED_FREQ_HIGH);
8003f96: 4c27 ldr r4, [pc, #156] ; (8004034 <_some_pins_open+0xa0>)
8003f98: 2201 movs r2, #1
8003f9a: 4620 mov r0, r4
8003f9c: f44f 5180 mov.w r1, #4096 ; 0x1000
8003fa0: f7ff ff92 bl 8003ec8 <LL_GPIO_SetPinMode>
MODIFY_REG(GPIOx->OTYPER, PinMask, (PinMask * OutputType));
8003fa4: f4236863 vld2.16 {d6-d7}, [r3 :128], r3
8003fa8: 5380 strh r0, [r0, r6]
8003faa: 68a06063 stmiavs r0!, {r0, r1, r5, r6, sp, lr}
8003fae: f44f 5380 mov.w r3, #4096 ; 0x1000
8003fb2: f1a3fa93 ; <UNDEFINED> instruction: 0xf1a3fa93
MODIFY_REG(GPIOx->OSPEEDR, (GPIO_OSPEEDR_OSPEED0 << (POSITION_VAL(Pin) * 2U)),
8003fb6: fab1 f181 clz r1, r1
8003fba: f2a3fa93 ; <UNDEFINED> instruction: 0xf2a3fa93
8003fbe: 2503 movs r5, #3
8003fc0: f282fab2 ; <UNDEFINED> instruction: 0xf282fab2
8003fc4: 0049 lsls r1, r1, #1
8003fc6: f101fa05 ; <UNDEFINED> instruction: 0xf101fa05
8003fca: 2602 movs r6, #2
8003fcc: ea200052 b 880411c ;<CENSORED>
8003fd0: 0101 lsls r1, r0, #4
8003fd2: f202fa06 vpmax.s8 d15, d2, d6
8003fd6: 430a orrs r2, r1
8003fd8: 211060a2 tstcs r0, r2, lsr #1
WRITE_REG(GPIOx->BRR, PinMask);
8003fdc: 62a3 str r3, [r4, #40] ; 0x28
IO_OUT_CLR(CENSORED_KEY); /*Initiate with zeros*/
Правда не всё заинлайнилось…
Исходная версия shkolnick-kun, :
Примерно так:
8003f94: b5f8 push {r3, r4, r5, r6, r7, lr}
IO_GPIO_SET_OUT(CENSORED_KEY, LL_GPIO_OUTPUT_PUSHPULL, LL_GPIO_SPEED_FREQ_HIGH);
8003f96: 4c27 ldr r4, [pc, #156] ; (8004034 <_some_pins_open+0xa0>)
8003f98: 2201 movs r2, #1
8003f9a: 4620 mov r0, r4
8003f9c: f44f 5180 mov.w r1, #4096 ; 0x1000
8003fa0: f7ff ff92 bl 8003ec8 <LL_GPIO_SetPinMode>
MODIFY_REG(GPIOx->OTYPER, PinMask, (PinMask * OutputType));
8003fa4: f4236863 vld2.16 {d6-d7}, [r3 :128], r3
8003fa8: 5380 strh r0, [r0, r6]
8003faa: 68a06063 stmiavs r0!, {r0, r1, r5, r6, sp, lr}
8003fae: f44f 5380 mov.w r3, #4096 ; 0x1000
8003fb2: f1a3fa93 ; <UNDEFINED> instruction: 0xf1a3fa93
MODIFY_REG(GPIOx->OSPEEDR, (GPIO_OSPEEDR_OSPEED0 << (POSITION_VAL(Pin) * 2U)),
8003fb6: fab1 f181 clz r1, r1
8003fba: f2a3fa93 ; <UNDEFINED> instruction: 0xf2a3fa93
8003fbe: 2503 movs r5, #3
8003fc0: f282fab2 ; <UNDEFINED> instruction: 0xf282fab2
8003fc4: 0049 lsls r1, r1, #1
8003fc6: f101fa05 ; <UNDEFINED> instruction: 0xf101fa05
8003fca: 2602 movs r6, #2
8003fcc: ea200052 b 880411c ;<CENSORED>
8003fd0: 0101 lsls r1, r0, #4
8003fd2: f202fa06 vpmax.s8 d15, d2, d6
8003fd6: 430a orrs r2, r1
8003fd8: 211060a2 tstcs r0, r2, lsr #1
WRITE_REG(GPIOx->BRR, PinMask);
8003fdc: 62a3 str r3, [r4, #40] ; 0x28
IO_OUT_CLR(CENSORED_KEY); /*Initiate with zeros*/