【问题标题】:How to use 'flag' variables other than using as global?除了用作全局变量之外,如何使用“标志”变量?
【发布时间】:2014-06-14 22:39:32
【问题描述】:

我在一个小型嵌入式项目中使用了几个没有标志来设置标志。我想知道使用这些指示项目中某些状态的变量的最佳方法是什么。我正在使用 c18 编译器和pic18f 控制器。

flag1..flag 2..flag3..表示state1,state2,state3..和对应的 已执行操作。

全球化是一种选择。

但是我可以通过什么方法在嵌入式系统中很好地处理“标志”?

【问题讨论】:

  • 如果在 ISR 中使用。我应该指定它是一个类型限定符。对不起
  • 您当然应该阅读 Jack Ganssle 的 A Pox on Globals
  • 非常感谢@Clifford

标签: c embedded flags pic


【解决方案1】:

首先,当您有很多“旗帜”时,请谨慎行事。在嵌入式系统中,很容易得到“flag spaghetti”,它由很多复杂的依赖关系组成。所以检查你有什么标志:它们是否相关,它们是否可以共存等。如果是这样,通常最好将它们合并到一个枚举中。如果标志指定状态,那么为了更好的程序稳定性,请考虑将整个程序编写为状态机。并以一致的方式在程序中的特定位置设置标志。而不是到处这样做。

至于如何存储它们:C程序中从来没有理由使用全局变量,其中全局变量的定义是在文件范围内声明的变量,对整个程序可见。

如果您使用的是单线程/单进程程序,那么在文件范围内声明一个变量就可以了。但是您必须将它声明为static,以便它是一个私有文件范围变量,而不是一个全局变量。

volatile 与范围或程序设计无关。为防止不正确的编译器优化,如果变量在主程序和 ISR 之间共享,则应始终声明变量 volatile

(请注意,volatile 不保证任何原子访问,它不保护 ISR 和主程序之间的竞争条件。)

【讨论】:

  • 非常感谢@Lundin。但是,如果我在 main 中有一个 flag_1 并且我在 file1 中使用它,并且 file1 需要知道“flag_1”的状态。我所知道的全部是全局,我也知道它是邪恶的。那怎么能我调整了问题?请原谅我只是一个渴望学习的初学者。
  • @Rookie91 你应该以面向对象的方式设计一切。没有细节就不可能在你的具体情况下怎么做。你必须把所有东西放在它所属的地方。 “flag_1”属于哪里,没有人知道(包括你自己,6个月后),因为变量名太差了。如果“flag_1”是一些硬件状态标志,那么它应该被重命名为合适的东西并与硬件驱动程序一起放置。如果和状态机有关,应该改名别的东西,和状态机放在一起(可能在main中实现)。
猜你喜欢
  • 2014-12-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多