驱动开发、移植
一、任务明确:把创龙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灯正常亮:
- 可以先cd到
/sys/class/leds路径下,然后ls,看看有没有user-led0 和 user-led1节点:

- 通过命令测试,观察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@25(0x25):在系统文件i2c-0中被扫描出地址0x25显示为UU,说明驱动已加载。ina220@40(0x40):未在系统文件i2c-0中被扫描出,但是在设备树i2c1中有配置,说明硬件没有连上i2c1总线。ina220@41(0x41):未在系统文件i2c-0中被扫描出,但是在设备树i2c1中有配置,说明硬件没有连上i2c1总线。
2.设备树中i2c2中没有配置任何设备:
但是使用命令在系统文件i2c-1中扫描出了4个设备,说明有4个设备连接到了i2c2总线,只是没有在设备树中进行驱动配置
这4个设备连接上了I2C总线,没有和总线进行通信,可以被使用。
3.设备树中i2c3中配置了以下设备:
tlv320aic3106@18(0x18)在系统文件i2c-2中被扫描出地址0x18显示为UU,说明驱动已加载。gpio@21(0x21):未在系统文件i2c-2中被扫描出,但是在设备树i2c3中有配置,说明硬件没有连上i2c3总线。
4.设备树中i2c4中配置了以下设备:
rtc@68(0x68):在系统文件i2c-0中被扫描出地址0x68显示为UU,说明驱动已加载。rtc@6f(0x6f):未在系统文件i2c-0中被扫描出,但是在设备树i2c1中有配置,说明硬件没有连上i2c1总线。ov5640_mipi@3c(0x3c):未在系统文件i2c-0中被扫描出,但是在设备树i2c1中有配置,说明硬件没有连上i2c1总线。
注意点
1.显示为UU的原因
UU表示该地址已被内核驱动占用,用户空间无法直接访问。- 在你的设备树中,
i2c4总线上配置了rtc@68设备(0x68),并且其驱动已成功加载。 - 因此,
0x68地址被内核驱动占用,显示为UU。
2. 0x6f 和 0x3c 未显示的原因
设备树中配置了以下设备:
rtc@68(0x68):显示为UU,驱动已加载。rtc@6f(0x6f):未显示。ov5640_mipi@3c(0x3c):未显示。
可能的原因包括:
(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)检查硬件连接
- 确认
0x6f和0x3c设备是否实际连接到i2c4总线。 - 使用万用表或示波器检查设备的电源、SDA、SCL 引脚是否正常。
(2)检查设备树配置
- 确认设备树中
0x6f和0x3c设备的配置是否正确。 - 例如,检查
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)手动探测设备
- 使用
i2cget或i2cset手动探测设备,确认设备是否存在。 - 例如,探测
0x6f设备:i2cget -y 3 0x6f- 如果设备存在,会返回数据。
- 如果设备不存在,会返回错误。
(5)检查驱动加载
- 确认设备的驱动是否已加载:
lsmod | grep isl1208 lsmod | grep ov5640 - 如果驱动未加载,手动加载驱动:
modprobe isl1208 modprobe ov5640
4. 解决方法
(1)如果硬件未连接
- 确认硬件设计,修复连接问题。
- 如果设备不需要使用,可以从设备树中移除相关配置。
(2)如果设备初始化失败
- 检查设备供电和引脚连接。
- 检查设备树配置,确保
compatible和reg正确。 - 检查内核日志,修复驱动初始化问题。
(3)如果设备树配置错误
- 修正设备树中的
compatible字符串和reg地址。 - 确保设备状态为
okay。
(4)如果驱动未加载
- 确保内核中已编译相关驱动。
- 手动加载驱动,或修改设备树以正确匹配驱动。
5. 总结
0x68显示为UU:设备已连接且驱动已加载。0x6f和0x3c未显示:可能是硬件未连接、设备初始化失败、设备树配置错误或驱动未加载。- 通过检查硬件连接、设备树配置、内核日志和驱动加载情况,可以定位并解决问题。
相关文章:
驱动开发、移植
一、任务明确:把创龙MX8的驱动 按照我们的要求 然后移植到 我们的板子 1.Linux系统启动卡制作, 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 算法是一种用于填充封闭区域的算法,常用于图像处理、绘图工具和游戏开发中。BFS(…...
计算机网络基础杂谈(局域网、ip、子网掩码、网关、DNS)
目录 1. 简单局域网的构成 2. IP 地址 3. 子网掩码 4. IP地址详解自定义IP 5. IP 地址详解 6. 网关 7. DNS 域名解析 8. ping 1. 简单局域网的构成 交换机是组建局域网最重要的设备,换句话说,没有交换机就没法搭建局域网 交换机不能让局域网连…...
雷龙CS SD NAND(贴片式TF卡)测评体验
一、产品概述 近期获赠雷龙科技(Longsto)推出的CS系列贴片式SD NAND存储解决方案,包含两片工业级贴片式NAND芯片(CSNP16GCR01-AOW)及全兼容转接板。该方案支持TF卡形态扩展,实现高可靠性嵌入式存储应用。 …...
【Alertmanager】alertmanager告警系统原理剖析与应用实战,应有尽有非常全面
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…...
Java——权限修饰符
一、权限修饰符的继承访问规则 以下按访问范围从宽到窄排序: 修饰符同包同类同包子类同包非子类跨包子类跨包非子类public✔️✔️✔️✔️✔️protected✔️✔️✔️✔️❌默认(包级)✔️✔️✔️❌❌private✔️❌❌❌❌ 关键点…...
一周学会Flask3 Python Web开发-redirect重定向
锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 前面我们学过渲染到模板页面,这个其实是一种内部的转发,浏览器地址栏地址没有变化。如果我们想重定向…...
python面向对象:方法
1. 实例方法 实例方法用于操作实例变量,必须包含 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() # 输出ÿ…...
物联网简介集合
物联网(IoT)指的是物理设备(如电器和车辆)之间的互联互通。这些设备嵌入了软件、传感器和连接功能,使其能够相互连接并交换数据。这项技术实现了从庞大的设备网络中收集和共享数据,为打造更高效、自动化的系…...
centos下使用pyenv管理python版本
在 CentOS 上安装 pyenv 和 pyenv-virtualenv,可以按照以下步骤进行操作: ps: centos7 最高适配到3.9.* 步骤 1:安装依赖 首先,确保你的系统中安装了必需的依赖项。你可以使用以下命令安装它们: [root ~]# yum gro…...
C++:类与对象,定义类和构造函数
#define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> using namespace std; //如何让定义一个类 // 封装 // 1、将数据和方法定义到一起。 // 2、把想给你看的数据给你看,不想给你看的封装起来。 通过访问限定符来实现 class Stack { public: //1.成…...
【Java消息队列】应对消息丢失、重复、顺序与积压的全面策略
应对消息丢失、重复、顺序与积压的全面策略 引言kafka消息丢失生产者消费者重复消费顺序消费消息积压生产者消费者其他RabbitMQ消息丢失生产者事务机制,保证生产者发送消息到 RabbitMQ Server发送方确认机制,保证消息能从交换机路由到指定队列保证消息在 RabbitMQ Server 中的…...
解锁机器学习核心算法|神经网络:AI 领域的 “超级引擎”
一、神经网络:AI 领域的 “超级引擎” 在机器学习的庞大算法体系中,有十种算法被广泛认为是最具代表性和实用性的,它们犹如机器学习领域的 “十大神器”,各自发挥着独特的作用。这十大算法包括线性回归、逻辑回归、决策树、随机森…...
Android14(13)添加墨水屏手写API
软件平台:Android14 硬件平台:QCS6115 需求:特殊品类的产品墨水屏实现手写的功能,本来Android自带的Input这一套可以实现实时展示笔迹,但是由于墨水屏特性,达不到正常的彩屏刷新的帧率,因此使用…...
flyway的ignoreMigrationPatterns
1、概述 ignoreMigrationPatterns 是 Flyway 中的一个配置选项,用于指定在迁移过程中可以忽略的迁移脚本的模式。这个选项通常用于在特定情况下跳过某些迁移脚本的执行,例如在开发环境中跳过某些测试数据脚本,或者在特定条件下忽略某些已经不…...
25年2月通信基础知识补充:多普勒频移与多普勒扩展、3GPP TDL信道模型
看文献过程中不断发现有太多不懂的基础知识,故长期更新这类blog不断补充在这过程中学到的知识。由于这些内容与我的研究方向并不一定强相关,故记录不会很深入请见谅。 【通信基础知识补充7】25年2月通信基础知识补充1 一、多普勒频移与多普勒扩展傻傻分不…...
华为动态路由-OSPF-骨干区
华为动态路由-OSPF-骨干区 一、OSPF简介 1、OSPF概述 OSPF是一种开放式的、基于链路状态的内部网关协议(IGP),用于在自治系统内部进行路由选择和通信。 OSPF是互联网工程任务组(IETF)定义的标准之一,被广…...
接口测试-API测试中常用的协议(中)
一、SOAP SOAP(Simple Object Access Protocol)即简单对象访问协议,是一种基于 XML 的用于在网络中交换结构化信息的协议,常用于 Web 服务之间的通信。以下为你详细介绍: 产生背景 在互联网发展过程中,需…...
植物大战僵尸杂交版v3.2.1最新版本(附下载链接)
B站游戏作者潜艇伟伟迷于12月21日更新了植物大战僵尸杂交版3.2.1版本!!!,有b站账户的记得要给作者三连关注一下呀! 不多废话下载链接放上: 夸克网盘链接::https://pan.quark.cn/s/e5…...
java每日精进 2.20 MQ相关复健
在 RabbitMQ 中,消息消费者对消息的签收(acknowledgment)可以通过三种方式进行管理:自动签收、手动签收 和 拒绝签收。它们主要控制消费者如何处理消息确认和消息的重新排队。下面详细讲解它们的区别,并通过代码示例展…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
