首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用C预处理宏在核心模块中注册子模块。

用C预处理宏在核心模块中注册子模块。
EN

Stack Overflow用户
提问于 2022-01-02 21:19:18
回答 1查看 135关注 0票数 1

我正在用C实现一个用于微控制器的小系统。这个系统有多个传感器。受Linux内核的启发,我想为每种类型的传感器创建传感器-核心模块和分离的传感器。

在内核中实现新模块时,有一个宏module_init。该宏接受结构的指针,并将其存储在预定义内存部分。在内核开始时,所有模块的init函数都会根据该内存部分逐个调用,并带有函数指针。

我试着用我的传感器和传感器核心模块做一些类似的事情。假设我的传感器核心模块有一系列指针。每个传感器都创建自己的配置结构。我想写一个宏,它将复制这种结构的指针,并将其放在传感器核心模块中的数组中,所有这些都在编译时完成。

传感器-核心

代码语言:javascript
复制
struct sensor_config {
    void (*init)(void) init;
    ...
};

传感器-核心c:

代码语言:javascript
复制
#include "sensors-core.h"

struct sensor_config *sensors[SENSORS_MAX_NUM];

sensor.c

代码语言:javascript
复制
#include "sensors-core.h"

void Init(void)
{
    ...
}

struct sensor_config config = {
    .init = Init
};

SENSOR_INIT(config);

  1. 我怎么能写这样的宏?有可能吗?它是特定于编译器的,还是我可以这样做,以便代码是可移植的?
  2. 可以预先处理SENSOR_INIT()宏被使用多少次,并动态地(在编译时)调整传感器数组大小?我知道这个数组是在浪费记忆。在Linux内核中,初始化后,将释放包含指针列表的内存部分,以供其他用途。此时此刻,我不关心这一点,那将是下一步。

我发现了一些类似的东西,但不是我想要的解决方案。在这里,我们可以向要在Plugin system for statically linked modules in C?之前调用的函数添加属性。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-02 22:05:13

内核不是uC。module_init需要一个函数,而不是一个结构,为此重写您的接口可能是个好主意。内核加载一个特别准备的文件并对其进行解析,从中找到要调用的适当函数。

我怎么能写这样的宏?

在节中放置指向变量的指针。

代码语言:javascript
复制
#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存储在部分中。

代码语言:javascript
复制
#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()宏使用多少次,并动态地(在编译时)调整传感器数组大小?

不是的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70559854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档