C 如何使用';旗帜';除了用作全局变量之外的变量?

C 如何使用';旗帜';除了用作全局变量之外的变量?,c,embedded,flags,pic,C,Embedded,Flags,Pic,我在一个小型嵌入式项目中使用了几个no of标志来设置标志。我想知道使用这些指示项目中某些状态的变量的最佳方法是什么。我使用的是c18编译器和pic18f控制器 flag1..flag 2..flag3..表示state1、state2、state3..以及相应的 采取了行动 全球化是一种选择 但是,在嵌入式系统中,我最喜欢的处理“标志”的方法是什么?首先,当你有很多“标志”时,要小心处理。在嵌入式系统中,很容易得到由许多复杂依赖项组成的“标志意大利面”。因此,请检查您有哪些标志:它们是否相关,

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

flag1..flag 2..flag3..表示state1、state2、state3..以及相应的 采取了行动

全球化是一种选择


但是,在嵌入式系统中,我最喜欢的处理“标志”的方法是什么?

首先,当你有很多“标志”时,要小心处理。在嵌入式系统中,很容易得到由许多复杂依赖项组成的“标志意大利面”。因此,请检查您有哪些标志:它们是否相关,它们是否可以共存等等。如果是,通常最好将它们合并到一个枚举中。如果标志指定状态,那么为了更好的程序稳定性,请考虑将整个程序写入状态机。并在程序中的特定位置以一致的方式设置标志。而不是到处这样做

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

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

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


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

如果在ISR内部使用。我应该指定它是一个类型限定符。对不起,您当然应该阅读Jack Ganssle的《非常感谢@cliffordThanke you very very@Lundin》。但是如果我在主文件中有一个flag_1,并且我在file1中使用它,file1需要知道“flag_1”的状态。我只知道全局化,而且我也知道它是邪恶的。那么我该如何解决这个问题呢?对不起,我只是一个渴望学习的初学者。@Rookiew 91你应该以面向对象的方式设计一切。在你的具体情况下,如果没有细节,怎么办是不可能的。你必须把所有东西都放在它该放的地方。“flag_1”属于哪一个,没有人知道(包括你自己,6个月后),因为变量名太差了。如果“flag_1”是某个硬件状态标志,则应将其重命名为合适的名称,并与硬件驱动程序放在一起。如果它与状态机相关,则应将其重命名为其他名称,并与状态机一起放置(可能在main中实现)。