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

驱动开发、移植

一、任务明确:把创龙MX8的驱动 按照我们的要求 然后移植到 我们的板子

1.Linux系统启动卡制作,

sd卡 先按照 《用户手册—3-2-Linux系统启动卡制作及系统固化》 把创龙的Linux系统刷进去。

2. 把TLIMX8-EVM的板子过一遍

把刚刚烧好系统的sd卡插入 创龙TLIMX8-EVM的板子,
用SecureCRT调试窗口 串口或者SSH远程登陆 创龙创龙TLIMX8-EVM的板子
然后按照 《2-1-评估板测试手册》 把评估版创龙TLIMX8-EVM下面这些功能测试一遍
在这里插入图片描述

3. 把TLIMX8-EVM的板子的Liunx系统编译一遍

按照 《3-1-Linux系统使用手册》 把创龙的TLIMX8-EVM的板子配套的Liunx系统下面图这些U-Boot、Linux内核编译一遍,也就是把刚刚刷进去SD卡的Linux系统内核编译一遍。(之后可以按照自己的需求对内核进行配置和裁剪)
在这里插入图片描述

4.按照我们的需求去修改、配置内核,编译成内核镜像文件,修改设备树dts,编译生成设备树dtb文件

按照我们的需求去修改、配置内核,编译成内核镜像文件,烧录到我们自己的板子;
之后我们就把创龙的TLIMX8-EVM 板 对应的Linux系统内核,也就是上面刷的那个系统内核 根据 我们这边的需求去修改、去配置内核,然后编译出来生成Linux系统镜像文件,然后把这个镜像文件烧进SD卡—Linux系统启动卡,然后把这个卡插到我们自己做的板子,启动这个系统。

修改设备树dts文件,重新编译生成设备树dtb二进制文件,拷贝到SD卡—Linux系统启动卡的BOOT分区。
然后在虚拟机上修改设备树dts文件,重新编译生成设备树dtb二进制文件,拷贝到SD卡—Linux系统启动卡的BOOT分区。


5.之后工作的任务步骤

在虚拟机上使用 创龙的TLIMX8-EVM 板 对应的SDK(里面有文件可以编译生成对应版本的Linux系统。可以编译生成U-Boot、内核、文件系统、设备树文件)编译生成对应版本的Linux系统,烧录到SD卡—Linux系统启动卡。

1.内核配置,内核编译

首先先在虚拟机使用官方提供的SDK按照我们的需求去修改、配置内核,编译成内核镜像文件,烧录到我们自己的板子;

2.驱动适配调式过程:

将烧录好系统的sd卡插入 创龙TLIMX8-EVM的板子,板子使用SD卡里面的系统进行启动,
用SecureCRT调试窗口 串口连接或者SSH远程登陆 创龙TLIMX8-EVM的板子去测试刚刚烧录到这个Linux系统跟板子的功能模块适不适配,参考资料《2-1-评估板测试手册.pdf》
如果这个系统的某个功能模块(例如LED指示灯)在创龙TLIMX8-EVM板子上正常,说明原本的LDE指示灯驱动程序.c源文件没有问题。这时候我们就要去对应自己的板子去简单的修改LED指示灯驱动程序.c源文件,让这个驱动程序去适配我们的板子上的LED指示灯,如果.c源文件没有问题,或者不需要修改了,这时候就要去修改创龙TLIMX8-EVM板子对应的设备树文件,去修改成适配我们板子的设备树文件,然后拷贝到我们板子系统的BOOT分区(例如我们的板子使用的是SD卡—Linux系统启动卡,那我们就要插上这个卡连接到我们的PC机的虚拟机上,然后把这个设备树文件拷贝到SD卡—Linux系统的BOOT分区,然后在把这个卡拔掉,然后插到我们的板子,使用SD卡-Linux系统启动卡运行系统)。
除了LED指示灯功能模块,其他的功能模块的驱动也是类似进行开发,移植,
当自己的板子所有的功能模块的驱动都适配后,这时候就可以把SD卡-Linux系统启动卡中的系统 固化 到板子的 eMMC里面。

二、实战

1.虚拟机的账号和密码均是:Hugo

在这里插入图片描述

虚拟机开启root用户,设置了root用户密码

在这里插入图片描述

评估版的账号密码,都是root

遇到问题

共享文件夹的问题,cd 到 /mnt/hgfs/ 路径下,ls没有看到 Shared Folders 共享文件夹

系统自动挂载功能未启用,系统里面有这个共享文件夹,但是系统没有把这个文件夹自动挂载到/mnt/hgfs/下。
使用vmware-hgfsclient命令列出所有共享文件夹(在VM->setting->options->shared Folders里面设置的),可以看到所以共享文件夹都在系统中,只是没有自动挂载在 /mnt/hgfs/ 路径下。
在这里插入图片描述
我们手动挂载一下。先创建一个文件夹,然后把主机hots的共享文件夹SharedFolders 挂载到虚拟机这个文件夹 、mnt/hgfs/SharedFolders
在这里插入图片描述

1
根目录 / 是Linux文件系统的最顶层目录
是一个快捷方式,代表当前用户的主目录。这是一种方便的方式来引用主目录而不需要输入完整的路径。比如,如果用户 hugo 的家目录是 /home/hugo,那么 ~/IMX8 就相当于 /home/hugo/IMX8 。
总是指向执行命令的那个用户的家目录。
2

在这里插入图片描述
在每次打开U-Boot配置界面时,要先

export LINES=24
export COLUMNS=80

强制设定终端的高度为24行,宽度为80列。请注意,这种方法不一定总是有效,因为实际显示效果还取决于终端的实际大小。

三、BL360_X8M板驱动移植

1. 修改设备树的步骤和命令

如图所示:
在这里插入图片描述

先cd到NXP i.MX8系列处理器(IMX8)的内核(kernel)目录下的 Linux内核版本为5.4.70(Linux-5.4.70)的内核源代码、配置文件、编译结果(内核源码)路径

cd IMX8/Kernel/Linux-5.4.70/

然后在这个路径下重新编译生成二进制设备树文件:
① 先使能SDK环境变量
② 在内核源码目录 IMX8/Kernel/Linux-5.4.70/ 下编译生成二进制设备树 dtb 文件(生成的 dtb文件位于arch/arm64/boot/dts/freescale/路径下)

source /home/hugo/SDK/environment-setup-aarch64-poky-linux
make freescale/tlimx8-evm.dtb

插上SD系统启动卡连接到PC机上的虚拟机,然后把生成的二进制dtb设备树文件拷贝到SD系统启动卡(Linux系统)的BOOT分区。
在这里插入图片描述

cd /media/hugo/BOOT
cp /home/hugo/IMX8/Kernel/Linux-5.4.70/arch/arm64/boot/dts/freescale/tlimx8-evm.dtb ./

2. 系统启动

问题描述(启动系统被卡住)

BL360_X8M板插入sd系统启动卡,插上电启动的过程的时候,调试器SecureCRT显示出串口打印的信息,有pcie 。。。time out。 然后系统就一直卡在这里,进不去。

问题解决

BL360_X8M板插入sd系统启动卡,启动前要先把设备树的pcie屏蔽掉。

1.首先把sd系统启动卡拿出来,通过读卡器插到pc机上,然后挂载到虚拟机上。
2.根据《3-1-Linux系统使用手册.pdf》的 《3.4 编译设备树文件》的提示,进入这个链接去修改tlimx8-evm.dts

hugo@hugo-virtual-machine:~/IMX8/Kernel/Linux5.4.70/arch/arm64/boot/dts/freescale$ vi tlimx8-evm.dts

在这里插入图片描述
3.然后切换回内核源码安装目录下,执行如下命令使能SDK环境变量,并在内核源码目录"arch/arm/boot/dts/"路径中编译生成 dtb 文件。
在这里插入图片描述
4.把这个生成的dtb文件拷贝至Linux系统启动卡BOOT分区。
在这里插入图片描述
5.然后把系统启动卡断开链接,然后拔出来,插到BL360_X8M板上,重新启动

3.LED驱动移植

问题描述(修改LED驱动)

把创龙MX8评估板的系统移植到 自己的板子BL360_X8M,修改调试LED驱动适配我们的板子。

问题解决

① 首先,led.c的源码不用动,先根据你的原理图,看到我们自己的板子的LED1和LED2分别连接到GPIO3_23和GPIO3_34,

直接修改设备树文件tlimx8-evm.dts,找到leds节点,把GPIO的口改成我们板子的LED连接的GPIO口。
然后重新编译生成设备树,重新运行系统。

一般就这样修改,LED就会亮了,但是LED还是不亮,
解决看4.《【 遇到问题】(引脚功能被复用)》
在这里插入图片描述

4.【 遇到问题】(引脚功能被复用)

根据原理图修改成我们板子的LED的GPIO引脚号后,但是LED还是不亮

问题解决

② 然后有经验的工程师来教我,他先把led的pin_ctrl给注释掉了,说不用写也可以

在这里插入图片描述
为什么不需要配置pinctrl_gpio_led

内核自动处理:
因为在LED节点中直接指定gpios = <&gpio3 23 ...>时,
内核会自动去检查该引脚是否被其他模块占用,
如果没有冲突,自动将引脚配置为GPIO模式。

但需注意:
如果引脚被其他模块占用(如PDM),内核会拒绝配置,将不会自动将引脚配置为GPIO模式,从而导致LED失败,
此时必须手动释放冲突模块(如禁用PDM)。

③ 然后他通过NXP芯片官网提供的config tool软件找到了GPIO3_23引脚,对应AD13,找到了这个脚有其他的功能复用的可能,然后他通过这段代码在设备树上查找:MX8MM_IOMUXC_SAI5_RXD2_PDM_DATA2

在这里插入图片描述

确实在设备树找到了代码:MX8MM_IOMUXC_SAI5_RXD2_PDM_DATA2 0xd6,说明配置了这个功能,刚好这个功能占用的口跟GPIO3_IO23冲突。
在这里插入图片描述

④ 然后通过在设备树搜索 :pinctrl_pdm

在这里插入图片描述
找到了用这个功能的代码,把这个功能注释掉就行。
在这里插入图片描述

⑤ 重新编译设备树,启动系统,通过代码测试,LED灯正常亮:
  1. 可以先cd到 /sys/class/leds 路径下,然后 ls ,看看有没有 user-led0 和 user-led1 节点:
    在这里插入图片描述
  2. 通过命令测试,观察LED指示灯的亮灭:
echo 0 > /sys/class/leds/user-led0/brightness 
echo 1 > /sys/class/leds/user-led0/brightness 
echo 0 > /sys/class/leds/user-led1/brightness 
echo 1 > /sys/class/leds/user-led1/brightness 

结果如下:
在这里插入图片描述

四、驱动移植的理解

1. 一个I2C总线挂载多个从设备

一个I2C总线理论上可以挂载的设备数量取决于所使用的地址空间。
对于标准7位地址空间,I2C协议允许最多128个不同的地址(从0x00到0x7F)。
然而,实际上有几个地址是保留用于特殊用途的,比如通用调用地址和起始字节地址,所以实际可用的地址略少一些。
所以一个I2C总线最多挂载的设备是少于128个的。
所以一个I2C总线可以挂载多个设备

比如下图的设备树可以看到,
一个i2c4的接口节点,有3个compatible,分别代表连接的设备为ds1307、isl1208、ov5640_mipi,这代表i2c-4上挂载了三种不同的设备:
一个兼容dallasds1307的实时时钟(RTC)设备(地址0x68);
一个兼容isil.isl1208的RTC设备(地址0x6f) ,
以及一个兼容ovti,ov5640 mipi的摄像头模块(地址0x3c) .
只要它们的reg属性不同(也就是12C的给他们分配的唯一的i2C地址),那这些设备挂载在一个i2C总线上就不会发生冲突,i2C总线是通过挂载在I2C的设备唯一的I2C地址识别是哪个设备,从而跟对应的设备通信,所以一个I2C总线接多个设备不会冲突。

在这里插入图片描述

2.设备树配置和i2c地址挂载的联系

在这里插入图片描述
在这里插入图片描述
1.设备树中i2c1中配置了以下设备:

  • pca9450@250x25):在系统文件i2c-0中被扫描出地址0x25显示为 UU,说明驱动已加载。
  • ina220@400x40):未在系统文件i2c-0中被扫描出,但是在设备树i2c1中有配置,说明硬件没有连上i2c1总线。
  • ina220@410x41):未在系统文件i2c-0中被扫描出,但是在设备树i2c1中有配置,说明硬件没有连上i2c1总线。

2.设备树中i2c2中没有配置任何设备:
但是使用命令在系统文件i2c-1中扫描出了4个设备,说明有4个设备连接到了i2c2总线,只是没有在设备树中进行驱动配置
这4个设备连接上了I2C总线,没有和总线进行通信,可以被使用。

3.设备树中i2c3中配置了以下设备:

  • tlv320aic3106@180x18)在系统文件i2c-2中被扫描出地址0x18显示为 UU,说明驱动已加载。
  • gpio@210x21):未在系统文件i2c-2中被扫描出,但是在设备树i2c3中有配置,说明硬件没有连上i2c3总线。

4.设备树中i2c4中配置了以下设备:

  • rtc@680x68):在系统文件i2c-0中被扫描出地址0x68显示为 UU,说明驱动已加载。
  • rtc@6f0x6f):未在系统文件i2c-0中被扫描出,但是在设备树i2c1中有配置,说明硬件没有连上i2c1总线。
  • ov5640_mipi@3c0x3c):未在系统文件i2c-0中被扫描出,但是在设备树i2c1中有配置,说明硬件没有连上i2c1总线。

注意点

1.显示为UU的原因
  • UU 表示该地址已被内核驱动占用,用户空间无法直接访问。
  • 在你的设备树中,i2c4 总线上配置了 rtc@68 设备(0x68),并且其驱动已成功加载。
  • 因此,0x68 地址被内核驱动占用,显示为 UU

2. 0x6f0x3c 未显示的原因

设备树中配置了以下设备:

  • rtc@680x68):显示为 UU,驱动已加载。
  • rtc@6f0x6f):未显示。
  • ov5640_mipi@3c0x3c):未显示。

可能的原因包括:

(1)硬件未连接
  • 设备树中配置了设备,但实际硬件上并未连接到 i2c4 总线。
  • 例如:
    • 0x6f 的 RTC 设备未焊接或未连接。
    • 0x3c 的摄像头模块未连接。
(2)设备初始化失败
  • 设备已连接,但驱动初始化失败。
  • 可能的原因:
    • 设备供电异常。
    • 设备引脚配置错误(如 SDA、SCL 未正确连接)。
    • 设备驱动未正确加载。
(3)设备树配置错误
  • 设备树中配置的设备地址或兼容性字符串有误,导致驱动无法正确匹配。
  • 例如:
    • compatible 字符串错误。
    • 设备寄存器地址(reg)配置错误。
(4)设备被禁用
  • 设备树中配置了设备,但其状态为 disabled
  • 例如:
    ov5640_mipi: ov5640_mipi@3c {compatible = "ovti,ov5640_mipi";reg = <0x3c>;status = "disabled";  // 设备被禁用
    };
    

3. 排查步骤

(1)检查硬件连接
  • 确认 0x6f0x3c 设备是否实际连接到 i2c4 总线。
  • 使用万用表或示波器检查设备的电源、SDA、SCL 引脚是否正常。
(2)检查设备树配置
  • 确认设备树中 0x6f0x3c 设备的配置是否正确。
  • 例如,检查 compatible 字符串和 reg 地址:
    isl1208: rtc@6f {compatible = "isil,isl1208";  // 确认兼容性字符串正确reg = <0x6f>;                 // 确认地址正确status = "okay";              // 确认设备已启用
    };ov5640_mipi: ov5640_mipi@3c {compatible = "ovti,ov5640_mipi";  // 确认兼容性字符串正确reg = <0x3c>;                     // 确认地址正确status = "okay";                  // 确认设备已启用
    };
    
(3)检查内核日志
  • 使用 dmesg 查看内核日志,确认设备是否初始化失败:
    dmesg | grep i2c
    
  • 如果设备初始化失败,日志中会显示相关错误信息。
(4)手动探测设备
  • 使用 i2cgeti2cset 手动探测设备,确认设备是否存在。
  • 例如,探测 0x6f 设备:
    i2cget -y 3 0x6f
    
    • 如果设备存在,会返回数据。
    • 如果设备不存在,会返回错误。
(5)检查驱动加载
  • 确认设备的驱动是否已加载:
    lsmod | grep isl1208
    lsmod | grep ov5640
    
  • 如果驱动未加载,手动加载驱动:
    modprobe isl1208
    modprobe ov5640
    

4. 解决方法

(1)如果硬件未连接
  • 确认硬件设计,修复连接问题。
  • 如果设备不需要使用,可以从设备树中移除相关配置。
(2)如果设备初始化失败
  • 检查设备供电和引脚连接。
  • 检查设备树配置,确保 compatiblereg 正确。
  • 检查内核日志,修复驱动初始化问题。
(3)如果设备树配置错误
  • 修正设备树中的 compatible 字符串和 reg 地址。
  • 确保设备状态为 okay
(4)如果驱动未加载
  • 确保内核中已编译相关驱动。
  • 手动加载驱动,或修改设备树以正确匹配驱动。

5. 总结

  • 0x68 显示为 UU:设备已连接且驱动已加载。
  • 0x6f0x3c 未显示:可能是硬件未连接、设备初始化失败、设备树配置错误或驱动未加载。
  • 通过检查硬件连接、设备树配置、内核日志和驱动加载情况,可以定位并解决问题。

相关文章:

驱动开发、移植

一、任务明确&#xff1a;把创龙MX8的驱动 按照我们的要求 然后移植到 我们的板子 1.Linux系统启动卡制作&#xff0c; sd卡 先按照 《用户手册—3-2-Linux系统启动卡制作及系统固化》 把创龙的Linux系统刷进去。 2. 把TLIMX8-EVM的板子过一遍 把刚刚烧好系统的sd卡插入 创…...

BFS与Flood Fill:算法原理、实现细节与复杂度分析

目录 1. 概述 2. BFS 的基本原理 3. Flood Fill 算法 4. BFS 实现 Flood Fill 的步骤 5. C 实现 6. 代码解析 7. 复杂度分析 8. 应用场景 总结 1. 概述 Flood Fill 算法是一种用于填充封闭区域的算法&#xff0c;常用于图像处理、绘图工具和游戏开发中。BFS&#xff08…...

计算机网络基础杂谈(局域网、ip、子网掩码、网关、DNS)

目录 1. 简单局域网的构成 2. IP 地址 3. 子网掩码 4. IP地址详解自定义IP 5. IP 地址详解 6. 网关 7. DNS 域名解析 8. ping 1. 简单局域网的构成 交换机是组建局域网最重要的设备&#xff0c;换句话说&#xff0c;没有交换机就没法搭建局域网 交换机不能让局域网连…...

雷龙CS SD NAND(贴片式TF卡)测评体验

一、产品概述 近期获赠雷龙科技&#xff08;Longsto&#xff09;推出的CS系列贴片式SD NAND存储解决方案&#xff0c;包含两片工业级贴片式NAND芯片&#xff08;CSNP16GCR01-AOW&#xff09;及全兼容转接板。该方案支持TF卡形态扩展&#xff0c;实现高可靠性嵌入式存储应用。 …...

【Alertmanager】alertmanager告警系统原理剖析与应用实战,应有尽有非常全面

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…...

Java——权限修饰符

一、权限修饰符的继承访问规则 以下按访问范围从宽到窄排序&#xff1a; 修饰符同包同类同包子类同包非子类跨包子类跨包非子类public✔️✔️✔️✔️✔️protected✔️✔️✔️✔️❌默认&#xff08;包级&#xff09;✔️✔️✔️❌❌private✔️❌❌❌❌ 关键点&#xf…...

一周学会Flask3 Python Web开发-redirect重定向

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 前面我们学过渲染到模板页面&#xff0c;这个其实是一种内部的转发&#xff0c;浏览器地址栏地址没有变化。如果我们想重定向…...

python面向对象:方法

1. 实例方法 实例方法用于操作实例变量&#xff0c;必须包含 self 参数。 class Person:def __init__(self, name):self.name namedef greet(self):print(f"Hello, my name is {self.name}")person1 Person("Alice") person1.greet() # 输出&#xff…...

物联网简介集合

物联网&#xff08;IoT&#xff09;指的是物理设备&#xff08;如电器和车辆&#xff09;之间的互联互通。这些设备嵌入了软件、传感器和连接功能&#xff0c;使其能够相互连接并交换数据。这项技术实现了从庞大的设备网络中收集和共享数据&#xff0c;为打造更高效、自动化的系…...

centos下使用pyenv管理python版本

在 CentOS 上安装 pyenv 和 pyenv-virtualenv&#xff0c;可以按照以下步骤进行操作&#xff1a; ps: centos7 最高适配到3.9.* 步骤 1&#xff1a;安装依赖 首先&#xff0c;确保你的系统中安装了必需的依赖项。你可以使用以下命令安装它们&#xff1a; [root ~]# yum gro…...

C++:类与对象,定义类和构造函数

#define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> using namespace std; //如何让定义一个类 // 封装 // 1、将数据和方法定义到一起。 // 2、把想给你看的数据给你看&#xff0c;不想给你看的封装起来。 通过访问限定符来实现 class Stack { public: //1.成…...

【Java消息队列】应对消息丢失、重复、顺序与积压的全面策略

应对消息丢失、重复、顺序与积压的全面策略 引言kafka消息丢失生产者消费者重复消费顺序消费消息积压生产者消费者其他RabbitMQ消息丢失生产者事务机制,保证生产者发送消息到 RabbitMQ Server发送方确认机制,保证消息能从交换机路由到指定队列保证消息在 RabbitMQ Server 中的…...

解锁机器学习核心算法|神经网络:AI 领域的 “超级引擎”

一、神经网络&#xff1a;AI 领域的 “超级引擎” 在机器学习的庞大算法体系中&#xff0c;有十种算法被广泛认为是最具代表性和实用性的&#xff0c;它们犹如机器学习领域的 “十大神器”&#xff0c;各自发挥着独特的作用。这十大算法包括线性回归、逻辑回归、决策树、随机森…...

Android14(13)添加墨水屏手写API

软件平台&#xff1a;Android14 硬件平台&#xff1a;QCS6115 需求&#xff1a;特殊品类的产品墨水屏实现手写的功能&#xff0c;本来Android自带的Input这一套可以实现实时展示笔迹&#xff0c;但是由于墨水屏特性&#xff0c;达不到正常的彩屏刷新的帧率&#xff0c;因此使用…...

flyway的ignoreMigrationPatterns

1、概述 ignoreMigrationPatterns 是 Flyway 中的一个配置选项&#xff0c;用于指定在迁移过程中可以忽略的迁移脚本的模式。这个选项通常用于在特定情况下跳过某些迁移脚本的执行&#xff0c;例如在开发环境中跳过某些测试数据脚本&#xff0c;或者在特定条件下忽略某些已经不…...

25年2月通信基础知识补充:多普勒频移与多普勒扩展、3GPP TDL信道模型

看文献过程中不断发现有太多不懂的基础知识&#xff0c;故长期更新这类blog不断补充在这过程中学到的知识。由于这些内容与我的研究方向并不一定强相关&#xff0c;故记录不会很深入请见谅。 【通信基础知识补充7】25年2月通信基础知识补充1 一、多普勒频移与多普勒扩展傻傻分不…...

华为动态路由-OSPF-骨干区

华为动态路由-OSPF-骨干区 一、OSPF简介 1、OSPF概述 OSPF是一种开放式的、基于链路状态的内部网关协议&#xff08;IGP&#xff09;&#xff0c;用于在自治系统内部进行路由选择和通信。 OSPF是互联网工程任务组&#xff08;IETF&#xff09;定义的标准之一&#xff0c;被广…...

接口测试-API测试中常用的协议(中)

一、SOAP SOAP&#xff08;Simple Object Access Protocol&#xff09;即简单对象访问协议&#xff0c;是一种基于 XML 的用于在网络中交换结构化信息的协议&#xff0c;常用于 Web 服务之间的通信。以下为你详细介绍&#xff1a; 产生背景 在互联网发展过程中&#xff0c;需…...

植物大战僵尸杂交版v3.2.1最新版本(附下载链接)

B站游戏作者潜艇伟伟迷于12月21日更新了植物大战僵尸杂交版3.2.1版本&#xff01;&#xff01;&#xff01;&#xff0c;有b站账户的记得要给作者三连关注一下呀&#xff01; 不多废话下载链接放上&#xff1a; 夸克网盘链接&#xff1a;&#xff1a;https://pan.quark.cn/s/e5…...

java每日精进 2.20 MQ相关复健

在 RabbitMQ 中&#xff0c;消息消费者对消息的签收&#xff08;acknowledgment&#xff09;可以通过三种方式进行管理&#xff1a;自动签收、手动签收 和 拒绝签收。它们主要控制消费者如何处理消息确认和消息的重新排队。下面详细讲解它们的区别&#xff0c;并通过代码示例展…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

PHP和Node.js哪个更爽?

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

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...