Contact me: hankecnc@gmail.com

预处理器抽象实现更多轴而不用#857

推推 grbl 3年前 (2023-01-23) 245次浏览

关闭
cri-s 打开了这个问题 2015 年 11 月 27 日 · 1条评论
关闭

预处理器抽象实现更多轴而不用#ifdef#857

cri-s 打开了这个问题 2015 年 11 月 27 日 · 1条评论

注释

预处理器抽象实现更多轴而不用#857

嗨,我使用了最新的 master 并做了一些预处理器抽象。
现在可以添加更多轴,只需 在 default.h 文件/文件夹中定义
#define DEFAULT_AXIS X,Y,Z,U,V,W 。 这是使用一些预处理完成的,下面有一些细节。 我需要添加检测并为代码计时,实际上它在硬件中未经测试。 它在 mega2560 上更有用,但至少 6 轴在 328p 上也是可能的。 正式收录这样的修改有意思吗?

我已经使用了 grep 了我使用此预处理更改的内容,结果在这里。

gcode.c: MAP(check_letter,DEFAULT_AXIS);
nuts_bolts.h:enum { FOREACH(AXIS_ID, , AXIS) }; // 构建 X_AXIS 常量
report.c: const uint8_t axis[] = { FOREACH(AXIS_ID,AXIS_QUOTE
 ,) };
settings.c: FOREACH(DEFAULT,settings.steps_per_mm,STEPS_PER_MM+FLT_EPSILON);
settings.c: FOREACH(DEFAULT,settings.max_rate,MAX_RATE);
settings.c: FOREACH(DEFAULT,settings.acceleration,ACCELERATION);
settings.c: FOREACH(DEFAULT,settings.max_travel,MAX_TRAVEL);
settings.c: FOREACH(AXIS) settings.steps_to_mm[idx]=1.0/settings.steps_per_mm[idx];
settings.c: unsigned char axis[]={ FOREACH(AXIS_BIT, ,_STEP_BIT) };
settings.c: unsigned char axis[]={ FOREACH(AXIS_BIT, , DIRECTION_BIT) };
settings.c: unsigned char axis[]={ FOREACH(AXIS_BIT, , LIMIT_BIT) };
stepper.c: uint32_t FOREACH(AXIS_ID,计数器,);
stepper.c: FOREACH(AXIS_IDs, st.counter
 , (=) ,)
stepper.c: FOREACH(AXIS)
stepper.c: MAP(calc_step,DEFAULT_AXIS);
stepper.c: FOREACH(AXIS) {
stepper.c: FOREACH(AXIS)
stepper.c: FOREACH(AXIS)
system.c: FOREACH(AXIS) 步进器.c: FOREACH(AXIS)

定义示例在这里:

定义 FOREACH_AXIS_IDs(pre,sep,post) CONCAT(MAP_,AXIS_N)(sep,map_PrePost,pre,post,DEFAULT_AXIS)

定义 FOREACH_AXIS_ID(pre,post) CONCAT(MAP_,AXIS_N)( (,) ,map_PrePost,pre,post,DEFAULT_AXIS)

定义 FOREACH_AXIS_BIT(pre,post) CONCAT(MAP_,AXIS_N)( (,) ,map_callBit,pre,post,DEFAULT_AXIS)

其中 MAP_ 基本上定义为

定义 MAP_(n,f,a,b,x…) f(NTH(n,x),a,b)

和 NTH:

定义 NTH_(n,x…) CONCAT(NTH,n)(x,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0)

定义 NTH(x…) NTH_(x)

定义 NTH0(DEFAULT_AXIS…) CAR(DEFAULT_AXIS)

定义 NTH1(DEFAULT_AXIS…) CAR(CDR(DEFAULT_AXIS))

定义 NTH2(DEFAULT_AXIS…) CAR(CDR(CDR(DEFAULT_AXIS)))

定义 NTH3(DEFAULT_AXIS…) CAR(CDR(CDR(CDR(DEFAULT_AXIS))))

定义 NTH4(DEFAULT_AXIS…) CAR(CDR(CDR(CDR(CDR(DEFAULT_AXIS)))))

定义 NTH5(DEFAULT_AXIS…) CAR(CDR(CDR(CDR(CDR(CDR(DEFAULT_AXIS))))))

定义 NTH6(DEFAULT_AXIS…) CAR(CDR(CDR(CDR(CDR(CDR(CDR(DEFAULT_AXIS)))))))

定义 NTH7(DEFAULT_AXIS…) CAR(CDR(CDR(CDR(CDR(CDR(CDR(CDR(DEFAULT_AXIS))))))))

定义 NTH8(DEFAULT_AXIS…) CAR(CDR(CDR(CDR(CDR(CDR(CDR(CDR(CDR(DEFAULT_AXIS)))))))))

定义 NTH9(DEFAULT_AXIS…) CAR(CDR(CDR(CDR(CDR(CDR(CDR(CDR(CDR(CDR(DEFAULT_AXIS))))))))))

预处理器抽象实现更多轴而不用#857
成员

@cri-s:感谢抽象说明,但我个人并不觉得#ifdefs 很烦人。他们通常清楚地指出可以删除哪些代码或直接在代码中涉及特定的#define。我有一个一般规则,即宏应该尽可能简单。没有递归之类的。我并不是说现在有什么是最佳的,但它并不像您发布的这些 FOREACH 和 NTH 定义那样难以阅读和破译。

喜欢 (0)