MPLAB IDE 8.85有条件地包括标头

时间:2015-12-07 16:24:47

标签: c mplab

我在MPLAB IDE中有一个C项目,我希望main.c文件能够用于我拥有的多个HW。主要区别在于PIC的引脚连接不同。

我的想法是为我的主文件支持的每个HW创建不同的.h和.c文件,并且只包含与我想要构建的HW对应的这个文件。

这样的事情:

<target name="copy-all-unzipped">
    <for param="file">
        <path>
            <fileset dir="${path.unzipped}">
                <include name="**/content.xml"/>
            </fileset>
        </path>
        <sequential>
            <copy-unzipped file-path="@{file}"/>
        </sequential>
    </for>
</target>

<macrodef name="copy-unzipped">
    <attribute name="file-path"/>
    <sequential>
        <echo>@{file-path}</echo>
    </sequential>
</macrodef>

这些额外文件(hw1.c和hw2.c)主要包括引脚功能的定义,例如:

#if defined( HW_1 )
  #include "hw1.h"
#elif defined( HW_2 )
  #include "hw2.h"
#endif

及相关功能。

但问题是不同的HW可能具有相同的功能,但在不同的引脚上。这意味着不同的HW可能存在相同的#define变量。

虽然我根据我的HW包含了相应的.h文件,但在MPLAB的结构中我有相同的项目,这意味着我必须同时包含所有.h文件。但是这导致了编译器认为存在对同一变量的各种定义的问题,例如:

#define GPI_PG_3V3 RD2

有没有人对如何解决这个问题有个好主意?我想到的一个想法是为我拥有的所有不同的HW提供不同的项目。这是唯一的解决方案吗?在这种情况下,如何构建项目目录将很困难。

1 个答案:

答案 0 :(得分:1)

您可能需要查看this question。使用C ++命名空间可以更轻松地解决您的问题,但由于您使用C,您可能不得不使用一些黑客。在这个问题中,接受的答案可能不适合您的情况,第二个可能会增加一点点开销(特别是因为您似乎使用旧的编译器)。您应该尝试其他答案中的一个宏黑客。

我的建议,如果你的编译器没有尖叫,就是使用一些宏魔法来有条件地编译并包含一些文件。它具有不编译所有内容的优点,如果编译器不好,可能会节省一些空间(因为它可能是MPLAB 8)。

在你的“my_hw.h”中:

// change this line to change the hardware code
#define THE_DRIVER_TO_USE hw1


#define STRINGIFY2(x) #x
#define STRINGIFY(x) STRINGIFY2(x)

#include STRINGIFY(THE_DRIVER_TO_USE.h)

在一些“hw_includer.c”文件中,你把它放在那里,永远不要改变它:

// optional macro, see below
#define ALLOWED_TO_COMPILE 1
// yes, include a .c
#include STRINGIFY(THE_DRIVER_TO_USE.c)

现在您只需将THE_DRIVER_TO_USE宏更改为交换驱动程序,并添加my_hw.h而不是hwX.h。它将包含权限.h,并编译右.c。对此的要求是不要自己编译hwX.c.您可以将它们从IDE中的编译中排除,或者将.c中的所有代码放在一个后卫#ifdef ALLOWED_TO_COMPILE #endif中,如果不能的话。