当前位置: 首页 > news >正文

stm32 Bootloader设计(YModem协议)

stm32 Bootloader设计(YModem协议)

  • Chapter1 stm32 Bootloader设计(YModem协议)
    • YModem协议:
    • STM32 Bootloader软件设计
    • STM32 Bootloader使用方法
      • 准备工作
      • stm32 Bootloader修改:
      • stm32目标板程序.bin偏移地址修改:
  • Chapter2 STM32 + IAP + Ymodem完美结合
    • 一、关于ISP、ICP、IAP
      • 1.ISP
      • 2.ICP
      • 3.IAP
      • IAP通信口
    • 二、关于Ymodem协议
      • 1.起始帧
      • 2.数据帧格式
      • 3.结束帧的数据格式
    • 三、ST官网IAP例程
    • 四、IAP例程几个要点
      • 1.例程概要说明
      • 2.IAP软件工程
      • 3.说明
    • 五、APP代码和地址问题
      • 1.添加代码
      • 2.修改配置
      • 3.生成Bin
      • 4.APP程序代码生成
    • 六、超级终端安装,程序下载
      • 1.超级终端下载、安装
      • 2.程序下载
  • Chapter3 SecureCRT:Yomden协议传输文件的相关使用说明
      • 1、传输文件的单个数据包大小:128byte和1024byte两种选择:
      • 2、打开文件:
      • 3、发送文件

Chapter1 stm32 Bootloader设计(YModem协议)

原文链接:https://blog.csdn.net/qinrenzhi/article/details/82771527

相信很多人都希望,不开盖就可以对固件进行升级吧,就像手机那些。下文中的bootload就来实现这样的功能。

前段时间有项目关于Bootload设计。所以就仔细的去了研究了一翻。以前都是用的stm32官方的,没有去深入了解。这次做完了过后,发现官方的版本存在一些问题。比如说YModem传送过程中,完全没有对数据区进行效验,只是核对了下编号,就进行烧写。整个程序完全为阻塞式,浪费了大量的cpu做无用功。当然这在升级程序方面也用不了多少时间。有一个重要的问题,官方代码只可以用超级终端进行传输。这样如果你用的是64位的win7,那就没有办法升级。因为只有xp或32位的win7才可以使用 超级终端。64位的win7下超级终端没办法使用。 不过SecureCRT工具到是可以在64位win7使用,但是官方代码不对其支持。SecureCRT下支持的是最原始的YModem协议,第一帧数据包中不包含总字节数。超级终端下的YModem应该是改进版的,所以官方的dome只可以在超级终端下传输。下面会对YModem进行详细说明。就会知道其中的原因。

首先奉上一个精简的Bootloader工程。

网盘失效。

支持协议:YModem, YModem-G。

所支持的PC软件:超级终端,SecureCRT。

http://pan.baidu.com/share/link?shareid=373637&uk=118334538

YModem协议:

YModem协议是由XModem协议演变而来的,每包数据可以达到1024字节,是一个非常高效的文件传输协议。下面有一些相关的文档。这里要感谢关注我微博的一些朋友提供的资料。省去了不少时间。

下面先看下YModem协议传输的完整的握手过程:先看下图

SENDER:发送方。

RECEIVER:接收方。

第一步先由接收方,发送一个字符’C’

发送方收到’C’后,发送第一帧数据包,内容如下:

SOH 00 FF Foo.c NUL[123] CRC CRC

第1字节SOH : 表示本包数据区大小有128字节。如果头为STX表示本包数据区大小为1024

第2字节00 : 编号,第一包为00,第二包为01,第三包为02依次累加。到FF后继续从0循环递增。

第3字节FF : 编号的反码。 编号为00 对应FF,为01对应FE,以此类推。

第4字节到最后两字节 :若第1字节为SOH时有128字节,为STX时有1024字节,这部分为数据区。“Foo.c” 文件名, 超级终端下,在文件名后还有文件大小。官方dome也是因为使用了这个文件大小进行比对。这就是为什么用SecureCRT中的YMODEM协议而无法正确传输的原因。

在文件名和文件大小之后,如果不满128字节,以0补满。

最后两字节:这里需要注意,只有数据部分参与了效CRC验,不包括头和编码部分。

16位CRC效验,高字节在前,低字节在后。

接收方收到第一帧数据包后,发送ACK正确应答。

然后再发送一个字符’C’。

发送方收到’C’后,开始发送第二帧,第二帧中的数据存放的是第一包数据。

接收方收到数据后,发送一个ACK然后等待下一包数据传送完毕,继续ACK应答。直到所有数据传输完毕。

数据传输完毕后,发送方发EOT,第一次接收方以NAK应答,进行二次确认。

发送方收到NAK后,重发EOT,接收方第二次收到结束符,就以ACK应答。

最后接收方再发送一个’C’,发送方在没有第二个文件要传输的情况下,

发送如下数据

SOH 00 FF 00~00(共128个) CRCH CRCL

接收方应答ACK后,正式结束数据传输。

以上部分,为YMODEM协议的基本操作流程。

STM32 Bootloader软件设计

笔者一开始软件的基本思想,串口接收数据,和写数据到ROM中,两者可以同步进行。这样可以让cpu得到最大程度的有效利用。

比如说接收一帧1024的数据,所用的时间= 当前波特率单字符所用时间 * (1024 + 1头 + 2编码 + 2CRC)= (1/115200 * 10) * (1024 + 1 + 2 + 2) = 89.323ms

也是就是,在接收的这90ms左右的时间里,在接收下一帧结束这一期间内,可以把上一帧的数据写入到ROM中。 串口接收数据是中断的方式,所以收写操作基本上算同步运行。程序流程如下

STM32 Bootloader使用方法

这个STM32 Bootloader程序使用起来很简单,如果你以前没有用过IAP升级方式,也没关系下面会详细说明。

准备工作

硬件:有串口目标板1,串口连接线。

软件:PC工具:超级终端 或SecureCRT,stm32目标板程序.bin,stm32 Bootloader。

  1.     先把上面的工程stm32 Bootloader下载到目标板中;
    
  2.     打开超级终端 或SecureCRT,设置波特特115200,停止位1,数据位8,效验无。
    
  3.     先按下‘C’再给目标板上电;(注意先后顺序)
    
  4.     选择1,然后使用YModem, YModem-G协议发送"stm32目标板程序.bin"文件。
    
  5.     传输完毕后,会自动运行。
    

注意:以下两处根据自己的需求调整

stm32 Bootloader修改:

找到工程下的common.h文件:

以下三个宏定义根据自己目标板的需求来定:

#define ApplicationAddress 0x8002000 //程序首地址

#define ApplicationSize 120000 //目标程序预留空间

#define STM32F10X_HD //目标板芯片类型

stm32目标板程序.bin偏移地址修改:

有两个地方:

1找到system_stm32f10x.c

#define VECT_TAB_OFFSET 0x2000 /*!< Vector Table base offset field.

Chapter2 STM32 + IAP + Ymodem完美结合

对于软件工程师来说,代码升级(或程序更新)算是必备基础知识。

下面将介绍关于编程的基础知识,以及结合STM32官方提供的Demo讲述一下关于编程的内容。

一、关于ISP、ICP、IAP

1.ISP

ISP:In System Programing,在系统编程。

比如:使用STC-ISP对STC芯片编程,利用Flash loader对STM32编程等。

支持ISP的芯片一般在芯片内部固化了一段(用ISP升级的)boot程序。

2.ICP

In Circuit Programing,在电路编程。

ICSP:In-Circuit Serial Programming,在电路串行编程。如:对EEPROM编程等。

ICP编程方式网上各有说法,从字面含义(在电路)来说,所有处于编程的芯片都需要上电,都处于电路中。不严格来说利用J-Link、ST-Link、e-Link32等工具进行编程也属于在电路编程(ICP)。

在维基百科中,在系统编程(ISP),也称为在电路串行编程(ICSP)。

3.IAP

In applicating Programing,在应用编程。

这里是本文说的重点,可以简单理解为:在程序运行的过程中进行编程(升级程序,更新固件)。

IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。[来自百度百科]

IAP通信口

IAP的通信口有许多种:UART串口、ETH以太网、I2C、SPI…等。按理说只要能传输数据的通信口都能实现IAP的功能。

本文结合STM32官网提供的例程,利用UART在应用编程(IAP)。

二、关于Ymodem协议

YModem是一种文件传输的协议,由XModem协议演变而来的,每包数据可以达到1024字节,是一个非常高效的文件传输协议。

更多介绍可参考百度百科:

https://baike.baidu.com/item/Ymodem

协议传输流程:

在这里插入图片描述
其中几个字符的ASCII码
在这里插入图片描述

1.起始帧

SOH + 00 + FF + filename + filesize + NULL + CRCH + CRCL

起始帧是文件传输发送端发的第一条重要消息.

filename表示传输文件的文件名.

filesize表示需要传输文件的大小.

CRCH + CRCL 表示整条帧(去掉前三个字节)的CRC16校验.

2.数据帧格式

STX/SOH + [编号] + 编号的反码 + data[0] + data[1] + data[2] + … + CRCH + CRCL

SOH 表示有128个字节, 有的也只用SOH传输数据.

STX 表示有1024个字节.

CRCH + CRCL 表示整条帧(去掉前三个字节)的CRC16校验.

如果传输最后一条字节不足128个字节, 则用1A填充

3.结束帧的数据格式

SOH + 00 + FF + NULL + NULL + … + NULL + CRCH + CRCL

以上部分内容授权转自:

https://blog.csdn.net/weixin_41294615/article/details/104652105

三、ST官网IAP例程

ST官网提供的IAP例程有很多很多,比如:

库:有使用标准外设库(SPL)的、有使用硬件抽象层库(HAL)的;

通信口:有使用USART的,有使用I2C的,有使用ETH的等。

MCU型号:STM8S、STM32F1、F4、L1等几乎全系列都有。

ST官网提供的各种IAP,其方法和原理其实都类似:就是将程序文件(二进制文件)写入FLASH。

本文以最简单的基于(STM32F10x)利用SPL库+UART的IAP为例来给大家讲述一下。(复杂都是从基础开始,后续逐步为大家更新更高级的IAP功能)

STM32F10xxx in-application programming using the USART官方地址:

https://www.stmicroelectronics.com.cn/content/st_com/en/products/embedded-software/mcus-embedded-software/stm32-embedded-software/stm32-standard-peripheral-library-expansion/stsw-stm32008.html

(提示:公众号不支持外部链接,请复制链接到浏览器下载)
在这里插入图片描述
相关参考文档和代码例程都在这个网址下载,下一章节针对这里该IAP讲述几点重要内容。

四、IAP例程几个要点

1.例程概要说明

该代码工程基于STM32F1,使用UART通信口,利用超级终端(上位机)、通过YModem协议实现代码程序的数据传输和写入Flash。

2.IAP软件工程

我们解压(上面)下载好的软件工程包,进入目录,通过MDK-ARM(为例),如下图;
在这里插入图片描述
本文以MDK-ARM为例,你也可以通过EWARM、TrueSTUDIO等工具打开。

因该工程代码是之前用MDK-ARM V4版本建立的,现在用V5版本打开会提示如下信息:
在这里插入图片描述
只需要点击“Migrate to Device Pack”即可,V5版本使用了“设备支持包”,这里大概意思就是使用设备支持包兼容以前老版本工程。

选择对应的目标(我们以F103ZE为例,选择大容量、小容量在于他们的FLASH页大小不一样), 选择10E-EVAL,如下图:
在这里插入图片描述
直接编译,没有错误警告,此时,如果有对应的板卡,可直接下载。

3.说明

这个程序只是IAP程序,放在以0x0800 0000为起始的地址。而IAP程序的作用是将应用程序(二进制文件)下载到应用程序对应的地址。

因此,我们会将FLASH划分我两个区域:IAP程序区域,APP程序区域。
在这里插入图片描述
这里IAP程序有两个作用:1.对APP程序编程;2.引导程序跳转至应用程序。所以,这段APP程序也叫BootLoader。

为防止IAP程序不被(第一部分代码)不被意外破坏,一般建议对IAP程序进行“写保护”。

这个APP地址0x0800 3000是怎样来的呢?

见IAP程序代码:
在这里插入图片描述
所以,我们APP应用程序的其起始地址就必须对应为0x0800 3000 才行。不然,跳转之后没有应用程序,则会出错。

提示:

它这里是通过按键方式选择执行IAP,还是执行APP;一般建议通过倒计时(比如5s):5s之内通过串口选择下载,否则自动跳转到APP程序执行。这里就需要自己根据情况修改代码。

Demo里程可以通过选择3跳转到APP程序,初学者可以直接不使用按键判断,进行测试,如下图,修改一下:
在这里插入图片描述

五、APP代码和地址问题

上一章节是讲述的IAP程序,本节讲APP程序修改地址的问题。

1.添加代码

在代码开始设置向量表偏移:

NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x3000);

0x3000代表偏移量

2.修改配置

project -> Options
在这里插入图片描述

3.生成Bin

4.APP程序代码生成

六、超级终端安装,程序下载

1.超级终端下载、安装

官方提供的文档是HyperTerminal超级终端下载程序,这个可以百度谷歌搜索下载安装。我这后面一直使用SecureCRT这款终端,这终端属于商业软件,但在网上可以找到很多po解的办法。

2.程序下载

硬件连接好,将生成的程序文件(Demo.bin)放在指定位置(为方便测试下载,我拷贝到桌面)-> 打开终端 -> 键盘按1 ->选择文件 ->下载完成 -> 键盘按3 执行程序。
在这里插入图片描述
以上内容就是关于STM32 + IAP + Ymodem的基础知识和例程说明,希望对你有帮助。

版权声明:本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。

Chapter3 SecureCRT:Yomden协议传输文件的相关使用说明

原文链接:https://blog.csdn.net/Go_RoCo/article/details/87375366

使用SecureCRT的Yomden传输文件传输文件的相关使用说明和设置
这里不做Ymodem协议的展开,仅仅记录使用。

1、传输文件的单个数据包大小:128byte和1024byte两种选择:

菜单栏->Options->Sessions Options->Timinal->X/Y/Zmodem->X/Ymodem send packet size
在这里插入图片描述
可以设置文件的开发路径和包的大小,设置后需要重新启动一下才能生效。

2、打开文件:

菜单栏->Transfer->Send Ymodem->选择文件->选择后在下面的Files to send 会有需要被发送的文件,发送成功文件会被自动清除。

3、发送文件

在这里插入图片描述
1、打开文件后会等待节点设备的 “C”字符,然后进入数据传输。
2、如果没收数据或者数据发送中错误就一直等,界面提示的可以使用 CTRL+C也关不掉,只能断开连接,重新连接才可以.
3、数据传输正确并结束后,发现还是卡着。多次试验后发现,在文件发送结束后,可以延迟一小会几十或几百毫秒,然后重新发一个任意字符就可以重新使用了.

相关文章:

stm32 Bootloader设计(YModem协议)

stm32 Bootloader设计&#xff08;YModem协议&#xff09; Chapter1 stm32 Bootloader设计(YModem协议)YModem协议&#xff1a;STM32 Bootloader软件设计STM32 Bootloader使用方法准备工作stm32 Bootloader修改&#xff1a;stm32目标板程序.bin偏移地址修改&#xff1a; Chapt…...

竞赛 题目: 基于深度学习的疲劳驾驶检测 深度学习

文章目录 0 前言1 课题背景2 实现目标3 当前市面上疲劳驾驶检测的方法4 相关数据集5 基于头部姿态的驾驶疲劳检测5.1 如何确定疲劳状态5.2 算法步骤5.3 打瞌睡判断 6 基于CNN与SVM的疲劳检测方法6.1 网络结构6.2 疲劳图像分类训练6.3 训练结果 7 最后 0 前言 &#x1f525; 优…...

ubuntu 16.04.5 安装 vivado 2019.1 完整编译AD9361的环境

一、前期安装 1、安装ncurses库&#xff08;已经包含了&#xff0c;其他的os需要安装&#xff09; sudo apt install libncurses5二、安装 sudo ./xsetup使用lic进行激活。 三、安装后 输入指令 sudo gedit ~/.bashrc 末尾添加 source /opt/Xilinx/Vivado/2019.1/setti…...

Zotero详细功能补充!熟练使用!【进阶版,持续更新】

Zotero安装请参见文章Zotero安装 1.改变条目文件夹 如果直接选择条目直接进行移动&#xff0c;能移动成功&#xff0c;但是原来文件夹和目标文件夹都会存在&#xff0c;实际是复制&#xff01; 如果只想保留在一个文件夹里面&#xff0c;可以选中条目&#xff0c;右击-从分…...

【Windows】Windows系统常用命令大全

现实生活中&#xff0c;对电脑越熟悉懂得的快捷命令就越多。例如我们日常遇到的比较方便办公技巧&#xff0c;用快捷命令调用工具&#xff1a;调用计算器&#xff0c;Win键R&#xff0c;输入calc&#xff0c;回车&#xff0c;计算器界面弹出来&#xff1b; 调用记事本&#xff…...

大语言模型研究进展综述

1、历史 自20世纪50年代图灵测试被提出以来&#xff0c;研究人员一直在探索和开发能够理解并掌握语言的人工智能技术。 作为重要的研究方向之一&#xff0c;语言模型得到了学术界的广泛研究&#xff0c;从早期的统计语言模型和神经语言模型开始&#xff0c;发展到基于Transform…...

linux gdb 调试 常见调试命令介绍+总结

1.调试前准备 -g gcc arcg.c -g -oO -o app //必须添加-g 2.调试 gdb gdb app 3.常见调试命令 set args 1 2 3 4 5 6 //设置参数 show args //查看参数 3.1执行程序 1.start2. run gdb app set args 1 2 3 4 5 start //执行一行 c //继续执行 q…...

基于JavaWeb+SSM+Vue微信小程序校园兼职任务平台系统的设计和实现

基于JavaWebSSMVue微信小程序校园兼职任务平台系统的设计和实现 源码传送入口前言主要技术系统设计功能截图Lun文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码传送入口 前言 随着社会的发展和全球疫情的冲击&#xff0c;大学生的就业形势越来越严峻。越…...

我的MQTT操作类(M2Mqtt.Net)

类本体 4.3.0 public class MQTTMain{public MqttClient mqttClient null ; public bool MQTTMainConnect(string MenZuNo, string ServerIP, int ServerPort, string UserName, string Pwd){try{string EMQX_CLIENT_ID $"称重端-{MenZuNo}-{OPCommon.PCControl.G…...

node插件MongoDB(四)—— 库mongoose 的个性话读取(字段筛选、数据排序、数据截取)(四)

文章目录 一、字段筛选二、数据排序三、数据截取1. skip 跳过2. limit 限定![在这里插入图片描述](https://img-blog.csdnimg.cn/c7067b1984ee4c6686f8bbe07cae9176.png) 一、字段筛选 字段筛选&#xff1a;只读取指定的数据&#xff0c;比如集合&#xff08;表&#xff09;中有…...

AI:73-结合语法知识的神经机器翻译研究

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…...

[LeetCode]-225. 用队列实现栈

目录 225. 用队列实现栈 题目 ​思路 代码 225. 用队列实现栈 225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/implement-stack-using-queues/description/ 题目 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff0…...

Kafka Rebanlace次数过高问题

Kafka Rebanlace次数过高问题 环境&#xff1a; Kafka Server 2.6.x Kafka Client Java 2.8.2 缘起&#xff1a; 最近发现Kafka Rebalance次数着实有点多&#xff0c;一天达到了六十多次&#xff0c;感觉不太正常&#xff0c;于是查了下日志发现&#xff1a; Offset commit c…...

计算机是如何进行工作的+进程和线程

一)计算机是如何工作的? 指令是如何执行的?CPU基本工作过程&#xff1f; 假设上面有一些指令表&#xff0c;假设CPU上面有两个寄存器A的编号是00&#xff0c;B的编号是01 1)第一个指令0010 1010&#xff0c;这个指令的意思就是说把1010地址上面的数据给他读取到A寄存器里面 2…...

MySQL(11):数据处理之增删改

插入数据 方式1&#xff1a; 一条一条的添加数据 为表的所有字段按默认顺序插入数据 INSERT INTO 表名 VALUES (value1,value2,....);# 没有指明添加的字段 INSERT INTO emp1 VALUES (1,TOM,2023-11-06,3400);没有指明添加的字段&#xff0c;要按照声明顺序&#xff0c;进行…...

QT QDockWidget

QDockWidget是Qt中的一个容器类&#xff0c;用于在主窗口上创建可停靠的子窗口。 设置停靠窗口的一般流程如下: (1)创建一个QDockWidget 对象的停靠窗体。 (2)设置此停靠窗体的属性&#xff0c;通常调用setFeatures()及setAllowedAreas()两种方法。 (3)新建一个要插入停靠窗…...

Android 12.0 开启蓝牙状态栏即显示蓝牙图标

Android 12.0 开启蓝牙状态栏即显示蓝牙图标 最近收到客户反馈想要在开启蓝牙时状态栏就能显示出蓝牙图标&#xff0c;我们系统默认是蓝牙连接上设备后状态栏才显示出蓝牙图标&#xff0c;具体修改参照如下&#xff1a; /vendor/mediatek/proprietary/packages/apps/SystemUI…...

skynet学习笔记02— skynet介绍、skynet基础API与环境变量

01、Skynet与Actor模型 在系统Skynet之前&#xff0c;先了解一下Skynet与Actor模型&#xff0c;下列是风云大佬的介绍以及一个大佬的博客 https://github.com/cloudwu/skynet/wiki/GettingStartedhttps://blog.csdn.net/qq769651718/article/details/79432793 02、Skynet基础…...

Android---App 崩溃

崩溃问题是衡量 App 质量的决定性考核标准。Android 系统会输出各种相应的 log 日志&#xff0c;很大程度上降低了工程师 debug 崩溃问题的难度。如果要给 crash 日志进行分类&#xff0c;可以分为2大类&#xff1a;JVM 异常&#xff08;Exception&#xff09;堆栈信息和 nativ…...

DocTemplateTool - 可根据模板生成word或pdf文件的工具

你是否经常遇到这样的场景&#xff1a;产品运营有着大量的报告需求&#xff0c;或者给客户领导展现每周的运营报告&#xff1f;这些文档类的任务可以交给运营同事&#xff0c;他们负责文档排版和样式&#xff0c;你作为开发人员你只需要提供数据源&#xff0c;和一个映射表&…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...