當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 嵌入式云IOT技術(shù)圈
[導(dǎo)讀]點(diǎn)擊上方「嵌入式云IOT技術(shù)圈」,選擇「置頂公眾號(hào)」第一時(shí)間查看嵌入式筆記!最近兩個(gè)月MBA美帝在職研的課程即將結(jié)束,經(jīng)過(guò)個(gè)人的努力,目前兩門(mén)課:全球商務(wù)、定量決策均分績(jī)點(diǎn)如下,基本上逼近滿分(凡爾賽了,哈哈哈),光鮮亮麗的背后,帶領(lǐng)小組始終沖在了班級(jí)的最前面,同時(shí)也付出了不少精...

點(diǎn)擊上方「嵌入式云IOT技術(shù)圈」,選擇「置頂公眾號(hào)」第一時(shí)間查看嵌入式筆記!

最近兩個(gè)月MBA美帝在職研的課程即將結(jié)束,經(jīng)過(guò)個(gè)人的努力,目前兩門(mén)課:全球商務(wù)、定量決策均分績(jī)點(diǎn)如下,基本上逼近滿分(凡爾賽了,哈哈哈),光鮮亮麗的背后,帶領(lǐng)小組始終沖在了班級(jí)的最前面,同時(shí)也付出了不少精力和汗水,通宵了不知道多少個(gè)夜晚,交完學(xué)期項(xiàng)目以后就結(jié)課啦,開(kāi)始進(jìn)入下一門(mén)課的學(xué)習(xí)!所以開(kāi)始有時(shí)間可以折騰新東西啦:(不少同學(xué)應(yīng)該知道我開(kāi)了個(gè)知識(shí)星球,專門(mén)分享這些內(nèi)容,這里就不好放出來(lái)啦,有興趣和我說(shuō)即可)

Marlin相當(dāng)龐大,自2.x版本開(kāi)始,陸陸續(xù)續(xù)開(kāi)始集成了32位機(jī),主流的STM32、LPC等高性能MCU逐漸取代了以Arduino2560等8位機(jī)的3D打印機(jī)方案。Marlin,龐大到讓每個(gè)初學(xué)者開(kāi)始學(xué)習(xí)看代碼都會(huì)覺(jué)得聞風(fēng)喪膽,當(dāng)然我剛開(kāi)始接觸的時(shí)候也不例外,但是不管是學(xué)什么東西,只要把大方向掌握了,那么細(xì)節(jié)的東西用到了再慢慢研究也不遲,同時(shí),Marlin的文檔非常少,對(duì)于初學(xué)者來(lái)說(shuō),是非常不友好的!以下這些介紹也是Marlin剛開(kāi)放不久的說(shuō)明文檔,筆者英語(yǔ)水平有限,如有翻譯失誤,盡情糾正與諒解!

1、Marlin代碼工程架構(gòu)

以下是原版的Marlin固件解壓下來(lái)的顯示情況:

當(dāng)使用 PlatformIO 構(gòu)建Marlin時(shí),它會(huì)在.pio此處創(chuàng)建一個(gè)文件夾,并且在shell中使用git的時(shí)候,這 是當(dāng)前的工作目錄,如下圖所示:

1.2、 buildroot 文件夾
該目錄包含開(kāi)發(fā)人員的幫助腳本、字體工具、CI測(cè)試工具、Marlin圖標(biāo)和其它數(shù)據(jù)

1.3、 buildroot/share/PlatformIO 文件夾
電路板定義、環(huán)境變量、鏈接腳本和構(gòu)建腳本會(huì)存放在這個(gè)地方,這個(gè)文件夾內(nèi)的構(gòu)建環(huán)境會(huì)經(jīng)常引用 ini文件夾

1.4、 ini 文件夾
包含按 MCU 類型組織的所有 PlatformIO 環(huán)境設(shè)置, platformio.ini 文件將這些引入為 PlatformIO 提供構(gòu)建/上傳/調(diào)試設(shè)置,有一個(gè)文件特別有用:即是Marlin自定義構(gòu)建腳本 features.ini 在構(gòu)建開(kāi) 始時(shí)用于根據(jù)啟用的功能過(guò)濾源文件,因此構(gòu)建能夠完成得更快。

1.5、 Marlin 文件夾
構(gòu)建Marlin時(shí),配置文件就放在這個(gè)位置:

1.6、 Marlin/src 文件夾
包含Marlin應(yīng)用程序,Marlin基于 Arduino 框架進(jìn)行開(kāi)發(fā),所以它含有 Arduino 框架的setup()?和?loop()?功能。

2、Marlin應(yīng)用源代碼Marlin/src 文件夾

Marlin應(yīng)用源代碼主要由以上文件夾組成,核心的入口程序文件是?MarlinCore.cpp?,MarlinCore.h?會(huì)做一些宏和變量以及函數(shù)的聲明,在這個(gè)文件中可以找到基于?Arduino?框架的?setup()?和?loop()?函 數(shù),其余的文件夾包含的源碼主要的作用如下:

  • core文件夾

包含Marlin源文件需要的類型、宏、使用程序功能等等,大多數(shù)源文件只需要包含?inc/MarlinConfig.h?就可以確保這些文件按預(yù)期順序包含在內(nèi)。

  • feature文件夾

包含一些可選功能的支持代碼,當(dāng)然這個(gè)文件夾下的代碼有些功能是非常簡(jiǎn)單的,只需要添加一個(gè) G代碼或者在公共代碼中插入更改即可完成。如果一個(gè)特性需要定義一個(gè)類或者一組函數(shù),這些附 加的文件將放在這個(gè)位置。

  • gcode 文件夾

包含GCodeParser?類的定義以及所有G代碼命令的實(shí)現(xiàn)(有一些不在這里實(shí)現(xiàn),但大部分是的),這 些功能都被包裝在一個(gè)名為?GcodeSuite?的類里,G代碼實(shí)現(xiàn)的文件被捆綁在多個(gè)類別的子文件夾 中,這些文件被命令為具體的G代碼,因此可以使用 IDE 的查找功能找到它們。

  • HAL文件夾

每個(gè)控制器系列都提供控制硬件的功能,但并非所有控制器系列都使用相同的接口,?Marlin2.x?版本實(shí)現(xiàn)了硬件抽象層,更好的屏蔽了平臺(tái)的差異性,使其它的平臺(tái)更好的兼容?Arduino?框架。

  • inc文件夾

包含了Marlin版本、配置條件等等的基本內(nèi)容,請(qǐng)注意,每個(gè)HAL還包含自己的?Conditionals*.h?和?SanityCheck.h文件 。

  • lcd 文件夾

所有與?LCDTFT、OLED、編碼器、按鈕和串行控制器的相關(guān)代碼都放在這里,語(yǔ)言翻譯通常僅 適用于外部控制器,因此語(yǔ)言翻譯也放在這里。

  • libs文件夾

任何通用數(shù)據(jù)函數(shù)實(shí)現(xiàn)或者與硬件庫(kù)代碼都放在這里,如蜂鳴器代碼、 CRC16 校驗(yàn)和實(shí)現(xiàn)、 3X3 矩陣、數(shù)字到字符串的轉(zhuǎn)換功能、用于二進(jìn)制傳輸?shù)?HeatShrink ,甚至還有幾個(gè) EEPROM 。

  • module文件夾

這里定義了機(jī)器的所有典型功能,包括 3D 打印機(jī)擁有的所有的組件,例如:加熱器和傳感器、熱 床探測(cè)、路徑規(guī)劃算法、將命令轉(zhuǎn)換為分段運(yùn)動(dòng)的高級(jí)運(yùn)動(dòng)功能、將毫米分段快速轉(zhuǎn)換為步進(jìn)塊的 運(yùn)動(dòng)路徑規(guī)劃,以及將塊段轉(zhuǎn)換為中斷時(shí)序和STEP信號(hào)的步進(jìn)器 ISR 。

  • pins文件夾

Marlin所有的板定義都在這個(gè)文件夾中,這里有不同的硬件架構(gòu),每個(gè)架構(gòu)下的每塊板都有自己獨(dú) 特的引腳文件,?pins.h?根據(jù)?MOTHERBOARD?設(shè)置進(jìn)行包含,由于?pins.h?是?MarlinConfig.h?的包 含文件注意,因此它不會(huì)包含在其它的地方。

  • sd 目錄

在這里您可以找到所有實(shí)現(xiàn)實(shí)際文件和文件夾的高級(jí)文件系統(tǒng)代碼。?CardReader?類是Marlin用 于導(dǎo)航目錄、打開(kāi)G-code文件和從SD卡(或其他媒體)打印的主界面。自從Marlin 2.0.8以來(lái),所有 的媒體類型都派生自?DiskIODriver?抽象類。

3、Marlin的配置

馬林是高度可配置的。您將在源代碼的許多地方發(fā)現(xiàn)應(yīng)用配置選項(xiàng)來(lái)打開(kāi)和關(guān)閉代碼、更改行為和提供 值。

  • Marlin源文件如何獲得它需要的所有配置值?
首先,當(dāng)您構(gòu)建一個(gè)c 程序時(shí),第一階段是分別構(gòu)建所有的. C和 .cpp 文件。這些文件中的每一個(gè)都 必須是完整的,并且每個(gè)文件都負(fù)責(zé)包含它需要的頭文件。在大型項(xiàng)目中,這可能會(huì)很乏味,所以很多 編譯器都允許您創(chuàng)建“預(yù)編譯頭文件”( .PCH 文件),包括所有公共頭文件。Marlin不使用 PCH 文件,而是 使用以類似方式工作的常規(guī)頭文件。

在inc、core、HAL和pins文件夾中頭文件的包含順序很重要,因?yàn)槊總€(gè)頭文件都是建立在其前身文件之 上的。為了確保始終遵循正確的包含順序,任何需要配置和條件文件(直到conditionals_ad.h)的代碼都 必須包含?inc/ marlinconfigpreh?,而任何需要完全實(shí)現(xiàn)的硬件配置的代碼都必須包含 inc/MarlinConfig.h

讓我們仔細(xì)看看每個(gè)文件包含的頭文件。

3.1、 MarlinConfigPre.h

3.2、 MarlinConfig.h

4、一個(gè)典型的源文件

將這些內(nèi)容放在一起,典型的源文件至少將包含 marlinconfigpreh ,以便它可以預(yù)先檢查一些配置 值。只有在需要時(shí),才會(huì)包含其他頭文件。有些源文件包含一些特性的頭文件是很常見(jiàn)的。

/**
*?(c)?2021?Marlin?Firmware
*?A?typical?Marlin?source.cpp?file.
*/
#include?"inc/MarlinConfigPre.h"
#if?ENABLED(MY_COOL_FEATURE)
#if?ENABLED(EXTENSIBLE_UI)
?#include?"lcd/extui/ui_api.h"
#endif
#endif?//?MY_COOL_FEATURE

5、典型的頭文件

Marlin頭文件不會(huì)像源文件一樣使用?#if…#endif?來(lái)包裝。相反,如果不需要頭文件,那么它就不會(huì)被 包含。Marlin還避免使用c風(fēng)格的?#ifdef?包裝器,并且只在自己的頭文件上使用?#pragma?一次。

/**
*?(c)?2021?Marlin?Firmware
*?A?typical?Marlin?header.h?file.
*/
#pragma?once
extern?int?my_feature_var;
void?do_feature_stuff();
當(dāng)該特性被禁用時(shí),一些頭文件將提供空函數(shù)。這使得在單個(gè)點(diǎn)關(guān)閉東西更容易,并且可以使其他地方 的代碼更整潔。

/**
*?(c)?2021?Marlin?Firmware
*?A?typical?Marlin?header.h?file.
*/
#pragma?once
#include?"inc/MarlinConfigPre.h"
#if?ENABLED(MY_COOL_FEATURE)
?extern?int?my_feature_var;
?void?do_feature_stuff();
#else
?inline?void?do_feature_stuff()?{}
#endif

6、Marlin的構(gòu)建過(guò)程

一個(gè)Marlin式的結(jié)構(gòu)可能需要一段時(shí)間,但它像其他任何草圖一樣工作。Marlin中的所有 .cpp 文件及 其依賴項(xiàng)都將被編譯,以及它們包含的任何內(nèi)容。使用 PlatformIO 的Marlin構(gòu)建將使用 ini 文件夾中 的文件以及?buildroot/share/PlatformIO?中的腳本,根據(jù)您的配置過(guò)濾掉未使用的源文件,從而使 其更快。

7、程序和命令流程

Marlin程序的執(zhí)行從?MarlinCore.cpp?開(kāi)始,setup()函數(shù)初始化,loop()函數(shù)主循環(huán),就像 Arduino 草 圖一樣。loop()函數(shù)非常小,主要負(fù)責(zé)調(diào)用idle(),然后在隊(duì)列前面運(yùn)行下一個(gè)G-code命令。

Marlin中的大多數(shù)任務(wù)都是通過(guò)空閑函數(shù)執(zhí)行的,該函數(shù)調(diào)用?manage_inactivity?和?thermalManager.manage_heater?。您將看到許多對(duì)空閑的調(diào)用,因?yàn)樗械却h(huán)都使用它來(lái)保持 機(jī)器運(yùn)行。如果Marlin太長(zhǎng)時(shí)間沒(méi)有呼叫空閑,看門(mén)狗就會(huì)被觸發(fā),為了安全重新啟動(dòng)機(jī)器。

這個(gè)程序架構(gòu)需要一些注意,因?yàn)槲覀儾幌M硞€(gè)函數(shù)被idle本身調(diào)用,直到堆棧爆炸為止。在Marlin 只有少數(shù)的再入守衛(wèi),所以在實(shí)踐中它工作得很好。

從空閑狀態(tài)跟蹤函數(shù)調(diào)用,可以很直觀地看到Marlin是如何使所有設(shè)備和特性在程序上下文中運(yùn)行的。一些特性一直在進(jìn)行活動(dòng),但是Marlin所做的大部分工作都是由G-code命令發(fā)起的。

8、中斷服務(wù)例程

Marlin定義了一些中斷服務(wù)例程( ISRs ):

  • 步進(jìn) ISR 反復(fù)運(yùn)行,通過(guò)向步進(jìn)電機(jī)的STEP和DIR引腳發(fā)送脈沖以高速移動(dòng)規(guī)劃隊(duì)列和步進(jìn)電機(jī)。這種中斷的頻率與移動(dòng)速度有關(guān)。
  • 溫度 ISR 以接近 1KHz 的頻率讀取溫度傳感器,并在讀數(shù)準(zhǔn)備好時(shí)向主程序發(fā)送信號(hào)。它還管理不 需要非常高基頻的加熱器和風(fēng)扇配置的軟件/慢 PWM 。
  • 終止 ISR 可以被激活,如果終止引腳是中斷能力的。它只在結(jié)束引腳的輸入狀態(tài)改變時(shí)觸發(fā)。
  • Tone Timer由 Arduino 為某些平臺(tái)定義,由Marlin為其他平臺(tái)定義。它處理脈沖壓電蜂鳴器來(lái)創(chuàng) 建音調(diào),它運(yùn)行的頻率是當(dāng)前音調(diào)的兩倍。
  • 伺服定時(shí)器提供了用于伺服系統(tǒng)的 PWM 信號(hào)。
平臺(tái)還將為Serial UART和其他設(shè)備定義中斷,所以Marlin必須小心選擇它使用的中斷和計(jì)時(shí)器。

9、G代碼的處理

接下來(lái),讓我們看看如何處理 G 代碼并遵循程序流程。

  • 0.緊急解析器
當(dāng)命令隊(duì)列被阻塞,但是機(jī)器需要用戶以某種形式輸入時(shí),您可以做什么?緊急解析器是一個(gè)簡(jiǎn)單的狀態(tài)機(jī),它在串行代碼的低級(jí)別上運(yùn)行,監(jiān)視某些命令。當(dāng)它看到 M108、M112 等時(shí),它立即采取行動(dòng)來(lái)處理代碼。

  • 1.從Serial和SD讀取
manage_inactivity函數(shù)調(diào)用queue.get_available_commands(),該函數(shù)檢查即時(shí)緩沖區(qū),查詢串行 端口,并讀取活動(dòng)的SD打印文件,將行復(fù)制到命令隊(duì)列中,目的是使其充滿。

  • 2.彈出G代碼
主循環(huán)()調(diào)用queue.advance()獲取隊(duì)列前面的命令并立即運(yùn)行它。在命令完成之前,Marlin不會(huì)返回到loop()。注意```queue.advance() ````在隊(duì)列之前運(yùn)行內(nèi)部命令,因此Marlin可以命令自身在常規(guī)命令流中 執(zhí)行一些操作。

  • 3.預(yù)掃描G代碼
一旦queue.advance()選擇了下一個(gè)命令,它就調(diào)用解析器對(duì)G-code行進(jìn)行預(yù)處理。預(yù)處理程序驗(yàn)證行號(hào)和校驗(yàn)和,如果一切正常,它會(huì)在調(diào)用特定的G-code處理程序之前對(duì)參數(shù)進(jìn)行快速預(yù)掃描。

  • 4.處理G代碼
所有的G-code處理程序都封裝在 GcodeSuite 類中(例如,?GcodeSuite::G28()?),盡管有一些在其他地方實(shí)現(xiàn)。G-code處理程序是一個(gè)簡(jiǎn)單的沒(méi)有返回值的void方法。它不是從函數(shù)調(diào)用中獲取參數(shù),而是查詢 GCodeParser 類來(lái)檢查參數(shù)并讀取它們的值。例如,處理程序使用parser.seen('X')來(lái)檢查'X'參數(shù)是否存在,然后調(diào)用parser.value_float()以浮點(diǎn)數(shù)的形式獲取其數(shù)值。請(qǐng)參閱gcode/parser.h獲取所有可用的方法。

G-code處理程序幾乎可以做任何事情,所以它們被分成單獨(dú)的文件,每個(gè)文件只包含它需要的頭文件。所有處理程序必須包括gcode.h,這將包括parser.h。

  • 5.命令阻塞
當(dāng)一個(gè) G1 命令的移動(dòng)隊(duì)列被加入時(shí),它就被認(rèn)為是完成的,所以它可以立即返回。在實(shí)踐中,特別是 在床水平啟用時(shí),每一次線性移動(dòng)都有可能填滿規(guī)劃隊(duì)列,并阻塞長(zhǎng)時(shí)間等待空間打開(kāi)。

當(dāng)一個(gè)命令需要等待計(jì)劃器或用戶反饋中的空閑空間等內(nèi)容時(shí),它將調(diào)用空閑函數(shù)以保持機(jī)器的活動(dòng)和 運(yùn)行。idle函數(shù)甚至?xí)魅氲拿钭x取到隊(duì)列中,但是由于idle函數(shù)并不會(huì)分發(fā)g代碼或推進(jìn)隊(duì)列,所 以在處理程序結(jié)束并返回之前,隊(duì)列不能獲得任何空的命令。

往期精彩

步進(jìn)電機(jī)驅(qū)動(dòng)在3D打印應(yīng)用的學(xué)習(xí)筆記(一)

光固化3D打印懸空和支撐講解

3D打印過(guò)程與最近的學(xué)習(xí)成果

兩個(gè)最常用的3D打印機(jī)切片軟件

3D打印機(jī)marlin固件框架與GCode命令總結(jié)

3D打印機(jī)Marlin固件串口功能解析和程序移植

讓野火F103開(kāi)發(fā)板支持Marlin2.0固件是什么體驗(yàn)?3D打印主控板成員 1

C語(yǔ)言映射表在嵌入式串口解析、UI設(shè)計(jì)中的應(yīng)用(值得收藏并實(shí)踐的精華帖)

覺(jué)得本次分享的文章對(duì)您有幫助,隨手點(diǎn)[在看]并轉(zhuǎn)發(fā)分享,也是對(duì)我的支持。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉