小编Han*_*ans的帖子

C(嵌入式):提供源文件唯一ID

我正在研究用于嵌入式系统的紧凑型调试输出/单元测试实用程序.

我创建了一个系统,我可以通过串口将信息以紧凑的方式输出到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预处理器接管任务?

c embedded c-preprocessor

8
推荐指数
1
解决办法
1651
查看次数

标签 统计

c ×1

c-preprocessor ×1

embedded ×1