如何在代码.h文件中组织声明和函数,并包含最佳代码重用

时间:2014-01-19 09:41:35

标签: c header-files pic code-reuse reusability

希望有人可以提供帮助 - 为这个非常基本的问题道歉,但是我使用标准C为PIC微控制器的一些实验编写代码,而且我对C语言也很陌生。

我有各种逻辑代码组,例如控制LCD显示器的功能,我想让它可以重复用于基于PIC的项目,并想知道如何最好地分解这些逻辑代码组为了重新使用。

在LCD函数的例子中,我假设我将声明拆分为名为'lcd.h'的头文件(包括我的IDE的'Header Files'项目目录中)和include'lcd.c中的函数定义。 '(包括在我的IDE的'源文件'项目目录中) - 这是正确的吗?

以这种方式分解代码的命名约定是什么?例如,所有全局声明都应该在名为“main.h”的头文件中?

非常感谢, 亚历

1 个答案:

答案 0 :(得分:4)

你专注于模块化是件好事。它不仅会为您带来可重用性,而且还可以使调试更容易。

命名约定

你是对的。对于LCD功能,请创建文件lcd.clcd.h。没有通用的函数命名约定,但这是我使用的:

lcd.h

void LCD_PublicFunction(void);

lcd.c

static void PrivateFunction(void);

void LCD_PublicFunction(void)
{
    // Function goes here
}

static void PrivateFunction(void)
{
    // Function goes here
}

我在所有公共函数前放置一个LCD_前缀,以防止命名空间冲突,并帮助我在任何时候找到函数的位置。 static键盘会阻止lcd.c以外的任何功能查看PrivateFunction,并删除前缀以表示私有。

全局

请避免全局变量。随着项目的增长,跟踪逻辑将变得更加困难。相反,使用getter和setter函数。

static int brightness;

void LCD_SetBrightness(int var)
{
    brightness = var;
}

int LCD_GetBrightness(void)
{
    return brightness;
}

这为您提供了更大的灵活性。也许你需要在每次设置亮度时添加一点逻辑。也许您希望变量是只读的,因此您可以删除setter。

粒度

尝试尽可能地分解您的项目。我假设您将使用某种串行端口与LCD通信。从LCD显示器固件中分解通信固件。

例如,如果它使用SPI,那么您应该创建spi.cspi.h

我看到这种做法太过分了。我见过人们在所有I / O端口周围设置功能,以便它们具有将数字引脚设置为高电平和低电平的功能。

错误的例子:

void IO_PortA7 (char val)
{
    LATAbits.LATA7 = val;
}

除了添加一些语法糖,我还没有真正获得任何东西。只需在代码中使用LATAbits.LATA7,因为它是在PIC上打开和关闭I / O的标准方法。

很好的例子:

void FX_SetBuzzer (char is_active)
{
    LATAbits.LATA7 = is_active;
}

只需阅读代码,您就可以知道我已将蜂鸣器连接到A7针脚。此外,其余的代码并不关心我如何连接蜂鸣器,如果我必须将蜂鸣器移动到另一个引脚,我只需要进行一项更改。最后,通过使用变量名is_active,我记录了蜂鸣器处于高电平状态的事实。我尝试使用所有布尔变量的问题来记住在真实条件下发生的事情。

测试

最后一条建议。在每个.c文件中,创建一个测试工具。

#ifdef LCD_TEST

int main(void)
{
    // Enable LCD communication.
    LCD_Init();

    // Display friendly greeting.
    LCD_Display("Hello, world!");

    // Wait for power-down.
    for(;;);
}

#endif

通过这种方式,您可以构建一个可以自行测试LCD的小程序。它有几个目的。

  • 它遵循Test-driven_development,这是一件好事。
  • 它通过展示一个功能性示例提供了一种基本形式的文档。
  • 将来,您的液晶显示屏可能会突然停止工作。只需调用此代码,看看会发生什么。如果测试有效,您知道最新的更改会以某种方式破坏LCD功能。如果没有,您知道问题出在LCD本身或它与PIC之间的连接上。
祝你好运!