[PATCH] bsps/arm/stm32f4 Optimize get pin and change from HAL to LL

Gedare Bloom gedare at rtems.org
Wed Jul 6 14:43:08 UTC 2022


Hi Duc,

As I mentioned in the other patch, please save and consolidate all
patch revisions and send an entire new patch set of -v2 patches with
all your changes. You can also squash changes into your patch set, for
example to address reviewer comments like these. We would like to have
a clean set of patches to apply to RTEMS, which may not reflect how
you arrived at the end result of your code. I will try to discuss more
in today's discord meeting.

Gedare

On Wed, Jul 6, 2022 at 5:09 AM Duc Doan <dtbpkmte at gmail.com> wrote:
>
> Hello Cedric,
>
> Thank you for your feedback. I agree with you that there are places that could be optimized out. Here is a new patch for that.
>
> Best,
>
> Duc Doan
>
> ---
>  bsps/arm/stm32f4/gpio/gpio.c | 87 ++++++++++++------------------------
>  1 file changed, 29 insertions(+), 58 deletions(-)
>
> diff --git a/bsps/arm/stm32f4/gpio/gpio.c b/bsps/arm/stm32f4/gpio/gpio.c
> index e971f91140..b632236d8d 100644
> --- a/bsps/arm/stm32f4/gpio/gpio.c
> +++ b/bsps/arm/stm32f4/gpio/gpio.c
> @@ -22,9 +22,18 @@
>  #include <stdlib.h>
>
>  /*********** Helpers *****************/
> -static stm32f4_gpio *get_gpio_from_base(
> -    rtems_gpio *base
> -);
> +/**
> +  * @brief Macro to get stm32f4_gpio object from a base rtems_gpio
> +  *        object.
> +  *
> +  * This is a wrapper of RTEMS_CONTAINER_OF macro
> +  *
> +  * @param base The pointer to a rtems_gpio object
> +  * @retval The pointer to the stm32f4_gpio object owning
> +  *         the specified rtems_gpio object
> +  */
> +#define get_gpio_from_base(base) \
> +    RTEMS_CONTAINER_OF(base, stm32f4_gpio, base)
>
>  /*********** GPIO API ***************/
>  static rtems_status_code stm32f4_gpio_get(
> @@ -115,44 +124,6 @@ static GPIO_TypeDef *GPIOx[] = {
>  #endif /* STM32F429X */
>  };
>
> -static uint16_t GPIO_PIN_x[] = {
> -    GPIO_PIN_0,
> -    GPIO_PIN_1,
> -    GPIO_PIN_2,
> -    GPIO_PIN_3,
> -    GPIO_PIN_4,
> -    GPIO_PIN_5,
> -    GPIO_PIN_6,
> -    GPIO_PIN_7,
> -    GPIO_PIN_8,
> -    GPIO_PIN_9,
> -    GPIO_PIN_10,
> -    GPIO_PIN_11,
> -    GPIO_PIN_12,
> -    GPIO_PIN_13,
> -    GPIO_PIN_14,
> -    GPIO_PIN_15
> -};
> -
> -static uint32_t LL_EXTI_LINE_x[] = {
> -    LL_EXTI_LINE_0,
> -    LL_EXTI_LINE_1,
> -    LL_EXTI_LINE_2,
> -    LL_EXTI_LINE_3,
> -    LL_EXTI_LINE_4,
> -    LL_EXTI_LINE_5,
> -    LL_EXTI_LINE_6,
> -    LL_EXTI_LINE_7,
> -    LL_EXTI_LINE_8,
> -    LL_EXTI_LINE_9,
> -    LL_EXTI_LINE_10,
> -    LL_EXTI_LINE_11,
> -    LL_EXTI_LINE_12,
> -    LL_EXTI_LINE_13,
> -    LL_EXTI_LINE_14,
> -    LL_EXTI_LINE_15
> -};
> -
>  static unsigned int EXTIx_IRQn[] = {
>      EXTI0_IRQn,
>      EXTI1_IRQn,
> @@ -200,13 +171,13 @@ static unsigned int EXTIx_IRQn[] = {
>    * @brief Converts pin number from 0-15 to HAL pin mask.
>    * @param pin is the pin number from 0-15
>    */
> -#define STM32F4_GET_HAL_GPIO_PIN(pin) (GPIO_PIN_x[( pin )])
> +#define STM32F4_GET_HAL_GPIO_PIN(pin) ((uint16_t) (1 << ( pin )))
>
>  /**
>    * @brief Get EXTI Line from pin number 0-15
>    * @param pin is the pin number from 0-15
>    */
> -#define STM32F4_GET_LL_EXTI_LINE(pin) (LL_EXTI_LINE_x[( pin )])
> +#define STM32F4_GET_LL_EXTI_LINE(pin) (0x1UL << ( pin ))
>
>  /**
>    * @brief Get EXTI IRQ number from pin 0-15
> @@ -229,14 +200,6 @@ static stm32f4_interrupt isr_table[16];
>
>  void exti_handler(void *arg);
>
> -/************* Helpers implementation ********************/
> -
> -static stm32f4_gpio *get_gpio_from_base(
> -    rtems_gpio *base
> -)
> -{
> -    return RTEMS_CONTAINER_OF(base, stm32f4_gpio, base);
> -}
>
>  /********** STM32F4 GPIO API functions ************/
>
> @@ -523,7 +486,8 @@ rtems_status_code stm32f4_gpio_remove_interrupt(
>      rtems_status_code sc = rtems_interrupt_handler_remove(
>              STM32F4_GET_EXTI_IRQn(gpio->pin),
>              exti_handler,
> -            &isr_table[gpio->pin].arg);
> +            &isr_table[gpio->pin].arg
> +    );
>      if (sc == RTEMS_SUCCESSFUL) {
>          isr_table[gpio->pin] = (stm32f4_interrupt){0};
>      }
> @@ -554,9 +518,12 @@ rtems_status_code stm32f4_gpio_write(
>  )
>  {
>      stm32f4_gpio *gpio = get_gpio_from_base(base);
> -    uint32_t pin_mask = STM32F4_GET_HAL_GPIO_PIN(gpio->pin);
>
> -    HAL_GPIO_WritePin(gpio->port, pin_mask, value);
> +    if (value)
> +        LL_GPIO_SetOutputPin(gpio->port, STM32F4_GET_HAL_GPIO_PIN(gpio->pin));
> +    else
> +        LL_GPIO_ResetOutputPin(gpio->port, STM32F4_GET_HAL_GPIO_PIN(gpio->pin));
> +
>      return RTEMS_SUCCESSFUL;
>  }
>
> @@ -566,9 +533,11 @@ rtems_status_code stm32f4_gpio_read(
>  )
>  {
>      stm32f4_gpio *gpio = get_gpio_from_base(base);
> -    uint32_t pin_mask = STM32F4_GET_HAL_GPIO_PIN(gpio->pin);
>
> -    *value = HAL_GPIO_ReadPin(gpio->port, pin_mask);
> +    *value = LL_GPIO_IsInputPinSet(
> +            gpio->port,
> +            STM32F4_GET_HAL_GPIO_PIN(gpio->pin)
> +    );
>      return RTEMS_SUCCESSFUL;
>  }
>
> @@ -577,9 +546,11 @@ rtems_status_code stm32f4_gpio_toggle(
>  )
>  {
>      stm32f4_gpio *gpio = get_gpio_from_base(base);
> -    uint32_t pin_mask = STM32F4_GET_HAL_GPIO_PIN(gpio->pin);
>
> -    HAL_GPIO_TogglePin(gpio->port, pin_mask);
> +    LL_GPIO_TogglePin(
> +            gpio->port,
> +            STM32F4_GET_HAL_GPIO_PIN(gpio->pin)
> +    );
>      return RTEMS_SUCCESSFUL;
>  }
>
> --
> 2.36.1
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel


More information about the devel mailing list