如何优化 GPIO 写入以提高性能、功效和可靠性?

问题描述 投票:0回答:1

我正在使用 STM32 微控制器开发嵌入式系统,我想优化 GPIO 写入以提高性能、功效和可靠性。具体来说,当引脚状态已达到所需时,我想避免不必要的 GPIO 写入。

这是我目前的方法:

if (temperature > 15) {
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
} else {
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
}

即使引脚的状态没有改变,此代码也会写入引脚,这可能会浪费资源和电力。为了解决这个问题,我在写入之前检查当前的引脚状态:

if (temperature > 15 && HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_RESET) {
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
} else if (temperature <= 15 && HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_SET) {
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
}

在第二种方法中,我在写入之前检查当前引脚状态,确保仅在需要更改状态时才进行写入操作。

但是,我考虑到读取GPIO引脚可能会引入一些延迟,所以我定义了一个变量来存储引脚状态。现在,我不再读取引脚状态,而是读取变量:

bool pinState = false;  // false: LOW, true: HIGH

if (temperature  > 15 && pinState == false) {
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
    pinState = true;
} else if (temperature  <= 15 && pinState == true) {
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
    pinState = false;
}

在第三种方法中,我将引脚状态存储在变量中,避免每次都读取硬件状态。

现在我对哪种方法最好有一些疑问:

  1. 在第一种方法中,我每次都写入引脚(即不断写入)。

  2. 第二种方法,我在写入前检查硬件状态。

  3. 在第三种方法中,我将引脚状态存储在变量中并避免读取硬件状态。

这三种方法中哪一种在性能、功效和可靠性方面最有效?最好的方法是什么?

optimization embedded stm32
1个回答
0
投票

and I want to optimize GPIO writes for performance, power efficiency, and reliability.
HAL_GPIO_...
是对立词。

这三种方法中哪一种最有效? 性能、电源效率和可靠性?什么是最好的 方法?

  1. 没有单一的“最佳方法”——它完全取决于具体的环境和要求。

  2. 如果您使用直接寄存器访问,如 GPIO->BSRR = PIN_MASK << (reset * 16) instead of calling the HAL_ function, you can save dozens of clock cycles (or more). Additionally, the overhead of your if statement will likely be higher than a single write to the peripheral. The STM32 GPIO hardware is quite efficient and won't make unnecessary changes if the requested state is already set.

在我看来,比起关注微观优化,更重要的是优先考虑关键方面,例如快速进入睡眠模式和尽可能长时间地保持低功耗模式。另外,请考虑采用裸机。虽然 HAL 函数简化了开发,但它们会带来性能和能源成本,因此请注意何时使用它们。

© www.soinside.com 2019 - 2024. All rights reserved.