文章目录
- 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的板子, 等到了之后, 就知道咋单步调试了.
 然后将无法单步调试的实现和配置改掉, 就可以从头开始单步调试了.
 等熟悉工程之后, 就不用单步调试了, 就可以用官方提供的这种方式, 改完了, 看效果(可以通过增加额外的命令来回包, 达到和单步调试差不多的效果).



















