文章目录
- openpnp - Smoothieware build
- 概述
- 笔记
- 用vs2022打开工程, 进行code review, 编译工程
- 现在来看看X-PAXES的问题
- 查一下我的配置文件中 mm_per_arc_segment 配置项, 在官方文档中没有说明的问题
- 剩下事情, 就是看逻辑了.
- END
openpnp - Smoothieware build
概述
在自己设备的配置中, 看到一个官方说明中不存在的配置项名称.
我知道自己用的固件是 Smoothieware_best-for-pnp , 那么就尝试编译一下工程, 然后再工程中找找这个配置项到底是啥名称, 看看是我设备配置文件的作者手误, 还是其他原因(e.g. 新版固件已经不用旧的配置项了?)
代码已经迁出到了本地, 看了文档, 编译过程官方有说明 http://smoothieware.org/compiling-smoothie
Smoothieware_best-for-pnp 是一个大神嫌弃官方没有修正他发现的bug, 而自己开的一个分支. 改的是实现, 但是其他(e.g. 编译, 使用)都和官方一致.
笔记
迁出后的工程目录为 D:\3rd_prj\Smoothieware_best-for-pnp
cd /d D:\3rd_prj\Smoothieware_best-for-pnp
D:\3rd_prj\Smoothieware_best-for-pnp>dir *.cmd
驱动器 D 中的卷没有标签。
卷的序列号是 36AD-51CE
D:\3rd_prj\Smoothieware_best-for-pnp 的目录
2023/02/25 20:29 4,740 win_install.cmd
1 个文件 4,740 字节
0 个目录 467,750,318,080 可用字节
安装工具链的脚本为win_install.cmd, 先运行她.
D:\3rd_prj\Smoothieware_best-for-pnp>win_install.cmd
Logging install results to D:\3rd_prj\Smoothieware_best-for-pnp\win_install.log
Downloading GNU Tools for ARM Embedded Processors...
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0
100 100M 100 100M 0 0 1918k 0 0:00:53 0:00:53 --:--:-- 1934k
Validating md5 signature of GNU Tools for ARM Embedded Processors...
Extracting GNU Tools for ARM Embedded Processors...
Creating helper scripts...
Performing a clean build of the gcc4mbed samples...
Cleaning up intermediate files...
**************************************************************************
To build gcc4mbed samples, you will first need to run the following batch
file so that your environment variables are set correctly:
D:\3rd_prj\Smoothieware_best-for-pnp\BuildShell.cmd
You will want to run this each time you start a new Command Prompt. You
can simply double-click on this batch file from Explorer to launch a
Command Prompt that has been properly initialized for building gcc4mbed
based code.
**************************************************************************
Finished successfully
请按任意键继续. . .
根据提示, 需要运行一个编译环境的脚本, 位置 : D:\3rd_prj\Smoothieware_best-for-pnp\BuildShell.cmd
D:\3rd_prj\Smoothieware_best-for-pnp>BuildShell.cmd
D:\3rd_prj\Smoothieware_best-for-pnp>
现在就有了编译环境的命令行, 以后每次开新命令行后, 如果想编译, 都要运行BuildShell.cmd 来得到编译环境.
重新干净的编译工程
make clean all
编译时, 看到好多警告, 不像是大神的作品.
Compiling modules/utils/panel/screens/3dprinter/WatchScreen.cpp
Compiling ../build/mbed_custom.cpp
Linking ../LPC1768/main.elf
Extracting ../LPC1768/main.hex
Extracting ../LPC1768/main.bin
Extracting disassembly to ../LPC1768/main.disasm
text data bss dec hex filename
388104 400 9868 398372 61424 ../LPC1768/main.elf
-
make[2]: Leaving directory `D:/3rd_prj/Smoothieware_best-for-pnp/src'
make[1]: Leaving directory `D:/3rd_prj/Smoothieware_best-for-pnp/src'
D:\3rd_prj\Smoothieware_best-for-pnp>
编译完后, 会得到一个main.bin
比较了我设备上原来的沙冰固件(从U盘中拷贝出来的 FIRMWARE.CUR), 发现和自己编译的main.bin size是一样的, 但是用bc4进行2进制比较, 差别极大.
现在先看看自己设备的当前固件版本:
使能串口助手的DTR, 可以看到沙冰主板回了ok.
输入M115可以看到冰沙版本.
现在关掉串口助手
将main.bin 拷贝改名为 firmware.bin, 将firmware.bin丢到冰沙主板的U盘中.
U盘只保留firmware.bin和config.txt, 其他都删掉.
在windows中弹出冰沙主板所在的U盘, 然后给主板重新上电(拔掉冰沙主板的USB通讯线, 看到主板灯都灭了, 然后再插上USB线), 等一会(上电后, 首先是4个LED在走马灯, 等4个灯只有一个在闪烁时, 应该固件就刷新好了. 第一次刷固件, 不太懂, 等2分钟吧), 就可以刷入新固件.
冰沙主板正常运行后, 会在电脑中产生一个U盘. 打开U盘.
如果看到固件名称已经由firmware.bin变为了FIRMWARE.CUR, 那么说明固件已经刷新成功.
现在用串口助手连上冰沙主板, 看看当前固件版本和我刷新前有啥区别?
可以看到固件版本是一样的, 都是best-for-pnp-23a1f0db
但是编译配置项不同:
旧固件 X-PAXES:5
新固件 X-PAXES:3
莫非 X-PAXES 指的是轴么? 旧固件是5轴的, 我自己编译出来的新固件是3轴的?
再研究吧, 先这样.
看看代码先.
用vs2022打开工程, 进行code review, 编译工程
如果想看看代码, 不在IDE中, 还真不好弄.
我再想作者怎么进行code review的.
看到工程下有一个归档的.vs目录, 里面有个.json
看一下这个.json大概长啥样子.
{
"version": "0.2.1",
"outDir": "\"${workspaceRoot}\\LPC1768\"",
"tasks": [
{
"taskName": "makefile-build",
"appliesTo": "/makefile",
"type": "launch",
"contextType": "build",
"command": "BuildShell.cmd",
"args": [
"make",
"all"
],
"envVars": {
"VSCMD_START_DIR": "\"${workspaceRoot}\""
}
},
{
"taskName": "makefile-clean",
"appliesTo": "/makefile",
"type": "launch",
"contextType": "clean",
"command": "BuildShell.cmd",
"args": [
"make",
"clean"
],
"envVars": {
"VSCMD_START_DIR": "\"${workspaceRoot}\""
}
},
{
"taskName": "makefile-rebuild",
"appliesTo": "/makefile",
"type": "launch",
"contextType": "rebuild",
"command": "BuildShell.cmd",
"args": [
"make",
"clean",
"all"
],
"envVars": {
"VSCMD_START_DIR": "\"${workspaceRoot}\""
}
},
{
"taskLabel": "任务-Smoothieware_best-for-pnp",
"appliesTo": "/",
"type": "launch"
}
]
}
看着像Visual Studio打开makefile工程时, 需要的配置文件.
那用vs试试, 手头有vs2019和vs2022, 就用vs2022试试.
选择的目录为 D:\3rd_prj\Smoothieware_best-for-pnp
很惊喜, 打开后, 居然文件组织的很好, 看起来就是打开的是目录.
在工程根节点上选择配置任务, 看到的内容和.vs目录下的文件相同. 关掉任务的配置文件, 不保存, 只是看一下.
选择工程的main文件, 就可以开始code reivew了.
在函数上右击, 选择转到实现, 也能转过去, 这很方便啊.
在vs2022中编译工程
打开IDE中的终端窗口
此时的编译步骤和上面在命令行中相同.
PS D:\3rd_prj\Smoothieware_best-for-pnp> dir *.cmd
目录: D:\3rd_prj\Smoothieware_best-for-pnp
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2023/4/28 14:15 57 BuildShell.cmd
-a---- 2023/2/25 20:29 4740 win_install.cmd
PS D:\3rd_prj\Smoothieware_best-for-pnp>
D:\3rd_prj\Smoothieware_best-for-pnp> .\BuildShell.cmd
D:\3rd_prj\Smoothieware_best-for-pnp>
D:\3rd_prj\Smoothieware_best-for-pnp>make clean all
...
开始编译了, 等待编译完成.
Linking ../LPC1768/main.elf
Extracting ../LPC1768/main.hex
Extracting ../LPC1768/main.bin
Extracting disassembly to ../LPC1768/main.disasm
text data bss dec hex filename
388104 400 9868 398372 61424 ../LPC1768/main.elf
-
make[2]: Leaving directory `D:/3rd_prj/Smoothieware_best-for-pnp/src'
make[1]: Leaving directory `D:/3rd_prj/Smoothieware_best-for-pnp/src'
编译完成后, 可以看到, 和命令行环境编译, 效果是一样的.
现在来看看X-PAXES的问题
可以看到 找到了M115命令回包的处理, 里面有X-PAXES从哪里来的解释.
case 115: { // M115 Get firmware version and capabilities
Version vers;
new_message.stream->printf("FIRMWARE_NAME:Smoothieware, FIRMWARE_URL:http%%3A//smoothieware.org, X-SOURCE_CODE_URL:https%%3A//github.com/markmaker/Smoothieware/tree/feature/best-for-pnp, FIRMWARE_VERSION:%s, X-FIRMWARE_BUILD_DATE:%s, X-SYSTEM_CLOCK:%ldMHz, X-AXES:%d, X-PAXES:%d, X-GRBL_MODE:%d",
vers.get_build(), vers.get_build_date(), SystemCoreClock / 1000000, MAX_ROBOT_ACTUATORS, N_PRIMARY_AXIS, THEKERNEL->is_grbl_mode());
#ifdef CNC
new_message.stream->printf(", X-CNC:1");
#else
new_message.stream->printf(", X-CNC:0");
#endif
#ifdef DISABLEMSD
new_message.stream->printf(", X-MSD:0");
#else
new_message.stream->printf(", X-MSD:1");
#endif
if(THEKERNEL->is_bad_mcu()) {
new_message.stream->printf(", X-WARNING:deprecated_MCU");
}
new_message.stream->printf("\nok\n");
return;
}
可以看到格式化字符串时, X-PAXES是第5个参数. 对应的赋值为宏 N_PRIMARY_AXIS
转到宏的定义, 可以看到 N_PRIMARY_AXIS 默认为3
#ifndef N_PRIMARY_AXIS
// This may chnage and include ABC
#define N_PRIMARY_AXIS 3
#endif
那就是说, 作者编译时, 在编译时定义了 N_PRIMARY_AXIS 为5.
不过, 我可以硬改宏为5啊
#ifndef N_PRIMARY_AXIS
// This may chnage and include ABC
#define N_PRIMARY_AXIS 5
#endif
现在编译一下, 看看是否编译出的.bin和我设备上的原始.bin2进制相同.
可以看出, 差异比 N_PRIMARY_AXIS 3 时小多了.
丢到主板上升级看看M115报的版本差多少?
升级后, M115回包如下
前面有旧版的回包截图, 贴过来比较
除了固件编译时间, 其他一摸一样.
这说明硬改宏为5是可以的.
M503命令可以看配置信息
M503\n
; No config override
;Steps per unit:
M92 X99.90000 Y99.95000 Z100.00000
;Acceleration mm/sec^2:
M204 S10000.00000
;X- Junction Deviation, Z- Z junction deviation, S - Minimum Planner speed mm/sec:
M205 X0.05000 Z-1.00000 S0.00000
;Max cartesian feedrates in mm/sec:
M203 X1000.00000 Y1000.00000 Z600.00000 S-1.00000
;Max actuator feedrates in mm/sec:
M203.1 X1000.00000 Y1000.00000 Z600.00000
;Digipot Motor currents:
M907 X0.40000 Y0.30000 Z1.00000 A0.40000 B0.40000
;E Steps per mm:
M92 E17.7777 P57988
;E Filament diameter:
M200 D0.0000 P57988
;E retract length, feedrate:
M207 S3.0000 F2700.0000 Z0.0000 Q6000.0000 P57988
;E retract recover length, feedrate:
M208 S0.0000 F480.0000 P57988
;E acceleration mm/sec虏:
M204 E5000.0000 P57988
;E max feed rate mm/sec:
M203 E6000.0000 P57988
;E Steps per mm:
M92 E17.7777 P39350
;E Filament diameter:
M200 D0.0000 P39350
;E retract length, feedrate:
M207 S3.0000 F2700.0000 Z0.0000 Q6000.0000 P39350
;E retract recover length, feedrate:
M208 S0.0000 F480.0000 P39350
;E a
cceleration mm/sec虏:
M204 E5000.0000 P39350
;E max feed rate mm/sec:
M203 E6000.0000 P39350
;Home offset (mm):
M206 X0.00 Y0.00 Z0.00
ok
查一下我的配置文件中 mm_per_arc_segment 配置项, 在官方文档中没有说明的问题
# !!!官网没有这个配置...
# Fixed length for line segments that divide arcs, 0 to disable
mm_per_arc_segment 0.0
上面的 mm_per_arc_segment 官方是没有说明的.
在代码中找找.
代码中是有的, 还好我老实, 没动配置文件内容.
剩下事情, 就是看逻辑了.
如果想弄清程序的运行逻辑, 光看和实验是不行的, 还需要单步调试.
但是这种在线升级工程, 是无法单步调试的, 已经订了LPC1769的板子, 等到了之后, 就知道咋单步调试了.
然后将无法单步调试的实现和配置改掉, 就可以从头开始单步调试了.
等熟悉工程之后, 就不用单步调试了, 就可以用官方提供的这种方式, 改完了, 看效果(可以通过增加额外的命令来回包, 达到和单步调试差不多的效果).