文章说明:
学习记录,本人小白,内容不一定正确,欢迎指正。由于最近在diy 3D打印机,于是接触到marlin固件。
版本Marlin2.0
如果你只是为了使用固件,并不需要研究固件,只需修改配置文件即可。
书写习惯:
“marlin注释:” 指文字来源于 marlin源程序注释
“由此可知:” 指我的推测
“由此猜测:” 指我的推测,但不是很确定
marlin固件功能
- 读取解释G-code指令
- 控制步进电机
- 温度控制
- GUI
- ... ...
loop与setup
首先找到 loop()函数 和 setup() 函数
//我也刚接触arduino不久按我理解这个loop相当于正常C语言main()函数的while()
//而setup()函数一般是正常C语言while()之前的部分,用于初始化
这两个函数都位于MarlinCore.cpp
loop()
void loop() {
do {
idle();
#if ENABLED(SDSUPPORT)
if (card.flag.abort_sd_printing) abortSDPrinting();
if (marlin_state == MF_SD_COMPLETE) finishSDPrinting();
#endif
queue.advance();
endstops.event_handler();
TERN_(HAS_TFT_LVGL_UI, printer_state_polling());
} while (ENABLED(__AVR__)); // Loop forever on slower (AVR) boards
}
idle()函数
marlin注释:调用idle()来处理G-code命令之间的所有任务,idle执行期间无法执行G-codes队列,但许多g代码可以像宏一样在任何时候直接调用。
由此可知:G-code是一堆指令,存在一个队列存放这些指令且按顺序执行。指令执行间隔会调用idle()这个函数。
继续看idle()函数,跳转去看注释。
marlin注释:Core Marlin activities(填充队列)、管理加热器、看门狗、内存卡拔插处理... (先搁置)
SDSUPPORT
这四行是判断是否使用sd卡功能,sd卡用于更新固件、存放打印模型(G-code)文件。
queue.advance()
queue是之前提到的G-codes队列的实例,advance()方法应该是执行的意思。
endstops.event_handler()
marlin注释:endstops是管理 endstops 的单例对象。
而event_handler()的注释是:"Report endstop hits to serial. Called from loop()."
由此猜测:这个是打印结束的回调函数,或者是G-codes队列每一步执行完毕的回调。(搁置)
TERN_(HAS_TFT_LVGL_UI, printer_state_polling())
marlin注释:#define TERN_(O,A) _TERN(_ENA_1(O),,A) // OPTION ? 'A' : '<nul>'
由此可知:O应该是OPTION,即O为1时执行A否则什么也不干。即判断HAS_TFT_LVGL_UI是否开启,开启则执行printer_state_polling()。是一个在屏幕显示打印状态的函数。
while (ENABLED(__AVR__))
marlin注释:// Loop forever on slower (AVR) boards
在较慢的(AVR)板上永远循环,在快的板子也要永远循环才对。
由此猜测:在较慢的(AVR)板上使用while进行循环比loop更快。
setup()
初始化函数,跳转到注释:
/**
* Marlin Firmware entry-point. Abandon Hope All Ye Who Enter Here.
*