我正在编写一个固件,我想在多个 .c 文件中定义函数“命令”,并自动将它们插入函数指针列表中。随后,我想从串行端口调用数组中存在的这些命令之一,并使用参数列表执行它。
有一个用于 3d 打印机的固件,我依靠它来实现这样的事情。
https://github.com/KevinOConnor/klipper
使用的软件结构是这个“远程过程调用” https://en.wikipedia.org/wiki/Remote_procedure_call
在这个固件中,命令在.ch文件中实现并且有.h 中没有原型
例如:
void command_set_digital_out(uint32_t *args)
{
gpio_out_setup(args[0], args[1]);
}
DECL_COMMAND(command_set_digital_out, "set_digital_out pin=%u value=%c");
以下是使用的定义列表
// Declare a function to run when the specified command is received
#define DECL_COMMAND_FLAGS(FUNC, FLAGS, MSG) \
DECL_CTR("DECL_COMMAND_FLAGS " __stringify(FUNC) " " \
__stringify(FLAGS) " " MSG)
#define DECL_COMMAND(FUNC, MSG) \
DECL_COMMAND_FLAGS(FUNC, 0, MSG)
// Declare a compile time request
#define DECL_CTR(REQUEST) \
static char __PASTE(_DECLS_, __LINE__)[] __attribute__((used)) \
__section(".compile_time_request") = (REQUEST)
#define __stringify_1(x) #x
#define __stringify(x) __stringify_1(x)
#define ___PASTE(a,b) a##b
#define __PASTE(a,b) ___PASTE(a,b)
随后,当固件获取串行代码时,它能够根据请求调用这些声明的函数。这怎么可能 ?
我无法复制这一点,在我为 platformio 中的 AVR 编写的固件中,是否有一种简单且类似的方法来动态声明函数列表?