ZYNQ学习Linux 基础外设的使用

news2024/10/6 6:52:25

基本都是摘抄正点原子的文章:《领航者 ZYNQ 之嵌入式Linux 开发指南 V3.2.pdf》,因初次学习,仅作学习摘录之用,有不懂之处后续会继续更新~

工程的创建参考:《ZYNQ学习之Petalinux 设计流程实战》

一、GPIO 之 LED 的使用

GPIO 驱动程序通过 sysfs 文件系统提供了用户空间对 GPIO 的访问,因而通过终端控制 LED 极其方便。

启动领航者开发板,进入《ZYNQ学习之Petalinux 设计流程实战》定制的 Linux 系统后在串口终端中输入如下命令进入到 sysfs 文件系统的 leds 接口处:

cd /sys/class/leds

ls

这 6 个 LED 对应开发板上的 6 个 LED 灯,名字的命名跟板子上对应 LED 丝印上的名字是一样的。先来看下 leds 下的内容,以 ps_led1 为例,输入“ls ps_led1”,执行结果如下图所示:

可以看到有 brightness 和 trigger。Brightness 可以控制 led 灯的亮灭,trigger 可以选择触发方式。向 ps_led1 的 brightness 写入 0,即输入“echo 0 > ps_led1/brightness”命令,如下图所示:

可以看到PS_LED1常灭。

现在输入“echo 1 > ps_led1/brightness”命令,如下图所示:

可以看到PS_LED1常亮。

这就是通过 brightness 来控制 led 灯的亮灭,其他led灯也可以以此种方式控制。

现在来看下如何通过 trigger 来控制 led。首先输入“cat ps_led1/trigger”命令看下有多少种触发方式,如下图所示:

root@ALIENTEK-ZYNQ:/sys/class/leds# cat ps_led1/trigger
[none] kbd-scrolllock kbd-numlock kbd-capslock kbd-kanalock kbd-shiftlock kbd-altgrlock kbd-ctrllock kbd-altlock kbd-shiftllock kbd-shiftrlock kbd-ctrlllock kbd-ctrlrlock mmc0 mmc1 timer oneshot heartbeat backlight gpio cpu cpu0 cpu1 default-on transient flash torch

可以看到触发方式非常多,其中“[]”中的内容表示当前触发方式。可知当前触发方式 为 none,也就是表示无任何触发反应。

现在试一下 timer 触发,输入命令“echo timer > ps_led1/trigger”,如下图所示

可以看到开发板上 ps_led1 灯以定时器的方式每秒闪烁一次,这就是 timer 触发方式的效果,与我们在设备树中配置的效果一样。现在来看下 heartbeat 方式的效果,输入命令“echo heartbeat > ps_led1/trigger”,如下图所示:

此时可以看到开发板上的 PS_LED1 灯像心跳一样的闪烁这就是 heartbeat 触发方式的效果。其它触发方式可以单独试用,需要提醒的是并不是所有的触发方式都能有反应,必须满足相应触发条件才行。

二、GPIO 之按键的使用

GPIO 按键的使用非常简单,通过读取文件/dev/input/event0 可以获取由 GPIO 按键生成的按键事件。在串口终端中输入“cat /dev/input/event0 | hexdump”命令,然后按下一个按键,输入事件将打印到控制台;

cat /dev/input/event0 | hexdump

如下图所示:

在按键盘上的Ctrl + C 退出

三、EEPROM 的使用

在配置设备树的时候,设备树文件中配置了两个 I2C 外设,一个是 EEPROM,另一个是 RTC。首先来看下如何读写 EEPROM。

/sys/class/i2c-adapter 目录下有两个 I2C 总线控制器,如下图所示:

i2c-1 和 i2c-2 分别对应 ZYNQ PS 端的两个 I2C 总线控制器,开发板上的 EEPROM 挂载在i2c-1 总线下。进入到/sys/class/i2c-adapter/i2c-1/目录下,查看该目录下的内容,如下图所示:

root@ALIENTEK-ZYNQ:/sys/class/i2c-adapter# cd i2c-1
root@ALIENTEK-ZYNQ:/sys/class/i2c-adapter/i2c-1# ls
1-0050         1-0051         delete_device  device         i2c-dev        name           new_device     of_node        power          subsystem      uevent

其中 1-0050 中的 1 代表 i2c-1,50 代表器件地址 50,也就是 eeprom 的器件地址。 进入到 1-0050/目录下,可以看到该目录有一个 eeprom 文件,如下图所示:

root@ALIENTEK-ZYNQ:/sys/class/i2c-adapter/i2c-1# cd 1-0050
root@ALIENTEK-ZYNQ:/sys/class/i2c-adapter/i2c-1/1-0050# ls
1-00500    driver     eeprom     modalias   name       of_node    power      subsystem  uevent

可以通过 eeprom 文件对 EEPROM 设备进行读写操作,譬如向 eeprom 设备中写入“hello world”,然后读取出来,输入命令如下:

echo "hello world" > eeprom           #向 eeprom 设备中写入“hello world”

head -1 eeprom                                 #读取 eeprom

执行结果如下图所示:

至此eeprom 设备的读写就完成了。

四、RTC 的使用

在上一小节中,/sys/class/i2c-adapter/i2c-1/目录下除了 1-0050 文件夹,还有一个 1-0051 文件夹,对应 RTC 设备。

进入 1-0051/目录,查看其目录内容,如下图所示:

root@ALIENTEK-ZYNQ:/sys/class/i2c-adapter/i2c-1# cd 1-0051
root@ALIENTEK-ZYNQ:/sys/class/i2c-adapter/i2c-1/1-0051# ls
driver     modalias   name       of_node    power      rtc        subsystem  uevent

可以看到有一个 rtc 文件夹,那么操作 rtc 是不是像 eeprom 那样呢? 当然不是,对于 rtc,linux 有一个专用的命令:hwclock。 在 Linux 中有硬件时钟与系统时钟两种时钟。硬件时钟是指电路板上的时钟设备,也就 是通常可在电脑 BIOS 画面设定的时钟。系统时钟则是指 kernel 中的时钟。当 Linux 启动时,系统时钟会去读取硬件时钟的设定,之后系统时钟独立运作。所有 Linux 相关指令与函数都是读取系统时钟的设定。

使用 date 和 hwclock 命令可分别查看和设定系统时钟和硬件时钟。

在串口终端中输入下面的指令查看系统时间:

date

串口终端如下图所示:

上图中箭头所指示的位置就是当前的系统时间。 在串口终端中输入下面的指令查看硬件(RTC)时钟:

hwclock

串口终端如下图所示:

上图中显示的便是当前 RTC 时钟芯片中的时间。

在串口终端中输入下面的指令将系统时间设置为当前日期和时间(2024/4/06, 11:12:55),然后使用 date 指令查看所设置的系统时间:

date -s "2024-04-06 11:12:55"

date

在串口终端中输入下面的命令将系统时间写入 RTC 时钟芯片中,然后使用 hwclock 命令查看硬件时钟。

hwclock -w                 # 将系统时钟同步至硬件时钟

hwclock                      # 查看硬件时钟

五、QSPI 的使用

首先执行“cat /proc/mtd”命令查看 qspi flash 分区信息,如下图所示:

cat /proc/mtd

linux 系统将 qspi flash 分成了 6 个分区:mtd0、mtd1、mtd2、mtd3、mtd4 以及 mtd5 分区,分区 名分别是:boot、bootenv、bitstream、device-tree、kernel 以及 space,不同分区用于存放不同镜像文件。 本小节使用第 6 个mtd5,即 space 分区。

5.1 读写测试

执行下面这条命令读取 flash 的第六个分区,为了节省时间,只读取 64 个字节:

hexdump -C -n 64 /dev/mtdblock5        #读 flash 第六个分区长度为 64 个字节

左边红箭头处显示的是十六进制表示的相对地址,一行地址共有 16 字节数据;中间红框中显示的是十六进制表示的数据,而右边箭头处则是对应的 ASCII 字符,由于有些数据没有 对应的 ASCII 字符,所以用“................”来表示。 执行下面这条命令将字符串写入 QSPI 的第六个分区中:

echo "ALIENTEK ZYNQ 7010" > /dev/mtdblock5           #将字符串写入

flash hexdump -C -n 64 /dev/mtdblock5                         #读取 flash 中内容

双引号(" ")中间的字符串就是我们要写入的,从上面可以知道,当写入之后再次读取 flash,发现写入与读取的数据是相同的,所以 qspi flash 读写测试成功!

5.2 复制文件

首先在用户“root”根目录下创建“test.txt”文件,并向文件中写入“flash test”内容,命令如下所示:

touch test.txt                                   #创建 test.txt 文本

echo "flash test" > test.txt             #向文本中写入内容

cat test.txt                                        #查看test.txt中的文本

结果如下图所示:

使用“flashcp”命令复制文本文件到 flash 第六个分区,命令如下所示:

flashcp test.txt /dev/mtd5                               #复制文本文件到 flash 中

hexdump -C -n 64 /dev/mtdblock5                 #查看分区中的内容是否和文本中一致

执行结果如下图所示:

从上图中可以看到,文本中的“flash test”内容已经成功复制到 flash 分区中了。

六、USB 的使用

领航者底板上有四个 USB HOST 接口和一个 USB SLAVE 接口,本小节通过访问 USB 设备——U 盘,来学习 USB HOST 接口的使用。

开发板上 USB HOST 和 SLAVE 接口共用相同 ZYNQ 引脚,使用前要通过跳线帽手动选择。使用跳线帽将 P4 端子的 DN 与 HN 相连、DP 与 HP 相连, 注意先连接 DN 与 HN,此时USB_HOST 接口被激活。

将 fat32 格式的 U 盘插入底板上 4 个 USB HOST 接口中的一个。注意,U 盘文件系统格式不支持 ntfs,ntfs格式的用户请将 U盘重新格式化成 fat32,格式化之前请备份 U盘中的数据。 此时串口终端会有打印信息,如下所示:

信息打印出来之后,插入的 U 盘就已经被挂载到根文件系统中了,此时可通过 df 命令查看挂载点,如下所示:

红色框标识出来的就是笔者插入的 USB 设备——U 盘,显示 U 盘文件系统格式是 vfat,也就 fat32,实际容量为 15G,挂载点是/run/media/sda1,进入到该目录可以看到 U 盘中存放的文件以及文件夹,如下所示:

通过下面这条命令创建一个文件 hello.txt,内容为“hello Zynq”,如下所示:

touch test.txt

echo "hello Zynq" > test.txt

echo "hello Zynq" > hello.txt

写入的内容与读取出来的内容一致,说明 U 盘读写测试没有问题。测试完成之后不要直接把 U 盘拔了,需要先把 U 盘卸载,在串口终端中输入如下命令:

cd                                                         #退出 U 盘所在目录

umount /run/media/sda1/                   #卸载 U 盘

卸载成功之后就可以把U盘拔掉了。

七、以太网的使用

领航者开发板有两路千兆以太网接口,GE_PS 和 GE_PL;由于 GE_PS 网口使用了 PS 端 IO 资源,而 GE_PL 网口使用了 PL 端 IO 资源,所以这里也把 GE_PS 网口称为 PS 网口、而把GE_PL 网口称为 PL 网口,如下所示:

注:连接网口的网线要使用千兆网线,譬如 CAT-5E 类网线或 CAT-6 类网线,正点原子在实际测试当中,发现 CAT-5E 类网线并不稳定,所以这里推荐使用 CAT-6 类网线进行测试

7.1 查看网络设备

在串口终端执行下面这条命令可以查看系统中的所有网络设备,如下所示:

ifconfig -a

上图显示了当前系统中所有的网络设备,其中 eth0表示开发板上的PS网口、而eth1则表示开发板上的 PL网口。

还可以直接使用 ifconfig命令不加任何选项查看当前系统已经激活(打开)的网络设备,如下图所示:

ifconfig

上图中的 eth0 就是开发板上的 PS 网口,可以通过 ifconfig 命令来关闭或激活对应的网口。

ifconfig 命令打开或关闭 PS 网口的命令如下所示:

ifconfig eth0 down                    #关闭 eth0(PS 网口)

ifconfig eth0 up                         #打开 eth0(PS 网口)

ifconfig 命令打开或关闭 PL 网口的命令如下所示:

ifconfig eth1 down                         #关闭 eth1(PL 网口)

ifconfig eth1 up                              #打开 eth1(PL 网口)

如果是用 ip 命令,则对应命令如下:

ip link set eth0 down                 #关闭 eth0(PS 网口)

ip link set eth0 up                      #打开 eth0(PS 网口)

下面在使用 PS 网口的时候,需要先把 PL 网口给关闭,只打开 PS 网口;同理使用PL 网口的时候,需要把 PS 网口给关闭,只打开 PL 网口;在后面的使用当中,以 PS 网口为例进行介绍,PL 网口使用方式相同。

7.2 外网连接测试(有路由器)

在测试之前,先使用网线将开发板 PS 网口连接到能够上网的路由器设备上,如果没有能够上网的路由器设备的请跳过该小节,进入下一小节,因为访问外网需要联网的路由器。

执行下面的命令打开开发板的 PS 网口,并且关闭 PL 网口:

ip link set eth1 down                    #关闭 PL 网口

ip link set eth0 up                         #打开 PS 网口

ip link show up

结果如下图所示:

接下来我们需要给 PS 网口分配一个 IP 地址,使用 udhcpc 命令从 DHCP 服务器中动态获取一个 IP 地址,如下所示:

udhcpc -i eth0         #eth0 动态获取 IP 地址

从上图中可以看到,这里 PS 网口动态获取得到的 IP 地址为 192.168.2.3。获取到 IP 地址之后,接下来需要测试下开发板是不是能够上网,也就是测试开发板 PS 网口是否工作正常、是否能够连接外网。

当然首先确定开发板 PS 网口连接到的路由器是能够连接外网的,可以使用 ping 命令来测试开发板与另一台主机的网络连接是否通畅。

ping 命令是基于 ICMP(Internet Control Message Protocol)协议来工作的,执行 ping 命令本地主机会向目标主机发送一份 ICMP回显请求报文,并等待目标主机返回 ICMP 应答;因为ICMP 协议会要求目标主机收到消息之后,必须返回 ICMP 应答消息给本地主机,如果本地主机收到了目标主机的应答,则表示两台主机之间的网络运行、网络连接是正常的。

例如在串口终端执行 ping 命令来测试开发板(本地主机)与百度 www.baidu.com 服务器(目标主机)之间的网络连接是否通畅,如下所示:

从上图可以知道,通过开发板对百度服务器主机(IP 地址:183.2.172.42)发送了10 次应答请求,并且每次都收到了它的应答消息(64 字节数据),并且没有数据丢失,说明开发板与百度服务器主机之间的网络运行、网络连接是 OK 的,也就意味着的开发板与外网是连通的。

PL 网口的外网连接测试同理。

7.3 电脑直连测试(无路由器)

在开发过程中,电脑和开发板互相访问是经常需要的,这可以通过路由器来实现,连接到同一路由器的设备是可以互相访问的,如果没有路由器,也可以使用网线将开发板 PS 网口或者 PL 网口直接连接到电脑的以太网接口上,也就是电脑直连,不过这种方式不能访问外网。

这里以 PS 网口为例,用网线将开发板的 PS 网口和电脑的以太网接口相连接。 连接好网线之后,需要设置电脑以太网的 IP地址(设置方法可以参考该视频链接:Linux 开发板网络直连电脑的设置方法)。本节设置电脑的 IP 地址如下图所示:

配置完成后,在串口终端中执行下面这些命令打开开发板的 PS 网口,并且关闭 PL 网口:

ifconfig eth1 down            #关闭 PL 网口

ifconfig eth0 up                 #打开 PS 网口

执行下面的命令设置开发板 eth0 网口的静态 IP 地址为 192.168.1.10:

ifconfig eth0 192.168.1.10 netmask 255.255.255.0

设置完成后,开发板的 IP 地址和电脑的 IP 就在同一网段。接下来进行 Ping 测试,看开发板和电脑能不能相互 Ping 通。

首先开发板 ping 电脑,命令如下:

ping -c4 192.168.1.89

结果如下图所示:

如果 Ping 不通电脑,请关闭电脑的防火墙后再尝试。 电脑 ping 开发板。首先打开电脑的 cmd 命令提示符,然后输入如下命令:

ping -c4 192.168.1.10

结果如下:

开发板和电脑相互 Ping 通,说明双方的通信基本上没啥问题了。

八、eMMC 的使用

开发板板载 8GB eMMC,可以把 eMMC 当作固定在板子上的 SD 卡,其使用方式跟SD卡一样。接下来通过简单的读写来学习 eMMC 的使用。

由于本小节需要对 eMMC进行格式化操作,而《ZYNQ学习之Petalinux 设计流程实战》中生成的根文件系统不支持格式化命令,需要重新配置。

运行“petalinux-config -c rootfs”命令打开根文件系统配置界面,如下图:

进入“Filesystem Packages → base → e2fsprogs”选项下,勾选“e2fsprogs-mke2fs”选项,如下图所示:

配置完成后保存并退出:

重新编译工程:

petalinux-build

确认生成了image.ub文件,如下:

cd images/linux/

ls -l

将编译后生成的 image.ub 复制到 sd 卡替换原来的 image.ub 文件。

cp image.ub /media/gbxluo/boot/

ls -l /media/gbxluo/boot/

系统重新启动后,进入系统,输入“df -Th”命令,查看挂载的文件系统,如下图所示:

其中“/dev/mmcblk1p1”就是 eMMC 设备,代表 eMMC 的第一个分区,挂载在 “/media/sd-mmcblk1p1”挂载点。接下来参考《ZYNQ学习之Petalinux 设计流程实战》制作 SD 启动卡的步骤,重新将eMMC 格式化成一个分区。 分别执行下面两个命令,先从挂载点卸载 eMMC,再对 eMMC 分区,结果如下图所示:

umount /media/sd-mmcblk1p1

fdisk /dev/mmcblk1

执行后输入“p”,结果如下图所示:

可以看到 eMMC 已经有一个 p1(mmcblk1p1)分区,为了演示如何新建分区,这里我们先删除该分区。输入“d”删除第一个分区,再次输入“d”提示没有分区可以删除,如下图所示:

接下来输入“n”创建新分区,输入“p”选择创建主分区,按回车键,然后输入“1”设置分区号,接下来设置分区起始扇区,都按回车键,选择默认即可,如下图所示:

输入“p”检查分区表,可以看到新建的分区,如果没有问题,输入“w”保存并退出, 如下图所示:

分区创建完成后,就可以格式化分区了。在终端输入如下命令:

mkfs.ext4 -L rootfs /dev/mmcblk1p1

该命令将分区格式化成 ext4 分区并命名为“rootfs”,如下图所示:

如果提示该分区已经存在一个 ext4文件系统,询问是否继续,直接输入“y”并回车。

格式化完成后还需要重新挂载 eMMC 到系统,如下图所示:

mount /dev/mmcblk1p1 /media/sd-mmcblk1p1/

此时就可以对 eMMC 进行读写操作了。

echo “hello gbxluo” > /media/sd-mmcblk1p1/test.txt

cat /media/sd-mmcblk1p1/test.txt

 echo “www.openedv.com” > /media/sd-mmcblk1p1/test.txt 用于在 eMMC 中创建名为 test.txt 的文本文件,并向文件中写入内容为“hello gbxluo”的文本内容,

cat /media/sd-mmcblk1p1/test.txt用于将文件中的内容打印出来,可以看到写入和读出的内容相同,如下图所示:

 eMMC 的使用方式跟 SD 卡没啥区别。

九、参考链接:

ZYNQ领航者V2开发板 — 正点原子资料下载中心 1.0.0 文档

ZYNQ学习之Petalinux 设计流程实战-CSDN博客

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

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

相关文章

Open CASCADE学习|旋转变换

物体在三维空间中的旋转变换操作通常可以通过三种不同的方式来表示:矩阵(Matrix)、欧拉角(Euler Angles)和四元数(Quaternion)。下面详细解释这三种表示方法。 矩阵(Matrix&#xf…

SpringCloud学习(10)-SpringCloudAlibaba-Nacos服务注册、配置中心

Spring Cloud Alibaba 参考文档 Spring Cloud Alibaba 参考文档 nacos下载Nacos 快速开始 直接进入bin包 运行cmd命令:startup.cmd -m standalone 运行成功后通过http://localhost:8848/nacos进入nacos可视化页面,账号密码默认都是nacos Nacos服务注…

全景化工厂虚拟场景VR在线编辑突破传统束缚

数字化时代来临,让很多行业发生了天翻地覆的变化,更多人和企业接纳和亲近VR/AI/3D等技术,虚拟仿真VR内容编辑器系统不仅在畜牧培训领域大放异彩,更在其他多个行业领域展现出广泛的应用前景。 相比传统的VR虚拟现实应用程序开发依赖…

如何使用开源情报跟踪一个人?在线访问网站以及使用方法介绍

如何使用开源情报跟踪一个人?在线访问网站以及使用方法介绍。 开源情报(OSINT)是一门关于收集和分析公开可用信息的独特技艺,它致力于构建个人或团体的详尽档案。 这一过程中,信息搜集者会利用多元化的信息源&#xff…

如何使用 langchain 与 openAI 连接

上一篇写了如何安装 langchain https://www.cnblogs.com/hailexuexi/p/18087602 这里主要说一个 langchain的使用 创建一个目录 langchain ,在这个目录下创建两个文件 main.py 这段python代码,用到了openAI,需要openAI及FQ。这里只做…

【NLP】隐马尔可夫(HMM)与条件随机场(CRF)简介

一. HMM 隐马尔可夫模型(Hidden Markov Model, HMM)是一种用于处理含有隐藏状态的序列数据的统计学习模型。通过建模隐藏状态之间的转移关系以及隐藏状态与观测数据的生成关系,HMM能够在仅观察到部分信息的情况下进行状态推理、概率计算、序…

Spring Security——06,授权_封装权限信息

授权_封装权限信息 一、权限系统的作用二、授权基本流程三、限制访问资源所需权限四、封装权限信息4.1 权限信息封装到LoginUser4.2 LoginUser 添加权限4.3 过滤器封装权限信息 五、断点测试5.1 有权限的访问5.2 没有权限的访问 一键三连有没有捏~~ 一、权限系统的作用 例如一…

数据结构(3)----栈和队列

目录 一.栈 1.栈的基本概念 2.栈的基本操作 3.顺序栈的实现 •顺序栈的定义 •顺序栈的初始化 •进栈操作 •出栈操作 •读栈顶元素操作 •若使用另一种方式: 4.链栈的实现 •链栈的进栈操作 •链栈的出栈操作 •读栈顶元素 二.队列 1.队列的基本概念 2.队列的基…

物联网实战--驱动篇之(三)LoRa(sx1278)

目录 一、LoRa简介 二、sx1278模块 三、硬件抽象层 四、SX1278初始化 五、发送时间计算 六、发送模式 七、接收模式 八、总结 一、LoRa简介 LoRa在物联网传输领域有着举足轻重的地位,平时大家可能比较少听说,因为它主要还是在行业应用&#xff0…

精心整理-数据分类分级赋能企业数据安全建设资料合集

以下是资料目录,如需下载请前往知识星球下载:https://t.zsxq.com/18KTZnJMX 企业数据安全建设数据分类分级架构.pdf 企业数据分类分级模板.xls 数据分类分级的实践与挑战.pdf 数据分类分级制度评述.pdf 电信和互联网大数据安全管控分类分级实施指南.pdf …

嵌入式学习49-单片机2

指令周期 1M 机器周期 12M (晶体震荡器产生) 中断两种方式 …

STL--list和vector有什么区别

list 和 vector 是 C STL 中的两种常见容器,它们在底层实现、性能特性和适用场景方面有着显著的区别: 底层数据结构: vector 底层是一个动态数组,提供快速的随机访问,但在中间插入或删除元素效率较低。 list 是一个双…

鸿蒙ArkUI实例:【自定义组件】

组件是 OpenHarmony 页面最小显示单元,一个页面可由多个组件组合而成,也可只由一个组件组合而成,这些组件可以是ArkUI开发框架自带系统组件,比如 Text 、 Button 等,也可以是自定义组件,本节笔者简单介绍一…

ERC314协议代币开发及合约开发详解

ERC314 是一种新的代币标准,旨在为 BASE 链上的代币提供更便捷、高效的交易体验。它由 DAPJ 项目团队开发,并于 2023 年 8 月首次发布。 ERC314 的特点 无需依赖 DEX 或 SWAP 进行交易: ERC314 代币可以像原生代币一样直接转账,无需借助 DEX …

Lightroom Classic 2024成就专业摄影梦想mac/win版

Lightroom Classic 2024是一款功能强大的数字图像处理和管理工具,专为摄影师和摄影爱好者设计。它提供了丰富的照片调整、处理、管理和分享功能,帮助用户轻松管理、编辑和展示他们的照片。 Lightroom Classic 2024软件获取 首先,Lightroom C…

Vector Laboratories的凝集素--莲藕凝集素(Lotus Tetragonolobus Lectin)

莲藕凝集素(lotustetragonolobus lectin)是一个密切相关的糖蛋白家族,对含α-linked L-fucose具有相似的特异性。虽然莲藕凝集素的许多结合特性与荆豆凝集素I相似,但这些岩藻糖特异性凝集素之间的结合亲和力和某些寡糖特异性明显不…

【小白学机器学习11】假设检验之2:Z检验(U检验,正态检验)

目录 1 什么是Z检验 1.1 Z检验的别名 Z-test /U-test / 正态检验 1.2 维基百科定义 1.2 百度百科定义 1.3 定义提炼关键点 1.4 Z检验量 : Z(X-θ)/s (X-u)/s 2 Z检验量的构造 2.1 Z检验量 : Z(X_-u)/s 2.2 Z检验变量的构造 2.4 Z检验量的核心参数 2.4.1 原始公式 …

性能优化-如何爽玩多线程来开发

前言 多线程大家肯定都不陌生,理论滚瓜烂熟,八股天花乱坠,但是大家有多少在代码中实践过呢?很多人在实际开发中可能就用用Async,new Thread()。线程池也很少有人会自己去建,默认的随便用用。在工作中大家对…

数据库表设计18条黄金规则

前言 对于后端开发同学来说,访问数据库,是代码中必不可少的一个环节。 系统中收集到用户的核心数据,为了安全性,我们一般会存储到数据库,比如:mysql,oracle等。 后端开发的日常工作&#xff…

基于ARM内核的智能手环(day8)

心率模块 输入模拟量 MPU6050 IIC 接线引脚: 因为这两个模块官方都提供了详细的资料和源码,这里不再过多赘述 项目结果展示 待机页面 有开场动画 所有页面无操作20s自动返回待机页面 主页 展示时间和温度到达预定时间蜂鸣器响起,按键后关…