这是在嵌入式软件中使用C避免全局变量的有效/良好技术吗?

这是在嵌入式软件中使用C避免全局变量的有效/良好技术吗?,c,global-variables,C,Global Variables,我花了很长时间仔细研究了避免全局变量这一主题,并提出了一种在我的搜索中其他任何地方都没有看到的方法,这让我相信这可能不是一种很好的方法(或者我只是没有正确地描述我的搜索) 作为一个例子,我有如下内容: int16_t DataProcessing(uint8_t CallType, struct DataStruct *DataIO) { int16_t RetVal; static struct DataStruct StaticDataStuct; swit

我花了很长时间仔细研究了避免全局变量这一主题,并提出了一种在我的搜索中其他任何地方都没有看到的方法,这让我相信这可能不是一种很好的方法(或者我只是没有正确地描述我的搜索)

作为一个例子,我有如下内容:

int16_t DataProcessing(uint8_t CallType, struct DataStruct *DataIO)
{

     int16_t RetVal;
     static struct DataStruct StaticDataStuct;

     switch (CallType)
         {
         case FIRSTCASE: RetVal = FirstCaseProcessing(&StaticDataStuct,DataIO); break;
         case SECONDCASE: RetVal = SecondCaseProcessing(&StaticDataStuct,DataIO); break;
         ...
         etc
         ...
         }

     return RetVal;

}

int16_t FirstCaseProcessing(struct DataStruct *StaticData, struct DataStruct *NewData)
{

// Do what you need to do here

}
对于调用的任何其他例程,都有相同的想法

我还使用了包装器函数来调用DataProcessing(),这使得整个过程更易于阅读,并且对于将来使用它的新手来说也更容易。例如:

int16_t FirstCase(uint8_t Address, uint16_t Data)
{

     struct DataStruct NewData;

     NewData.Address = Address;
     NewData.Data= Data;

     return DataProcessing(FIRSTCASE, &NewData);

}
好的是,除了UART和定时器之类的中断之外,我根本没有全局变量。(我仍然认为尽可能快地进出中断要比让中断调用将数据存储在某个静态变量中要好,但我很高兴被说服不这样做。)

糟糕的是,我通过三个函数传递内容,目的是为了避免全局变量,并使其更可读(假设不只是我觉得可读!)

我想说的是,我得到了一个72MHz的嵌入式32位处理器来完成8位处理器可以完成的任务,运行速度只有8位处理器的一小部分(假设它有足够的RAM)。所以速度不是一个问题,尽管我对这是否是一个好的风格的观点感兴趣,因为速度可能是一个更大的问题

我已经看到了..c文件的C++风格,并且有静态变量,C文件中的任何函数都可以看到和访问(但外部文件不能),通过访问器函数输入和传递值/指针等,但是它们似乎使用了我认为是“全局”的变量到文件中。(或本地文件,具体取决于您希望如何查看它!)此外,还可以使用一个函数存储静态变量,并简单地将指向该静态变量的指针传递给任何想要访问它的对象。我想知道是否会这样做

我的想法好/坏/糟糕吗


非常感谢您的建议和我可能会得到的所有TL;DRs。.~)

OP:我的想法看起来好/坏/糟糕吗

很好操作尚未完成

在嵌入式设计中避免全局变量是一个很好的目标,主要是为了维护。信息隐藏(使数据位于函数或对象的本地)是控制无数交互和简化调试的关键。对于运算速度更快(并且可能更大的内存)的处理器来说尤其如此


另一种方法是在文件范围内隐藏数据

OP解决方案在
DataProcessing()
中显示为层次结构,给出了命令和输入/输出参数,
DataStruc
的详细信息在此级别是已知的

我的目标是更多的数据驱动方法,使用指针或索引和一组例程。比如说,在嵌入式程序中,我最多需要Sally变量的Sally\N实例。这里我的数据不是全局的,而是隐藏在Sally.c的文件范围内。因此,数据及其详细字段被隐藏在远离使用它的更高级别代码的地方。在OP的方法中,
DataStruct
的详细信息为更高级别的函数
DataProcessing()
所知


数据结构内部是什么?程序特定部分所需的任何内容。例如,在一个例子中有端口状态、定时器值、标志、卡号、端口号。了解您为什么不喜欢文件范围的全局变量会很有用?假设所有函数都在同一个文件中,那么在函数中使用静态结构与在文件中使用静态结构的区别可以忽略。这两种方法都存在多线程问题;但这可能相关,也可能无关。我认为如果可能的话,我们需要了解更多的上下文。我并不一定反对文件范围的全局性。我看到一些人说这些是可以接受的,而另一些人说要避免它们。我想知道我是否能找到一种普遍接受的方法。这里面没有多线程;它完全是为了完成软件风格而运行的。然后尝试动态全局变量。它是程序执行时创建的变量列表,标识符通过函数访问这些变量。
// Sally.h
struct Sally_t;  // Does not expose the fields
extern struct Sally_t *Sally_Init(...);
extern void Sally_DoThis(struct Sally_t *, ...);
extern void Sally_DoThat(struct Sally_t *, ...);

// Sally.c
struct Sally_t { int a, ... };  // Structure details
static struct Sally_t Sally_Data[Sally_N];// file scope prevents global exposure
struct Sally_t *Sally_Init(...);
void Sally_DoThis(struct Sally_t *, ...);
void Sally_DoThat(struct Sally_t *, ...);