我在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提供不同的项目。这是唯一的解决方案吗?在这种情况下,如何构建项目目录将很困难。
答案 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
中,如果不能的话。