4

我对避免全局变量的话题进行了长期而认真的研究,并提出了一种我在搜索中从未真正见过的方法,这让我相信这可能不是一个很好的方法(或者我的搜索措辞不正确)。

作为一个例子,我有这样的事情:

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 位处理器可以完成的工作,运行速度只有一小部分(假设它有足够的 RAM)。所以速度不是问题,尽管我对在速度可能更成问题时这是否是一种好的风格感兴趣。

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

我的想法看起来好/坏/可怕吗?

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

4

1 回答 1

0

OP:我的想法看起来好/坏/可怕吗?

好的 OP还不是OTT。

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


另一种选择 - 在文件范围内隐藏数据。

OP 解决方案出现分层,如在DataProcessing(),命令和输入/输出参数给出,细节DataStruc在这个级别是已知的。

我的目标是更多的数据驱动方法,使用指针或索引和一组例程。假设在一个嵌入式程序中,我最多需要一个 Sally 变量的 Sally_N 实例。这里我的数据不是全局的,而是隐藏在 Sally.c 的文件范围内。因此,数据及其详细字段远离使用它的更高级别代码。DataStruct在 OP 的方法中,高层函数的细节是已知的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 *, ...);
于 2013-09-10T13:06:21.937 回答