我正在使用 PIC32、MPLABX 和 XC32,目前我必须为每个外设进行大量的硬件描述。有些任务类似于:
在文件1.h中
extern const stream_t EHAL_PIN_STREAM_TEMPLATE;
在文件1.c中
const stream_t EHAL_PIN_STREAM_TEMPLATE = {
.field1 = constant, .field2 = constant, ...
}
在文件2.h中
#include "file1.h"
const stream_ehal_pin_t EHAL_STREAM_PIN_RF1 = {
.stream = EHAL_PIN_STREAM_TEMPLATE,
.pin = &EHAL_PIN_RF1
};
基本上,我正在我们的流和 PIC32.RF1 数字引脚之间创建一个映射,并且我想使用 const 全局变量来实现此映射,但是当我尝试使用
initializer element is not constant
时,出现 EHAL_PIN_STREAM_TEMPLATE
错误。
除了在运行时进行
EHAL_STREAM_PIN_RF1
初始化之外,你还知道任何解决方案吗?
编辑
因为我不想进行运行时初始化,所以我的解决方案是为每个
EHAL_PIN_STREAM_TEMPLATE
字段创建一个宏,并使用这些宏来填充 EHAL_STREAM_PIN_RF1
结构:
#include "file1.h"
const stream_ehal_pin_t EHAL_STREAM_PIN_RF1 = {
.stream = {FIELD1_TEMPLATE_VALUE, FIELD2_TEM...},
.pin = &EHAL_PIN_RF1
};
不可能做你想做的事。
有三个时间点进行初始化:
编译时
链接时间
运行时
编译时初始化需要编译时的值 - 您可以为此使用宏,但不能使用来自不同编译单元(不同的 .c 文件)的变量值,因为在该编译单元之外根本不可用。
链接时初始化对于简单值不存在,它仅存在于其他编译单元内变量/函数的地址。因此,您可以使用不同编译单元中某些内容的地址来初始化变量,并且该地址将在链接期间被替换。
运行时初始化也是一个选项,但你不喜欢那样......
通常,如果不需要运行时初始化,人们会出于此目的在头文件(可以包含到多个 .c 文件中)中定义宏。