驱动程序开发:FTP服务器和OpenSSH的移植与搭建、以及一些笔记

news2024/12/27 18:09:28

目录

  • 一、FTP服务器移植与搭建
    • 1、在ubuntu下安装vsftpd
    • 2、在window下安装FileZilla
    • 3、移植vsftpd到开发板上
    • 4、Filezilla 连接测试
    • 5、`注意点`
  • 二、开发板 OpenSSH 移植与使用
    • 1、移植 zlib 库
    • 2、移植 openssl 库
    • 3、移植 openssh 库
    • 4、openssh 使用测试
  • 三、关于u-boot上的操作及根文件系统下的脚本文件知识点
    • 1、bdinfo - 查看开发板的相关信息
    • 2、pri – 查看环境变量
    • 3、version – 查看uboot版本信息
    • 4、setenv name xxx; saveenv – 设置环境变量,并保存
    • 5、dhcp 用于从路由器获取 IP 地址
    • 6、uboot中的nfs命令格式如下所示:
    • 7、uboot中的tftp命令格式如下所示:
    • 8、查看当前开发板一共有几个 MMC 设备
    • 9、切换当前 MMC 设备
    • 10、查看 EMMC 的分区情况
    • 11、mmc write 命令烧写数据到SD设备或者EMMC中
    • 12、查询指定 MMC 设备分区的文件系统信息
    • 13、查询 FAT 格式设备的目录和文件信息
    • 14、查看 MMC 设备某个分区的文件系统格式
    • 16、fatwrite 命令
    • 17、通过tftp方式下载Linux镜像和设备树,然后通过bootz启动Linux系统
    • 18、使用命令 fatload 将 zImage 和 imx6ull-14x14-emmc-7-1024x600-c.dtb 从EMMC 的分区 1 中拷贝到 DRAM 中,启动 Linux 系统
    • 19、bootm命令
    • 20、 环境变量 bootargs
    • 21、USB WIFI启动
    • 22、开发板Linux启动方式
    • 23、关于根文件系统中/etc/init.d/rcS、 /etc/fstab、 /etc/inittab文件的知识点

一、FTP服务器移植与搭建

  将 ALPHA 开发板作为一个小型的 FTP 服务器,这样我们就可以通过 FileZilla 软件直接在开发板和 windows 之间通过网络进行文件互传。而在开发板上搭建 FTP 服务器很简单,就是 vsftpd 的移植。

1、在ubuntu下安装vsftpd

在这里插入图片描述

2、在window下安装FileZilla

  FileZilla官网下载,下载地址如下:点击链接。步骤省略。

3、移植vsftpd到开发板上

  现在需要在自己制作的根文件系统中安装 vsftpd,所以就需要我们自己移植 vsfpd。首先需要到 vsftpd 官网下载 vsftpd 源码,网址为:点击链接。

移植步骤及注意点:
  将 vsftpd-3.0.3.tar.gz 发送到 ubuntu 中,然后使用如下命令进行解压:

tar -vxzf vsftpd-3.0.3.tar.gz //解压缩

  解压缩完成以后会得到一个名为“vsftpd-3.0.3”的文件夹,然后进入此文件夹内。
  打开 Makefile,我们需要配置一下,修改 Makefile 中的 CC 变量为我们所使用的交叉编译器:

CC = arm-linux-gnueabihf-gcc //CC 为交叉编译器

  Makefile 修改完成以后就可以编译:

make //编译 vsftpd

  等待编译完成,会得到两个文件: vsftpd 和 vsftpd.conf,我们需要这两个文件。将 vsftpd 拷贝到开发板根文件系统下的/usr/sbin 目录下,将 vsftpd.conf 拷贝到开发板根文件系统的/etc 目录下。
  拷贝完成以后给予 vsftpd 可执行权限,并且修改 vsfptd.conf 所属用户为 root,命令如下:

chmod +x /usr/sbin/vsftpd
chown root:root /etc/vsftpd.conf

  修改vsftpd配置 ,允许本地用户注册和允许任何FTP写命令,操作如下:
在这里插入图片描述
  如果第一次添加用户的话要先将 ubuntu 下的/etc/passwd 和/etc/group 这两个文件复制到开发板根文件系统的对应目录,命令如下:

sudo cp /etc/passwd /home/djw/linux/nfs/rootfs/etc/ -f
sudo cp /etc/group /home/djw/linux/nfs/rootfs/etc/ -f

  然后修改开发板根文件系统中的/etc/passwd 和/etc/group 这两个文件,只保留“root”这一项。 passwd 文件“root”行最后改为“/bin/sh”, 修改后的 passwd 和 group 文件内容如下图所示:
在这里插入图片描述
  vsftpd 默认需要两个用户,这两个用户名分别为:“ftp”和“nobody”。在创建这两个用户之前先检查一下下面几个文件和目录是否存在,如果不存在的话需要先创建下面这些文件和目录:

/home //目录,不存在的话自行创建
/usr/share/empty //目录,不存在的话自行创建
/var/log //目录,不存在的话自行创建
/var/log/vsftpd.log //文件,不存在的话自行创建

  创建命令如下:

mkdir /home
mkdir /usr/share/empty -p
mkdir /var/log -p
touch /var/log/vsftpd.log

  准备好以后就可以使用“adduser”命令创建“ftp”和“nobody”这两个用户,命令如下:(密码自定义即可)

adduser ftp //创建 ftp 用户
adduser nobody //创建 nobody 用户

  最后还需要创建一个登录用户, Filezilla 连接 FTP 服务器的时候一般需要输入用户名和密码,当然了, Filezilla 也支持匿名登录。使用用户名加密码登录的话就要创建一个用户,用户名自己定义,这里我创建一个名为“djw”的用户,命令如下:

adduser djw//创建登录要用户

  最终会在/home 目录下存在三个用户目录,分别对应“ftp”、“nobody”和“djw”,如下图所示
在这里插入图片描述

4、Filezilla 连接测试

  测试之前确保直接开发板网络连接正常,电脑可以 ping 通开发板!
  输入如下命令,启动 vsftpd 服务器:

vsftpd & //启动 vsftpd
这里也可以将”vsftpd &“指令添加到/etc/init.d/rsC文件下,让开发板开机自启动。

  vsftpd 启动以后就可以使用 filezilla 进行连接测试了,新建站点,站点设置如下图所示:
在这里插入图片描述
  设置好以后就可以连接了,连接成功以后如下图所示:文件拖拉即可传输文件
在这里插入图片描述

5、注意点

  如果使用FileZilla软件连接开发板时出现了500 OOPS: cannot change directory:/home/*******这样的错误信息,如下图所示:
在这里插入图片描述
  其实就是/home/djw这个目录权限不够,那我们可不可以将该目录直接”chmod 777 /home/djw“呢? 经过验证是不行的。因此我们需要在vsftpd.conf配置文件添加以下内容,如下图所示:
在这里插入图片描述

二、开发板 OpenSSH 移植与使用

在这里插入图片描述
  openssh库依赖于zlib 库 和 openssl 库。

1、移植 zlib 库

  zlib 源码下载地址为:点击链接,拷贝到 ubuntu 中并解压,命令如下:

tar -vxzf zlib-1.2.11.tar.gz //解压

  解压完成以后得到一个名为“zlib-1.2.11”的 zlib 源码文件。另外新建一个名为“zlib”的文件夹来保存 zlib 的编译结果。进入 zlib 源码目录,然后配置并编译,命令如下:

cd zlib-1.2.11/ //进去 zlib 源码
CC=arm-linux-gnueabihf-gcc LD=arm-linux-gnueabihf-ld AD=arm-linux-gnueabihfas ./configure --prefix=/home/djw/linux/IMX6ULL/tool/zlib //配置
make //编译
make install

  编译、安装完成以后的 zlib 目录内容如下图所示:
在这里插入图片描述
  将上图中的 lib 目录下的 zlib 库文件拷贝到开发板根文件系统的/lib 目录下,命令为:

sudo cp lib/* /home/djw/linux/nfs/rootfs/lib/ -rfa

2、移植 openssl 库

  openssl 源码下载地址为:点击链接
  将 openssl 源码压缩包拷贝到 Ubuntu 中前面创建的 tool 目录下,然后使用如下命令将其解压:

tar -vxzf openssl-1.1.1d.tar.gz

  解压完成以后就会生成一个名为 openssl-1.1.1d 的目录,然后在新建一个名为“openssl”的文件夹,用于存放 openssl 的编译结果。进入到解压出来的 openssl-1.1.1d 目录中,然后执行如下命令进行配置:

./Configure linux-armv4 shared no-asm --prefix=/home/djw/linux/IMX6ULL/tool/openssl CROSS_COMPILE=arm-linux-gnueabihf-

  上述配置中“ linux-armv4”表示 32 位 ARM 凭条,并没有“ linux-armv7”这个选项。CROSS_COMPILE 用于指定交叉编译器。配置成功以后会生成 Makefile,输入如下命令进行编译:

make
make install

  编译安装完成以后的 openssl 目录内容如下图所示:
在这里插入图片描述
  将图 上图中的 lib 目录是我们需要的,将 lib 目录下的 libcrypto 和 libssl 库拷贝到开发板根文件系统中的/usr/lib 目录下,命令如下:

sudo cp libcrypto.so* /home/djw/linux/nfs/rootfs/lib/ -af
sudo cp libssl.so* /home/djw/linux/nfs/rootfs/lib/ -af

3、移植 openssh 库

  openssh 源码下载地址为:点击链接,如下图所示:
在这里插入图片描述
  先解压 openssh 源码,命令如下:

tar -vxzf openssh-8.2.tar.gz

  解压完成以后就会生成一个名为“openssh-8.2”的文件夹,进入此文件夹里面,然后配置并编译 openssh,命令如下:

cd openssh-8.2/
./configure --host=arm-linux-gnueabihf --with-libs --with-zlib=/home/djw/linux/IMX6ULL/tool/zlib --with-ssl-dir=/home/djw/linux/IMX6ULL/tool/openssl --disable-etcdefault-login CC=arm-linux-gnueabihf-gcc AR=arm-linux-gnueabihf-ar //配置
make //编译

  在配置 openssh 的过程中,“–with-zlib”参数用于指定 zlib 库所在的目录,“–with-ssl-dir”参数用于指定 openssl 库所在的目录,编译 openssh 的时候不用“make install”。

  openssh 交叉编译完成以后在开发板中创建如下所示目录(如果存在的话就不需要创建):

/usr/local/bin
/usr/local/sbin
/usr/local/libexec
/usr/local/etc
/var/run
/var/empty

  创建命令如下:

mkdir /usr/local/bin -p
mkdir /usr/local/sbin -p
mkdir /usr/local/libexec/ -p
mkdir /usr/local/etc -p
mkdir /var/run -p
mkdir /var/empty/ -p

  上述目录创建好以后将如下文件拷贝到开发板的/usr/local/bin 目录下:
scp、sftp、ssh、ssh-add、ssh-agent、ssh-keygen、ssh-keyscan
  将如下文件拷贝到开发板的/usr/local/sbin 目录下:
sshd
  将如下文件拷贝到开发板的/usr/local/etc 目录下:
moduli、ssh_config、sshd_config
  将如下文件拷贝到开发板的/usr/local/libexec 目录下:
sftp-server、ssh-keysign
  创建软连接,进入开发板中的/bin 目录下,输入如下命令创建软连接:

cd /bin/
ln -s /usr/local/bin/scp
ln -s /usr/local/bin/sftp
ln -s /usr/local/bin/ssh
ln -s /usr/local/bin/ssh-add
ln -s /usr/local/bin/ssh-agent
ln -s /usr/local/bin/ssh-keygen
ln -s /usr/local/bin/ssh-keyscan

  再进入开发板的/sbin 目录下,输入如下命令创建软连接:

cd /sbin/
ln -s /usr/local/sbin/sshd

  软连接创建完成以后就可以直接调用上面 ssh 相关命令了。
  打开/usr/local/etc/sshd_config 文件,找到“#PermitRootLogin”所在行,将其改为“PermitRootLogin yes”。

  当所需的文件都存在以后就可以使用 adduser 创建名为“sshd”的用户了,创建 sshd 用户的时候需要设置密码,大家一定要记得这个密码,这里我设置简单一点,为“123456”,创建过程如下图所示:
在这里插入图片描述
  一切准备好以后我们还需要在开发板中生成秘钥文件,使用我们上面移植 openssh 所编译出来的 ssh-keygen 软件即可。进入到开发板的/usr/local/etc 目录下,输入如下所示命令生成秘钥文件,由于 6ULL 性能比较差,有些秘钥文件生成过程可以会有点耗时,打开几十秒:

ssh-keygen -t rsa -f ssh_host_rsa_key -N “”
ssh-keygen -t dsa -f ssh_host_dsa_key -N “”
ssh-keygen -t ecdsa -f ssh_host_ecdsa_key -N “”
ssh-keygen -t ed25519 -f ssh_host_ed25519_key -N “”

完成以后就会在/usr/local/etc 目录下产生 8 个以“ssh_host_”开头的秘钥文件,如下图所示:
在这里插入图片描述

4、openssh 使用测试

  openssh 移植已经移植到了开发板中,我们可以通过 sshd 软件在开发板上搭建 openssh 服务器,然后在其他的主机上通过 ssh 来登录开发板。我们可以同样使用 scp 命令来向开发板传输文件。首先要在开发板上启动 ssh 服务, sshd 软件用于启动 ssh 服务,注意要输入全路径!输入如下命令:

/sbin/sshd //启动 sshd 服务
也可以在/etc/init.d/rcS 文件中加入以上命令,实现 ssh 服务开机自启动。

  使用XobaXterm软件的SSH工具远程登陆开发板,如下图所示:
在这里插入图片描述
在这里插入图片描述
  也可以在 ubuntu 下通过 ssh 命令登录开发板,如下图所示:
在这里插入图片描述
  使用scp 命令拷贝文件,例如把ubuntu中的文件发送给开发板中,如下图所示:
在这里插入图片描述
  上图出现无效连接,这是因为/dev/null文件拒绝访问了,我们先看看开发板根文件系统下的/dev/null文件的信息,如下图所示:
在这里插入图片描述
  由上图可知,/dev/null文件只有文件所以者和用户组拥有读和写的权限,其他用户是没有权限的,因此导致ubuntu这边是没有权限操作的,所以我们需要给/dev/null文件增加其他用户的读写权限,因为每次系统重新启动,该文件权限会恢复默认的,所以我们需要在系统启动后给它赋予其他用户的读写权限,操作是:在/etc/init.d/rcS脚本文件中添加"chmod 666 /dev/null"即可。
  那么再次重新传输文件,如下图所示:
在这里插入图片描述
在这里插入图片描述
  已经文件传输成功了。

三、关于u-boot上的操作及根文件系统下的脚本文件知识点

简介:
Linux 系统要启动就必须需要一个 bootloader 程序,也就说芯片上电以后先运行一段bootloader 程序。这段bootloader程序会先初始化DDR等外设,然后将Linux内核从flash(NAND,NOR FLASH, SD, MMC 等)拷贝到 DDR 中,最后启动 Linux 内核。当然了,bootloader 的实际工作要复杂的多,但是它最主要的工作就是启动 Linux 内核, bootloader 和 Linux 内核的关系就跟 PC 上的 BIOS 和 Windows 的关系一样, bootloader 就相当于 BIOS。
Linux开发板中,EMMC是有3个分区的,第0个分区存放uboot;第1个分区存放Linux镜像文件和设备树文件;第2个分区存放根文件系统。

命令使用:

1、bdinfo - 查看开发板的相关信息

在这里插入图片描述

2、pri – 查看环境变量

在这里插入图片描述

3、version – 查看uboot版本信息

在这里插入图片描述

4、setenv name xxx; saveenv – 设置环境变量,并保存

  例如设置uboot倒计时设置为5秒,如下图所示:
在这里插入图片描述

5、dhcp 用于从路由器获取 IP 地址

  前提得开发板连接到路由器上的,如果开发板是和电脑直连的,那么 dhcp 命令就会失效。直接输入 dhcp 命令即可通过路由器获取到 IP 地址,如下图所示:
在这里插入图片描述

6、uboot中的nfs命令格式如下所示:

nfs [loadAddress] [[hostIPaddr:]bootfilename]

  使用 nfs 命令来将 zImage 下载到开发板 DRAM 的 0X80800000 地址处,命令如下:
在这里插入图片描述

7、uboot中的tftp命令格式如下所示:

tftpboot [loadAddress] [[hostIPaddr:]bootfilename]

  将 Ubuntu中的tftpboot 文件夹里面的 zImage 文件下载到开发板 DRAM 的 0X80800000 地址处,命令如下:
在这里插入图片描述

8、查看当前开发板一共有几个 MMC 设备

在这里插入图片描述

9、切换当前 MMC 设备

在这里插入图片描述

10、查看 EMMC 的分区情况

在这里插入图片描述

11、mmc write 命令烧写数据到SD设备或者EMMC中

在这里插入图片描述
在这里插入图片描述

12、查询指定 MMC 设备分区的文件系统信息

在这里插入图片描述

13、查询 FAT 格式设备的目录和文件信息

在这里插入图片描述

14、查看 MMC 设备某个分区的文件系统格式

在这里插入图片描述
15、 用于将指定的文件读取到 DRAM 中
在这里插入图片描述

16、fatwrite 命令

在这里插入图片描述

17、通过tftp方式下载Linux镜像和设备树,然后通过bootz启动Linux系统

在这里插入图片描述

18、使用命令 fatload 将 zImage 和 imx6ull-14x14-emmc-7-1024x600-c.dtb 从EMMC 的分区 1 中拷贝到 DRAM 中,启动 Linux 系统

在这里插入图片描述

19、bootm命令

在这里插入图片描述

20、 环境变量 bootargs

在这里插入图片描述

21、USB WIFI启动

modprobe 8188eu.ko //加载 RTL8188 驱动模块
ifconfig wlan0 up //打开 wlan0 网卡
iwlist wlan0 scan //搜索当前环境下的所有 WIFI 热点
//使用 wpa_supplicant 工具让 RTL8188 USB WIFI 连接到热点上。
wpa_supplicant -D wext -c /etc/wpa_supplicant.conf -i wlan0 &
udhcpc -i wlan0 //从路由器获取 IP 地址
ping -I 192.168.43.26 www.baidu.com //ping百度

22、开发板Linux启动方式

uboot 启动Linux内核和设备树,根文件系统的加载在emmc内部/dev/nfs 设置:
setenv ipaddr 192.168.1.119 //开发板IP地址
setenv ethaddr b8:ae:1d:01:00:00 //开发板的 MAC 地址
setenv gatewayip 192.168.1.1 //开发板网关
setenv netmask 255.255.255.0 //子网掩码
setenv serverip 192.168.1.111 //服务器IP地址,例如ubuntu的
setenv dnsip 114.114.114.114 //设置DNS域名
setenv bootdelay 5 //设置boot启动延时5秒
使用nfs远程挂载根文件系统到开发板上:
setenv bootargs ‘console=tty1 console=ttymxc0,115200 rw root=/dev/nfs nfsroot=192.168.1.111:/home/djw/linux/nfs/rootfs ip=192.168.1.119:192.168.1.111:192.168.1.1:255.255.255.0::eth0:off’
使用tftp下载linux内核、设备树到开发板DRAM中,再启动
setenv bootcmd ‘tftp 80800000 zImage;tftp 83000000 imx6ull-alientek-emmc.dtb;bootz 80800000 - 83000000;’
saveenv //保存环境变量

在emmc启动的,根文件系统的加载在emmc内部/dev/mmcblk1p2
setenv bootcmd ‘mmc dev 1; fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-14x14-evk.dtb;bootz 80800000 - 83000000;’
根文件系统在EMMC启动
setenv bootargs ‘console=tty1 console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw ip=192.168.1.119:192.168.1.111:192.168.1.1:255.255.255.0::eth0:off’

23、关于根文件系统中/etc/init.d/rcS、 /etc/fstab、 /etc/inittab文件的知识点

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

数据表(二) - 数据表的制作方式

本篇来介绍下数据表的几种制作数据的方式。Excel是大部分数值策划选择用的填数工具,因为Excel是天生为数据处理而生,而Excel转为什么格式就需要选择了。最简单的就是直接将Excel里的数据复制黏贴到文本文件作为游戏数据。这种简单快捷的方式任何人都能做…

DatenLord前沿技术分享 No.20

达坦科技专注于打造新一代开源跨云存储平台DatenLord,致力于解决多云架构、多数据中心场景下异构存储、数据统一管理需求等问题,以满足不同行业客户对海量数据跨云、跨数据中心高性能访问的需求。喷泉码具有极高的纠错能力,且具有低延迟、地复…

CnOpenData·A股上市企业数字化转型指数数据

一、数据简介 企业数字化转型是近年来中国社会各界重点关注的领域,但基础数据的不完善在很大程度上制约了相关科学研究的开展。构建合理、科学的数字化转型指标体系有利于学者定量地研究企业数字化的相关问题,也有利于衡量企业的数字化水平。广东金融学院…

Linux驱动开发

一、驱动分类Linux中包含三大类驱动:字符设备驱动、块设备驱动和网络设备驱动。其中字符设备驱动是最大的一类驱动,因为字符设备最多,从led到I2C、SPI、音频等都属于字符设备驱动。块设备驱动和网络设备驱动都要比字符设备驱动复杂。因为其比…

标度不变性(scale invariance)与无标度(scale-free)概念辨析

文章目录标度标度种类名义标度序级标度等距标度比率标度常用标度方法不足标度不变性标度不变(Scale-invariant)曲线和自相似性(self-similarity)射影几何分形随机过程中的标度不变性标度不变的 Tweedie distribution普适性&#x…

蓝牙及其安全技术概述

作者 | 陆杰 上海控安可信软件创新研究院研发工程师 来源 | 鉴源实验室 01 背 景 汽车已成为现代社会生活不可或缺的一部分。车辆蓝牙[1]安全非常重要,因为未经保护的蓝牙连接可能会被黑客利用来获取车辆的敏感信息、控制车辆等,从而对车辆的安全和车主…

12N65-ASEMI高压MOS管12N65

编辑-Z 12N65在TO-220封装里的静态漏极源导通电阻(RDS(ON))为0.68Ω,是一款N沟道高压MOS管。12N65的最大脉冲正向电流ISM为48A,零栅极电压漏极电流(IDSS)为10uA,其工作时耐温度范围为-55~150摄氏度。12N65功耗&#x…

【项目精选】基于Java的愤怒的小鸟游戏的设计与实现(视频+论文+源码)

点击下载源码 基本功能包括:新游戏、载入游戏、控制帮助、退出游戏等。本系统结构如下: (1)新游戏: 需要输入你的昵称; 选择难度:容易、中等、困难、噩梦(每个级别都有5个关卡) (2&…

【Fabric 超级账本学习【3】Fabric2.4 使用Tape进行吞吐量量性能测试】

如果想测试一下超级账本fabric对某个合约函数的执行时间是多少,简单地可以通过打印合约函数开始执行时间和结束执行时间来计算时间差就可以了。 Tape 是一款轻量级 Hyperledger Fabric 性能测试工具。 tape的github地址:https://github.com/Hyperledge…

Spark的基本概念与架构

一、Spark简介 Spark 是一种与 Hadoop 相似的开源集群计算环境,但是两者之间还存在一些不同之处,这些有用的不同之处使 Spark 在某些工作负载方面表现得更加优越,换句话说,Spark 启用了内存分布数据集,除了能够提供交…

(二十五)操作系统--读者·写者问题

文章目录一、问题描述二、问题分析1.关系分析2.整理思路3.设置信号量4.注意三、代码实现1.代码2.改进代码四、总结一、问题描述 有读者和写者两组并发进程,共享一个文件,当两个或两个以上的读进程同时访问共享数据时不…

战斗力最强排行榜:10-30人团队任务管理工具

工欲善其事,必先利其器。在高效的任务执行过程中,选择灵活轻便的项目管理工具来提升工作效率、适应快速多变的发展诉求,对团队来说,至关重要。但是如果团队不大,企业对这块的预算又有限,大型的团队任务管理…

abc 联合索引查 bc索引到底走不走索引?

今天面试的时候,面试官有问到这个问题我说不会,可是面试官说走,网上也众说纷纭,那到底会不会走呢? 先看官网解释不会走: https://dev.mysql.com/doc/refman/8.0/en/multiple-column-indexes.html SELECT *…

响应式操作实战案例

Project Reactor 框架 在Spring Boot 项目 Maven 中添加依赖管理。 <dependency><groupId>io.projectreactor</groupId><artifactId>reactor-core</artifactId> </dependency><dependency><groupId>io.projectreactor</g…

AT32F437制作Bootloader然后实现Http OTA升级

首先创建一个AT32F437的工程&#xff0c;然后发现调试工程配置这里的型号和创建工程选的型号不一致&#xff0c;手动更改一下&#xff0c;使用PW Link下载程序的话还要配置一下pyocd.exe的路径。 打开drv_clk.c文件的调试功能看下系统时钟频率。 项目使用的是AT32F437VMT7芯片&…

ESP UART 介绍

1 UART 介绍 UART 是一种以字符为导向的通用数据链&#xff0c;可以实现设备间的通信。异步传输的意思是不需要在发送数据上添加时钟信息。这也要求发送端和接收端的速率、停止位、奇偶校验位等都要相同&#xff0c;通信才能成功。 1.1 UART 通信协议 一个典型的 UART 帧开始…

3.9多线程

一.常见锁策略1.悲观锁 vs乐观锁体现在处理锁冲突的态度①悲观锁:预期锁冲突的概率高所以做的工作更多,付出的成本更多,更低效②乐观锁:预期锁冲突的概率低所以做的工作少,付出的成本更低,更搞笑2.读写锁 vs 普通的互斥锁①普通的互斥锁,只有两个操作 加锁和解锁只有两个线程针…

奇点云DataSimba发版全解析:“企业级”版本升级,提供最佳组合

近日&#xff0c;奇点云发布数据云产品商业化版本的全新升级&#xff1a;DataSimba&#xff08;数据云平台&#xff09;提供极速版、专业版、旗舰版、红旗版&#xff0c;可靠性、可用性、可服务性再进阶&#xff0c;四大版本满足不同企业选择。 「乐高式DIY」or「最佳组合」&am…

推荐几款主流好用的远程终端连接管理软件

一、介绍 远程终端连接管理软件是管理服务器、虚拟机等远程计算机系统不可或缺的工具之一&#xff0c;它可以通过网络连接到另一台计算机&#xff0c;以执行命令、编辑文件或进行其他管理任务&#xff0c;下面我将为大家介绍几款主流好用的远程终端连接管理软件&#xff0c;并…

Navisworks编辑材质和Revit快速切换材质问题

一、如何在Navisworks2016中编辑材质 初次使用NW2016-2017时发现&#xff0c;原来用于创建编辑材质的小地球不见了&#xff0c;如图1所示&#xff0c;在各大技术群里求助没有回应&#xff0c;度娘搜索也总是摇头。 经过仔细排查可能出现的地方&#xff0c;终于找到了可以编辑材…