文章说明:

学习记录,本人小白,内容不一定正确,欢迎指正。由于最近在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.

 *