LINUX.ORG.RU

История изменений

Исправление 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*/