我正在开发用于嵌入式系统的紧凑型调试输出/单元测试实用程序。
我创建了一个系统,可以通过串行端口以紧凑的方式将消息输出到 PC。为了节省内存空间/串行端口带宽,我通过为它们提供唯一的 16 位 ID,从嵌入式系统中剥离了消息字符串。
这非常简单,因为我将所有消息都放在了 1 个列表中。一些宏会将其放入枚举中:
项目定义.h:
#define MESSAGE_TABLE(MSG) \
MSG(HELLO, "Hello World!") \
MSG(TEST, "Second message #ID 1") \
MSG(TEST2, "Third message #ID 2")
消息.h:
#define MACRO_STR_CONCAT(a,b) a##b
#define MESSAGE_ENUM(codeName, str) MACRO_STR_CONCAT(MSG_, codeName)
typedef enum messageNumbers_e {
MESSAGE_TABLE(MESSAGE_ENUM),
MESSAGE_COUNT
};
#define MESSAGE(codeName) messageSend(MACRO_STR_CONCAT(MSG_, codeName), __LINE__, file_number);
通过串行端口传输的唯一数据是消息 ID、行号和文件号(注意;不是字符串!)。
我遇到的问题是如何使用C预处理器/编译器为每个文件分配唯一 ID。我不想将每个文件名字符串存储在嵌入式程序中。这会在串行端口上使用(太多)内存或带宽。
我的想法是用宏在每个文件中定义常量 file_number 。我会在每个源文件的顶部使用这个定义:
#define ASSIGN_FILENUMBER() enum { file_number = __COUNTER__ };
但是,由于每个文件都是单独编译的,这意味着该__COUNTER__
语句在调用时始终从 0 开始,并且不知道其他文件的存在或它自己的 ID。
另一个考虑是编辑 MakeFile(脚本)并在那里添加文件 ID 号。但是,这会将项目构建/功能与我的 IDE 配置紧密联系在一起,这是不可取的。此外,我不确定我当前的 IDE(Mplab X IDE 或 IAR Embedded Workbench 上的 XC16/XC32 编译器)的可能性。
我想知道是否还有其他创造性的方法可以让标准C预处理器接管任务?