全局变量在嵌入式系统编程(C)中是否令人不悦?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了全局变量在嵌入式系统编程(C)中是否令人不悦?相关的知识,希望对你有一定的参考价值。

我在几年前就已经了解到,在应用程序世界中,全局变量是“坏”或“不赞成”,所以它习惯于试图避免使用它们并且几乎不使用它们。

在嵌入式世界中,它们似乎在处理硬件中断时几乎是不可避免的。它们也必须变得易失,因此如果编译器看到它们在运行程序中从未被触及,则它们不会优化它们。

这两个陈述都是真的吗?有没有办法在我描述的情况下避免那些变量而不会向后弯曲太远?

答案

在嵌入式世界中,它们似乎在处理硬件中断时几乎是不可避免的。它们也必须变得易失,因此如果编译器看到它们在运行程序中从未被触及,则它们不会优化它们。

这两个陈述都是真的吗?有没有办法在我描述的情况下避免那些变量而不会向后弯曲太远?

这些陈述都不是真的。

首先,让我们澄清一下,全局变量是指具有外部链接的文件范围变量。这些是可以使用extern关键字或错误调用的变量。

关于第一个声明:

在嵌入式世界中,它们似乎在处理硬件中断时几乎是不可避免的。

使用硬件中断时,可以避免全局变量。正如其他人在评论中指出的那样,嵌入式环境中的全局变量并不罕见,但是,如果您能够负担得起实施适当的封装,则不会鼓励它们。 This article,有人在你的问题的评论中提供,实际上包含一个读者响应,提供了一个很好的例子,说明无法正确实现封装的地方(你不必走远,这是第一个)。

关于第二个声明:

它们也必须变得易失,因此如果编译器看到它们在运行程序中从未被触及,则它们不会优化它们。

这句话,我们说'几乎是真的'。编译器知道何时需要访问变量的内存位置(写入/读取内存),因此当打开优化时,它将避免不必要的内存访问。 volatile关键字告诉编译器不要这样做,这意味着每次使用变量时都会访问该内存位置。

需要使用volatile关键字的情况

  • 全局变量更新了一个中断
  • 由多线程应用程序中的多个线程访问的全局变量
  • 内存映射外设寄存器

对于由中断更新的全局变量,volatile关键字是必不可少的,因为中断可以随时发生,我们不想错过该更新。对于未被中断更新且应用程序是单线程的全局变量,volatile关键字完全没必要,并且实际上可以减慢代码速度,因为每次都要访问该变量的内存位置!

有没有办法在我描述的情况下避免那些变量而不会向后弯曲太远?

答案真的取决于。可能最重要的是你从改变设计中获得了什么?此外,这是一个专业项目,一个用于学校,还是一个有趣的项目?

根据我作为工程师的经验,上市时间往往是公司在开发新产品时最担心的问题。通常会有一些遗留的代码,你在研究和开发阶段就会遇到这些代码,并且它“有效”,那么为什么要花时间修复一些没有破坏的东西呢?说真的,最好是一个非常有说服力的论据,否则不要浪费你的时间。

根据我的教育经验,花时间回过头来实施适当的设计理念并记录它绝对值得,但只有你真的有时间这样做!如果您接近截止日期,请不要冒险。如果你领先于游戏,那就去做吧。它的价值多于一个方面。

最后,要正确封装硬件中断的中断服务程序(ISR),您需要将其置于实际的设备驱动程序(CAN,UART,SPI等)中。应仅通过设备驱动程序和设备驱动程序来促进与ISR的所有通信。 ISR和设备驱动程序之间共享的变量应声明为staticvolatile。如果您需要在外部访问任何这些变量,则可以将setter和getter创建为驱动程序的公共API的一部分。 Check this answer out for a general guideline to follow.

以上是关于全局变量在嵌入式系统编程(C)中是否令人不悦?的主要内容,如果未能解决你的问题,请参考以下文章

C语言中,宏替换与定义全局变量的区别是啥?

嵌入式C编程经验 之 全局变量猛于虎

谈一谈嵌入式C编程中全局变量问题

在C#中静态变量是否全局变量

嵌入式基础知识

怎么在汇编中引用c语言的全局变量