openpnp - Smoothieware project build

news2024/11/24 20:30:48

文章目录

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

END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/472303.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Centos7安装Redis

一、安装gcc依赖 由于 redis 是用 C 语言开发,安装之前必先确认是否安装 gcc 环境(gcc -v),如果没有安装,执行以下命令进行安装 [rootlocalhost local]# yum install -y gcc 二、下载并解压安装包 [rootlocalhost l…

opengauss 上mysql_fdw的编译、安装和使用

一、编译安装mysql_fdw 在编译opengauss时,configure中指定--enable-mysql-fdw,就可以一起把mysql_fdw编译出来,并且make install时也会安装相关文件和库,但是,有个前提,就是编译机器上要安装mariadb-libs…

关于HTML5画布canvas的功能

一、画布的使用 1、首先创建一个画布&#xff08;canvas&#xff09; <canvas id”myCanvas” width”200” height”100” style”border:1px solid #000000”></canvas> 2、使用JavaScript来绘制图像 <script> Var cdocument.getElementByID(“myCanv…

【C++】面向对象之多态

文章内的所有调试都是在vs2022下进行的&#xff0c; 部分小细节可能因编译器不同存在差异。 文章目录 多态的定义和实现概念引入多态的构成条件虚函数重写通过基类的指针或者引用调用虚函数 override和final 抽象类概念实现继承和接口继承 虚函数表单继承中的虚表打印虚表多继…

实时聊天对客户服务和销售推力有多大?(一)

实时聊天对于跨境电商客户服务来说&#xff0c;已经是不可或缺的存在。那么&#xff0c;他对于跨境电商增加销售量&#xff0c;改进客户服务有什么好处呢&#xff1f;接着往下看。 实时聊天对客户服务的好处 1.实时聊天可让您提供令人愉快的支持 将实时聊天作为客户支持产品…

反转字符串——leetcode344、leetcode541

文章目录 简单反转字符串题目详情分析Java完整代码 反转链表进阶问题题目详情分析Java完整代码 简单反转字符串 题目详情 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须…

Ansible自动化部署工具

Ansible自动化运维工具 一、自动化运维工具---Ansible1、运维工具特点2、Ansible运维工具原理3、Ansible自动化运维工具流程 二、安装Ansible1、安装准备2、Ansible控制端安装epel扩展源3、配置主机清单4、配置密钥对验证5、查询webserver组中主机的日期 三、Ansible命令模块1、…

API 扫盲贴,8分钟快速搞懂 API 框架

API&#xff08;应用程序编程接口&#xff09;是一种传递信息和指令的工具&#xff0c;它通过不同的功能和协议等手段&#xff0c;允许不同的软件或系统之间进行通信和交互。作为程序员或开发人员&#xff0c;API 是你日常工作中必不可少的组成部分。在本文中&#xff0c;我们将…

【人脸检测】——Sample and Computation Redistribution for Efficient Face Detection论文简读

人脸检测 摘要 在非受控人脸检测方面已经取得了巨大的进步&#xff0c;但低计算成本和高精度的高效人脸检测仍然是一个开放的挑战。作者提出了两种简单而有效的方法&#xff1a;样本再分配&#xff08;SR&#xff09;和计算再分配&#xff08;CR&#xff09;。在WIDER FACE上进…

H7-TOOL的CANFD Trace全解析功能制作完成,历时一个月(2023-04-28)

为了完成这个功能&#xff0c;差不多耗费了一个月时间&#xff0c;精神状态基本已经被磨平了。 当前已经支持&#xff1a; 1、LUA小程序控制&#xff0c;使用灵活。 2、采用SWD接口直接访问目标板芯片的CANFD外设寄存器和CANFD RAM区实现&#xff0c;支持USB&#xff0c;以太网…

docker登录harbor、K8s拉取镜像报http: server gave HTTP response to HTTPS client

docker登录harbor、K8s拉取镜像报http: server gave HTTP response to HTTPS client 当搭建完docker私有仓库后&#xff0c;准备docker login http://ip:端口 登录时会包如下错误 当我们使用docker私有仓库中的镜像在K8s集群中部署应用时会包如下错误 以上错误根据报错信息可…

执行增删改查时获取SQL语句

查询为例 查询方法由SqlSessionTemplate中创建DefaultSqlSession&#xff0c;然后执行DefaultSqlSession的selectList方法。 然后继续执行查询方法 执行executor.query方法&#xff0c;executor为CachingExecutor类型。 如果引入了pagehelper依赖&#xff0c;这里执行前会进…

【Android -- 开源库】数据库 Realm 的基本使用

简介 Realm 是一个 MVCC &#xff08;多版本并发控制&#xff09;数据库&#xff0c;由Y Combinator公司在2014年7月发布一款支持运行在手机、平板和可穿戴设备上的嵌入式数据库&#xff0c;目标是取代 SQLite。Realm 本质上是一个嵌入式数据库&#xff0c;他并不是基于 SQLit…

论文笔记:Model-ContrastiveFederatedLearning

0 简介 论文&#xff1a;Model-ContrastiveFederatedLearning 代码&#xff1a;https://github.com/QinbinLi/MOON 相关链接&#xff1a;本文主要是将SimCLR对比学习的思想迁移到联邦学习中&#xff0c;关于SimCLR的介绍见https://blog.csdn.net/search_129_hr/article/detail…

云计算主要学些什么技术内容?零基础能学会吗?

云计算主要学些什么技术内容&#xff1f;零基础能学会吗&#xff1f; 随着信息技术的不断发展&#xff0c;云计算作为一种新兴的技术&#xff0c;在当今社会中起到了越来越重要的作用&#xff0c;尤其是在数字化发展领域&#xff0c;不管是传统企业还是新经济领域&#xff0c;人…

Arthas--ognl表达式

背景 arthas执行ognl表达式&#xff0c;获取对应的jvm对象数据。ognl学习&#xff0c;可以查看上篇&#xff1a;https://xiaopanjia.blog.csdn.net/article/details/130425414 基本语法 ognl express -c {hashCode} --classLoaderClass {当前的全路径 ClassLoader 信息} -x …

windbg查看64位dump文件踩过的坑:没有二进制文件导致堆栈异常

项目上线了64位的软件&#xff0c;发现dump解析时堆栈不全&#xff0c;很多奇怪的地址&#xff1a; 64位只有pdb&#xff0c;没有二进制文件&#xff1a; 64位有pdb&#xff0c;也有二进制文件&#xff1a; 64位的这个问题把二进制文档和pdb放在一起就正常了。32位的发现没有…

不停机修复mysql主从数据同步错误导致服务器磁盘占满问题

事情的现象&#xff1a; 线上生产环境mysql服务器采用主从结构。突然告警从库服务器磁盘占用高。经过磁盘空间检查&#xff0c;主要是/mysql/data目录使用100%&#xff08;直接占满了&#xff09;&#xff0c;进入目录后发现被文件slave-relay-bin.*系列文件占满了。常理数据不…

28.Mybatis的入门

目录 一、Mybatis。 &#xff08;1&#xff09;Mybatis的简介。 &#xff08;2&#xff09;Mybatis的快速入门。 &#xff08;2.1&#xff09;快速入门。 &#xff08;2.2&#xff09;UserMapper.xml文件。 &#xff08;2.3&#xff09;sqlMapConfig.xml文件。 &#…

基于DSP+FPGA+ADS1282支持32Bit高精度数据采集方案(一)

3.1 系统需求分析 3.1.1 系统功能设计要求 本硬件处理平台的主要任务有三类&#xff0c;一是数据采集&#xff0c;包括采集惯性测量元件 的输出信号&#xff0c;接收外部系统校正信息&#xff0c;如 GPS 信息等&#xff1b;二是数据处理与计算&#xff0c;包 括惯性测量…