我正在用C实现一个用于微控制器的小系统。这个系统有多个传感器。受Linux内核的启发,我想为每种类型的传感器创建传感器-核心模块和分离的传感器。
在内核中实现新模块时,有一个宏module_init。该宏接受结构的指针,并将其存储在预定义内存部分。在内核开始时,所有模块的init函数都会根据该内存部分逐个调用,并带有函数指针。
我试着用我的传感器和传感器核心模块做一些类似的事情。假设我的传感器核心模块有一系列指针。每个传感器都创建自己的配置结构。我想写一个宏,它将复制这种结构的指针,并将其放在传感器核心模块中的数组中,所有这些都在编译时完成。
传感器-核心
struct sensor_config {
void (*init)(void) init;
...
};传感器-核心c:
#include "sensors-core.h"
struct sensor_config *sensors[SENSORS_MAX_NUM];sensor.c
#include "sensors-core.h"
void Init(void)
{
...
}
struct sensor_config config = {
.init = Init
};
SENSOR_INIT(config);我发现了一些类似的东西,但不是我想要的解决方案。在这里,我们可以向要在Plugin system for statically linked modules in C?之前调用的函数添加属性。
发布于 2022-01-02 22:05:13
内核不是uC。module_init需要一个函数,而不是一个结构,为此重写您的接口可能是个好主意。内核加载一个特别准备的文件并对其进行解析,从中找到要调用的适当函数。
我怎么能写这样的宏?
在节中放置指向变量的指针。
#define CONCAT(a, b) a##b
#define XCONCAT(a, b) CONCAT(a, b)
#define SENSOR_INIT(x) \
__attribute__((__section__("sensors"))) \
__attribute__((__used__)) \
const struct sensor_config *const CONCAT(sensor, __LINE__) = &x;然后,How do you get the start and end addresses of a custom ELF section?遍历部分中的指针并调用。
元素似乎是常量的,您可以只是将elemenst存储在部分中。
#define SENSOR_SECTION \
__attribute__((__section__("sensors"))) \
__attribute__((__used__))
SENSOR_SECTION
struct sensor_config config = { stuff; }是编译器特定的吗?
非常好。
或者我可以这样做,这样代码就可以移植了?
不是的。
可以使用外部实用程序作为构建过程的一部分来生成数组初始化。例如,执行#define SENSOR_INIT(x) /*nothing*/,然后使用外部程序(awk、Perl、Python)遍历所有源文件,以查找所有SENSOR_INIT(config);语句,并从中生成从所有文件中引用所有结构的sensors-core.c文件。
可以处理SENSOR_INIT()宏使用多少次,并动态地(在编译时)调整传感器数组大小?
不是的。
https://stackoverflow.com/questions/70559854
复制相似问题