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