gpt4 book ai didi

c - 在这种情况下如何避免全局变量(嵌入式 C)

转载 作者:太空狗 更新时间:2023-10-29 14:56:05 24 4
gpt4 key购买 nike

我仍在学习用于微处理器的 C。一开始我使用了很多全局变量。现在我尽量避免它,但对我来说并不总是很清楚如何做到这一点。

例如电池监视器,在这种情况下有 4 个函数需要读取或修改变量。我有这些功能都使用变量 LowVoltage。

void Check_Voltage(){
checks current voltage against LowVoltage
}

void Menu_Voltage(){
a menu on the LCD screen to set the value of LowVoltage
}

void Save_LowVoltage(){
runs after the settings menu is finished to save LowVoltage to EEPROM
}

void Load_LowVoltage(){
reads EEPROM and sets LowVoltage at startup
}
  • Check_Voltage() 和 Save_LowVoltage() 需要读取 LowVoltage。
  • Load_LowVoltage() 需要写入 LowVoltage。
  • Menu_Voltage() 需要读取和写入 LowVoltage。

如何在不将 LowVoltage 设为全局的情况下完成这项工作?我需要创建另一个函数来读取或写入 LowVoltage 吗?像这样:

unsigned int Low_Voltage(short Get, unsigned int Value){
static unsigned int LowVoltage;

if(Get) return LowVoltage;
else LowVoltage= Value;
}

或者有更好的方法来做到这一点?我想一定有 :)我最近一直在阅读结构,但老实说我并不完全理解它们,我什至不确定在这种情况下它是否对我有帮助?

最佳答案

在函数之间共享一个变量有几种选择:

  • 在静态内存中分配您的变量 - 这几乎就是您的代码所做的。您的两个选择是函数静态、翻译单元静态和全局
  • 将指针作为函数参数传递给变量 - 这个选择需要以某种形式传递指针
  • 使用具有巧妙初始化的线程本地存储 - 当您使用微 Controller 时通常无法使用此选项;为了完整起见,我将其列在这里。

在您的情况下,我认为使用翻译单元静态变量是合适的。将四个函数的实现放在一个 C 文件中,并在顶部将 LowVoltage 声明为静态变量:

static unsigned int LowVoltage;

这种简单但高效的封装机制为您提供了拥有全局变量的所有好处,而没有拥有全局变量的缺点:

  • C 模块内的所有函数都“看到”这个变量,并可以自由地操作它
  • C 模块之外的其他函数不能访问此变量。他们可以声明自己的 LowVoltage 变量,赋予它完全不同的含义。

关于c - 在这种情况下如何避免全局变量(嵌入式 C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29348663/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com