我正在使用 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;
}
在第三种方法中,我将引脚状态存储在变量中,避免每次都读取硬件状态。
现在我对哪种方法最好有一些疑问:
在第一种方法中,我每次都写入引脚(即不断写入)。
第二种方法,我在写入前检查硬件状态。
在第三种方法中,我将引脚状态存储在变量中并避免读取硬件状态。
这三种方法中哪一种在性能、功效和可靠性方面最有效?最好的方法是什么?
and I want to optimize GPIO writes for performance, power efficiency, and reliability.
和 HAL_GPIO_...
是对立词。
这三种方法中哪一种最有效? 性能、电源效率和可靠性?什么是最好的 方法?
没有单一的“最佳方法”——它完全取决于具体的环境和要求。
如果您使用直接寄存器访问,如 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 函数简化了开发,但它们会带来性能和能源成本,因此请注意何时使用它们。