正点原子嵌入式linux驱动开发——Linux WIFI驱动
WIFI的使用已经很常见了,手机、平板、汽车等等,虽然可以使用有线网络,但是有时候很多设备存在布线困难的情况,此时WIFI就是一个不错的选择。正点原子STM32MP1开发板支持USB和SDIO这两种接口的WIFI,本章就来学习一下如何在STM32MP1开发板上使用USB和SDIO这两种WIFI。
硬件原理图分析
正点原子的STM32MP1开发板板载了SDIO WIFI使用芯片的为RTL8723DS,原理图如下所示:
从上图中可以看出,板载的WIFI为SDIO接口,D0-4所对应的硬件引脚为:PF0、PF4、PF5和 PD7,CMD对应的硬件引脚为PF1,CLK所对应的硬件引脚为PG15。
WIFI驱动添加与编译
正点原子的STM32MP1开发板目前支持两种接口的WIFI:USB和SDIO,其中USB WIFI使用的芯片为RTL8188EUS,SDIO接口的WIFI 使用芯片为RTL8723DS,这两个都是realtek公司出品的WIFI芯片。WIFI驱动不需要自己编写,因为realtek公司提供了WIFI驱动源码,因此只需要将WIFI驱动源码添加到Linux内核中,然后通过图形界面配置,选择将其编译成模块即可。
正点原子的STM32MP1开发板上有一个板载RTL8723DS WIFI,接口为SDIO。RTL8723DS芯片是WIFI和蓝牙二合一,这一章只讲解WIFI。正点原子STM32MP157开发板上的RTL8723DS模组有两种封装形式的,如下图所示:
上图中这两个都是RTL8723DS模组,封装、功能一模一样,只是元器件布局不同而已。另外,正点原子还有一款采用RTL8188EUS芯片的USB WIFI,如下图所示:
向Linux内核添加WIFI驱动
移植驱动
将rtl8723ds目录拷贝到Ubuntu下Linux内核源码中的drivers/net/wireless/realtek/目录下,此目录存放着Linux主线上的所有realtek公司的WIFI驱动
文件,拷贝完成以后此目录如下图所示:
修改drivers/net/wireless/realtek/Kconfig
打开drivers/net/wireless/ realtek/Kconfig,在里面加入下面这一行内容:
source "drivers/net/wireless/realtek/rtl8723ds/Kconfig" |
添加完成以后的如下图所示:
修改drivers/net/wireless/realtek/Makefile
打开drivers/net/wireless/realtek/Makefile,在里面加入下面以后内容:
obj-$(CONFIG_RTL8723DS) += rtl8723ds/ |
修改以后的Makefile文件如下图所示:
上图中第11行,这里新添加一个内核配置,会根据CONFIG_RTL8723DS这个宏来决定8723ds WIFI驱动是编译进内核还是模块。
配置USB支持设备
在编译RTL8188和RTL8723驱动之前需要先配置Linux内核。
配置USB支持设备
USB配置默认已经选中了,这里只是看一下都有哪些要配置,配置路径如下:
-> Device Drivers -> <*> USB support -> <*> Support for Host-side USB //选中 -> <*> EHCI HCD (USB 2.0) support //选中 -> <*> OHCI HCD (USB 1.1) support //选中 -> <*> ChipIdea Highspeed Dual Role Controller //选中 -> [*] ChipIdea device controller-> //选中 -> [*] ChipIdea host controller //选中 |
配置支持WIFI设备
配置路径如下:
-> Device Drivers -> [*] Network device support -> [*] Wireless LAN -> <*> IEEE 802.11 for Host AP (Prism2/2.5/3 and WEP/TKIP/CCMP) //选中 -> [*] Support downloading firmware images with Host AP driver //选中 -> [*] Support for non-volatile firmware download //选中 |
配置完如下图所示:
配置支持IEEE802.11
配置路径如下:(注意:是配置成模块,不是编译进内核)
-> Networking support (NET [=y]) -> Wireless (WIRELESS [=y]) -> cfg80211 - wireless configuration API //编译成模块 |
配置完如下图所示:
使能STAGING配置
配置路径如下:
-> Device Drivers -> [*] Staging drivers //选中 |
配置完如下图所示:
配置好以后重新编译一下Linux 内核,得到新的uImage,后面使用新的编译出来的uImage启动系统。
设备树的配置
pinctrl的配置
首先肯定是sdmmc3引脚配置信息,打开stm32mp15-pinctrl.dtsi,找到如下所示内容:
示例代码53.1.3.1中就是sdmmc3的默认引脚配置,这个是ST官方根据自己的EVK开发板编写的,和正点原子STM32MP157开发板上的SDMMC3引脚一致,所以不需要修改!
sdmmc3控制器节点信息
打开stm32mp151.dtsi文件,找到名为“sdmmc3”的节点,内容如下:
示例代码53.1.3.2中的sdmmc3节点不需要修改,这里只是看一下sdmmc3完整节点信息。从第13行可以看出,sdmmc3设备默认是关闭的。
使能sdmmc3节点
打开stm32mp157d-atk.dts文件,用追加代码的方式去使能sdmmc3节点,追加的内容如下所示:
示例代码 53.2.3.3 要追加的 sdmmc3 节点
1 &sdmmc3 {
2 pinctrl-names = "default", "opendrain", "sleep";
3 pinctrl-0 = <&sdmmc3_b4_pins_a>;
4 pinctrl-1 = <&sdmmc3_b4_od_pins_a>;
5 pinctrl-2 = <&sdmmc3_b4_sleep_pins_a>;
6 non-removable;
7 st,neg-edge;
8 bus-width = <4>;
9 vmmc-supply = <&v3v3>;
10 status = "okay";
11 keep-power-in-suspend;
12 };
示例代码53.2.3.3给sdmmc3节点追加了pinctrl配置和使能了sdmmc3。
重点来了,这里是正点原子编写linux驱动开发教程时候的一个坑。
大家都知道STM32MP1有三个SDMMC接口 , 它们的物理地址分别为:0x58005000-0x58005FFF、0x58007000-0x58007FFF和0x48004000-0x480043FF。从它们的物理地址可以知道,它们的初始化顺序是根据物理地址:SDMMC3→SDMMC1→SDMMC2。假如三个SDMMC接口都使能,那么在Linux里所对应的操作文件为:/dev/mmcblk0(SDMMC3)、/dev/mmcblk1(SDMMC1)和/dev/mmcblk2(SDMMC2)。要注意,出厂系统uboot启动linux的时候,启动EMMC上的文件系统使用的是mmcblk2。但是在本教程前面讲解系统移植的时候说过挂载EMMC里面文件系统的时候使用mmcblk1,那是因为那个时候还没有使能SDMMC3这个接口,所以mmcblk1就是EMMC。
编译WIFI驱动
执行“make menuconfig”命令,打开Linux内核配置界面,然后按照如下路径选择将rtl8723ds和rtl8188eus驱动编译成模块。
rtl8723ds驱动配置
配置路径如下:
-> Device Drivers -> Network device support (NETDEVICES [=y]) -> Wireless LAN (WLAN [=y]) -> Realtek devices (WLAN_VENDOR_REALTEK [=y]) -> Realtek 8723D SDIO or SPI WiFi //编译为模块 |
配置完如下图所示:
rtl8188cus驱动配置
配置路径如下:
-> Device Drivers -> Staging drivers (STAGING [=y]) -> Realtek RTL8188EU Wireless LAN NIC driver |
配置完如下图所示:
已经把两种WIFI都配置成模块,接着就用以下命令去编译成模块:
make dtbs //重新编译设备树 make modules -j12 //编译驱动模块 |
在本章节里配置了三处为模块,分别是:IEEE 802.11、rtl8723ds和rtl8188eus。它们所对应
的模块名为:cfg8011.ko、8723ds.ko和r8188eu.ko。
编译完成后在所对应的目录下生成模块文件。比如:rtl8188eus WIFI驱动源码在linux源码下drivers/staging/rtl8188eu/目录里,所以rtl8188eus 的模块文件就在此目录下。
在内核的源码目录下,把三个模块拷贝到开发板nfs根目录下,拷贝命令如下:
sudo cp drivers/staging/rtl8188eu/r8188eu.ko ~/linux/nfs/rootfs/lib/modules/5.4.31/ sudo cp net/wireless/cfg80211.ko ~/linux/nfs/rootfs/lib/modules/5.4.31/ sudo cp drivers/net/wireless/realtek/rtl8723ds/8723ds.ko ~/linux/nfs/rootfs/lib/modules/5.4.31/ |
因为重新配置过Linux内核和设备树,因此也需要使用新的uImage启动和设备树,将新编译出来的uImage镜像文件和stm32mp157d-atk.dtb拷贝到U
Ubuntu中的tftpboot目录下。
驱动加载测试
固件拷贝
有些模块是需要固件配合使用的,比如cfg80211.ko驱动模块要读取/lib/firmware/regulatory.db文件。需要用到的固件如下图所示:
regulatory.db固件和regulatory.db.p7s固件都是cfg80211.ko模块需要加载的。rtl8188wufw.bin固件是r8188.ko模块需要加载的。
在开发板根文件系统中创建存放固件的文件夹,这里创建“lib/firmware/rtlwifi”目录来存放固件,nfs挂载的文件系统就直接在Ubuntu系统下运行以下命令:
sudo mkdir ~/linux/nfs/rootfs/lib/firmware/rtlwifi -p |
把regulatory.db和regulatory.db.p7s固件文件拷贝到刚刚创建的firmware目录下,把rtl8188wufw.bin固件拷贝rtlwifi目录下。拷贝完结果如下所示:
RTL8723 SDIO WIFI驱动测试
重启开发板以后,首先测试一下板载的SDIO WIFI。进入到目录/lib/modules/5.4.31中,运行以下命令进行加载8723ds.ko这个驱动模块:
depmod //第一次加载驱动的时候需要运行此命令 modprobe cfg80211.ko //先加载 cfg80211.ko,IEEE 协议 modprobe 8723ds.ko //RTL8723DS 模块加载 8723ds.ko 模块 |
如果驱动加载成功的话如图所示:
在加载cfg80211.ko模块时,如果没有固件就会报下图警告,还是可以使用的:
输入“ifconfig -a”命令,查看wlanX(X=0….n)网卡是否存在,一般都是wlan0,除非板子上有多个WIFI模块在工作,结果如下图所示:
从上图中可以看出,当前开发板有一个叫做“wlan0”的网卡,这个就是RTL8723DS对应的网卡。
注意!后面重启开发板的话会自动加载RTL8723驱动,不需要再手动加载!!
RTL8188EUS USB WIFI驱动测试
接着把RTL8188 USB WIFI接到开发板上,运行以下命令进行加载:
depmod modprobe r8188eu.ko |
如果驱动加载成功的话如下图所示:
从上图可以看出,RTL8188EUS USB WIFI驱动加载成功,同样使用“ifconfig -a”命令查看一下是否有wlanX(X=0…n)网卡存在,如果有的话就说明RTL8188 USB WIFI驱动工作正常。
同样的,以后重启开发板的话会自动加载RTL8188驱动,不需要我们再手动加载!!
不管是RTL8188 USB WIFI还是RTL8723 SDIO WIFI,驱动测试都工作正常,但是WIFI要想联网,需要移植一些其他第三方组件,否则无法连接路由器。
WIFI联网测试
buildroot WIFI工具配置
首先要给文件系统添加一些操作WIFI的工具。进入buildroot源码目录里,接着运行“make
menuconfig”进入图形配置界面,配置如下:
→ Target packages → Networking applications → [*] wireless tools //选中 →[*] Install shared library //选中 → [*] wpa_supplicant //选中 → [*] Enable nl80211 support //选中 →[*] Enable AP mode //选中 → [*] Enable Wi-Fi Display //选中 → [*] Enable mesh networking //选中 → [*] Enable autoscan //选中 → [*] Enable EAP //选中 → [*] Enable HS20 //选中 → [*] Enable syslog support //选中 → [*] Enable WPS //选中 → [*] Enable WPA3 support //选中 → [*] Install wpa_cli binary //选中 → [*] Install wpa_client shared library //选中 → [*] Install wpa_passphrase binary //选中 → [*] Enable support for the DBus control interface //选中 → [*] Introspection support //选中 |
配置完成后如下图所示:
配置完成后重新编译文件系统,编译完成后,进入output/images目录,运行以下命令把文件系统替换进去:
cd output/images/ //进入到 output/images 目录 sudo tar -axvf rootfs.tar -C /home/zuozhongkai/linux/nfs/rootfs //解压到 nfsroot 目录 |
上述命令将buildroot中output/images/rootfs.tar这个压缩包解压到/home/zuozhongkai/linux/nfs/rootfs这个目录中,这个目录就是教程中的nfsroot目录,根据自己的实际情况解压到对应的目录文件中。
重启开发板。
WIFI工具测试
先看下iwlist命令的使用的方法,命令如下:
iwlist --help |
iwlist使用方法如下图:
iwlist命令测试WIFI之前得先让WIFI模块工作起来。这里就以板载的RTL8723 WIFI为例。先加载RTL8723驱动模块8723ds.ko,因为之前使用了depmod命令去分析了模块之间的依赖,所以重启系统会自动加载模块。运行以下命令打开WIFI网卡:
ifconfig wlan0 up |
SDIO WIFI已经启动了,现在可以使用iwlist去扫描网络(一定要接天线!!),输入如下命令扫描当前存在的无线网络:
iwlist wlan0 scanning |
上述命令就会搜索当前环境下的所有WIFI热点,然后将这些热点的信息全部打印出来,包括MAC地址、ESSID(WIFI名字)、频率、速率,信号质量等等,如下图所示:
上图只是扫描出来的一部分截图,可以看出有两个WIFI热点,一个名为“ZZK”,一个名为“stone”。这两个都是2.4G频段的WIFI,RTL8723只支持2.4G频段WIFI,因此扫描不出来5G频段WIFI,这点要注意一下。
接下来使用wpa_supplicant这个工具来连接WIFI热点。简单介绍一下wpa_supplicant命令的使用,这个命令的参数有很多,下面就列出常用的参数:
- -D:指定设备,有三个设备分别为:nl80211、wext和wired。设备是固定的根据驱动源码决定使用那个设备。
- -c:指定wpa_supplicant配置文件。
- -i:指定网口,比如WiFi网口名为wlan0。
- -B:表示在后台运行。
RTL8723 SDIO WIFI联网测试
确保RTL8723能扫描出要连接的WIFI热点,比如这里连接上图中“ZZK”这个热点。
要连接的WIFI热点扫描到以后就可以连接了,默认情况下,开发板根文件系统/etc目录下会有一个名为“wpa_supplicant.conf”的配置文件,没有的话就自行创建一下。此文件用于配置要连接的WIFI 热点以及对应的密钥,比如要连接到“ZZK”这个热点上,因此wpa_supplicant.conf文件内容如下所示:
示例代码 53.3.3.1 wpa_supplicant.conf 文件内容
1 ctrl_interface=/var/run/wpa_supplicant
2 ctrl_interface_group=0
3 update_config=1
4
5 network={
6 ssid="ZZK"
7 psk="xxxxxxxxxxxxx"
8 }
第6行,ssid是要连接的WIFI热点名字,这里要连接的是“ZZK”这个WIFI热点。
第7行,psk就是要连接的WIFI热点密码,根据自己的实际情况填写即可。
注意,wpa_supplicant.conf文件对于格式要求比较严格,“=”前后一定不能有空格,缩进应该采用空格,否则的话会出现wpa_supplicant.conf文件解析错误!最重要的一点!wpa_supplicant.conf文件内容要自己手动输入,不要偷懒复制粘贴!!!
wpa_supplicant.conf文件编写好以后再在开发板根文件系统下创建一个“/var/run/wpa_supplicant”目录,wpa_supplicant工具要用到此目录!命令如下:
mkdir /var/run/wpa_supplicant -p |
一切准备好以后就可以使用wpa_supplicant工具让RTL8723 SDIO WIFI连接到热点上,输入如下命令:
wpa_supplicant -Dnl80211 -c /etc/wpa_supplicant.conf -i wlan0 & |
当RTL8723连接上WIFI热点以后会输出如下图所示的信息:
从上图可以看出,当RTL8723连接到WIFI热点上以后会输出“wlan0: CTRL-EVENT-CONNECTED”字样。接下来就是最后一步了,设置wlan0的IP地址,这里使用udhcpc命令从路由器申请IP地址,输入如下命令:
udhcpc -i wlan0 //从路由器获取 IP 地址 |
IP地址获取成功以后会输出如下图所示信息:
可以通过电脑ping一下wlan0的192.168.1.196这个IP地址,如果能ping通就说明RTL8723
SDIO WIFI工作正常。也可以直接在开发板上使用wlan0来ping一下百度网站,输入如下命令:
ping -I 192.168.1.196 www.baidu.com |
-I是指定执行ping操作的网卡IP地址,要使用wlan0去ping百度网站,因此要通过“-I”指定wlan0的IP地址。如果WIFI工作正常的话就可以ping通百度网站,如下图所示:
至此RTL8723 SDIO WIFI就完全驱动起来了,就可以使用WIFI来进行网络通信了。
RTL8188 USB WIFI联网测试
RTL8188 USB WIFI测试和RTL8723的测试方法基本一致。直接把WIFI接到USB HOST接口上。由于RTL8723默认就会开启,因此RTL8188此时就会是wlan1这个网卡,输入如下命令打开wlan1接口:
ifconfig wlan1 up |
RTL8188 USB WIFI同样使用wap_supplicant来完成热点连接工作,还是连接“ZZK”这个热点。可以直接使用之前创建的/etc/wpa_supplicant.conf文件,输入以下命令来完成WIFI热点连接:
wpa_supplicant -D wext -c /etc/wpa_supplicant.conf -i wlan1 & |
注意:这里的设备指定为“wext”,设备跟驱动源码有关。
当RTL8188连接上WIFI热点以后会输出如下图所示的信息:
使用udhcpc命令获取IP地址,命令如下:
udhcpc -i wlan1 |
IP地址获取过程如下图所示:
从上图可以看出,wlan1的IP地址为192.168.1.107。可以使用“ifconfig wlan1”查看一下wlan1网卡的详细信息。同样的,可以通过电脑ping一下192.168.1.107测试WIFI是否工作正常,或者在开发板上使用wlan0网卡ping一下百度网址来测试一下WIFI工作是否正常,输入如下命令:
ping -I 192.168.1.107 www.baidu.com |
如果ping成功的话结果如下图所示:
至此,如何在STM32MP1开发板上使用WIFI就全部讲解完了,包括USB WIFI和SDIO WIFI。其实不管是在STM32MP1上,还是在其他的SoC上,USB WIFI和SDIO WIFI的驱动都是类似的,可以参考本章教程讲RTL8188、RTL8723这两款WIFI的驱动移植到芯片或者开发板上。
总结
WIFI的驱动是买芯片的时候厂家自带的,所以我们要做的就是把驱动移植到内核然后使能去应用。
针对正点原子用的RTL8723DS WIFI,是SDIO接口的,需要把驱动的代码移植到drivers/net/wireless/realtek目录下,然后在drivers/ent/wireless/realtek目录中的Kconfig修改添加刚才rtl8723ds目录下的Kconfig,然后在Makefile中添加rtl8723ds/。
之后需要进入Linux内核图形化配置界面配置WIFI设备和IEEE 802.11使能编译成模块,使能STAGING配置。之后编译WIFI驱动,把WIFI编译成模块。
然后需要在stm32mp157d-atk.dts之中添加代码来使能sdmmc3节点。
之后还需要把所需固件拷贝到根文件系统中才能加载WIFI驱动。
联网测试需要先在buildroot使能配置相关的WIFI测试工具,然后通过在/etc/wpa_supplicant.conf之中添加信息来完成连接WIFI,通过wpa_supplicant没命令来完成连接。
相关文章:

正点原子嵌入式linux驱动开发——Linux WIFI驱动
WIFI的使用已经很常见了,手机、平板、汽车等等,虽然可以使用有线网络,但是有时候很多设备存在布线困难的情况,此时WIFI就是一个不错的选择。正点原子STM32MP1开发板支持USB和SDIO这两种接口的WIFI,本章就来学习一下如何…...
React中的“状态”(state)和“属性”(props)的区别
在React中,"状态"(state)和"属性"(props)是两个重要的概念,它们在组件的生命周期和数据流中扮演着不同的角色。 状态(State): 状态是React组件中用…...

棋牌室电脑计时灯控,棋牌室计时灯控安装,佳易王计时计费管理系统软件
棋牌室电脑计时灯控,棋牌室计时灯控安装,佳易王计时计费管理系统软件 棋牌室的灯可以用佳易王计时计费软件来控制开关,当开始计时的时候,软件发送开灯的指令,灯打开,在结账后,软件发送关灯指令…...

P02项目诊断报警组件(学习操作日志记录、单元测试开发)
★ P02项目诊断报警组件 诊断报警组件的主要功能有: 接收、记录硬件设备上报的报警信息。从预先设定的错误码对照表中找到对应的声光报警和蜂鸣器报警策略,结合当前的报警情况对设备下发报警指示。将报警消息发送到消息队列,由其它组件发送…...

【ARM Trace32(劳特巴赫) 使用介绍 2 - Veloce 环境中使用trace32 连接 Cortex-M33】
请阅读【ARM Coresight SoC-400/SoC-600 专栏导读】 文章目录 T32MARM 介绍Trace32 .t32 和 .cmm 差异veloce 下启动TRACE321.1.3 TAP 状态机操作命令1.1.3.1 IDCODE(Identification Code)寄存器 介绍 T32MARM 介绍 T32MARM 是 Lauterbach 的 Trace32 …...
服务器硬件有哪些组成
服务器是由处理器、硬盘、内存、显卡、主板、网卡等组成,今天小编带大家了解一下服务器有哪些硬件吧! 1.最重要的当然就是处理器了,处理器就相当于是服务器的大脑,负责执行各种运算和指令,例如运行程序或者处理数据&am…...

【Git】Git基础命令操作速记
【Git】Git基础命令操作速记 文章目录 【Git】Git基础命令操作速记1. 初始化1.1 设置用户名和邮箱1.2 初始化仓库 2. 基础命令2.1 add和commit2.2 reset2.3 查看日志2.4 删除/找回本地仓库文件2.5 找回暂存区文件2.6 diff命令(找不同) 3. 分支命令3.1 查看分支3.2 创建分支3.3 …...
使用CDN有什么好处?
近年来,随着互联网的快速发展,越来越多的企业开始发展互联网业务,出现了各种各样的网站和web程序,互联网改变了人们的生活习惯与消费行为,人们也是越来越依赖网络,而这些改变让互联网产业得到更加迅速发展。…...

11.7加减计数器,可置位~,数字钟分秒,串转并,串累加转并,24位串并128,流水乘法器,一些乘法器
信号发生器 方波,就是一段时间内都输出相同的信号 锯齿波就是递增 三角波就是先增后减 加减计数器 当mode为1则加,Mode为0则减;只要为0就输出zero 这样会出问题,因为要求是十进制,但是这里并没有考虑到9之后怎么办&a…...
【模型推理优化学习笔记】CUDA加速矩阵乘计算
矩阵乘可以利用gpu多线程并行的特点进行加速计算,但是传统简单的方法需要多次读取数据到寄存器中,增加耗时,因此利用gpu的共享内存可以被一个block内的所有线程访问到的特性,结合tiling技术进行加速计算。 理论部分不解释了&#…...

第三届 “鹏城杯”(初赛)
第三届 “鹏城杯”(初赛) WEB Web-web1 反序列化tostring打Hack类 Payload:O%3A1%3A%22H%22%3A1%3A%7Bs%3A8%3A%22username%22%3BO%3A6%3A%22Hacker%22%3A2%3A%7Bs%3A11%3A%22%00Hacker%00exp%22%3BN%3Bs%3A11%3A%22%00Hacker%00cmd%22%3BN%3B%7D%7D…...
React Hooks为什么要在顶层使用?
为什么必须在函数顶层使用hooks? 使用过 hooks 的小伙伴应该都会发现,hooks只能在函数式组件的顶层使用,不能在循环,条件或嵌套函数中调用 Hook。 为什么呢? 查阅了很多答案,总结如下: hook…...

Vscode Vim自动切换
在VsCode里安装了Vim插件,由于Vim插件存在Normal和Insert两种模式,会需要经常性的按shift切换中英文,太过麻烦,本文介绍一下如何通过im-select来解决。 首先先确保自己的电脑里装有英文语言包,win10系统下可以使用Win…...
C语言初学1:详解#include <stdio.h>
一、概念 #include <stdio.h> 称为编译预处理命令,它在告诉C编译器在编译时包含stdio.h文件,如果在代码中,调用了这个头文件中的函数或者宏定义,则需引用该头文件。 二、作用 stdio.h是c语言中的标准输入输出的头文件&am…...

5 Tensorflow图像识别(下)模型构建
上一篇:4 Tensorflow图像识别模型——数据预处理-CSDN博客 1、数据集标签 上一篇介绍了图像识别的数据预处理,下面是完整的代码: import os import tensorflow as tf# 获取训练集和验证集目录 train_dir os.path.join(cats_and_dogs_filter…...

OpenCV 图像复制和图像区域读写
图像复制 共享数据, 使用 new Mat(srcMat, ...) 和 newMatsrcMat 生成新的Mat都和原Mat共享数据, 也就是说如果修改某一Mat,其他Mat也会随之改变复制全新的Mat, 使用CopyTo() 和 Clone() 方法将生成一个全新的Mat, 新Mat和原Mat不共享数据. 图像区域和点的读写 区域读取: 通过s…...

【分布式事务】初步探索分布式事务的概率和理论,初识分布式事的解决方案 Seata,TC 服务的部署以及微服务集成 Seata
文章目录 一、分布式服务案例1.1 分布式服务 demo1.2 演示分布式事务问题 二、分布式事务的概念和理论2.1 什么是分布式事务2.2 CAP 定理2.3 BASE 理论2.4 分布式事务模型 三、分布式事务解决方案 —— Seata3.1 什么是 Seata3.2 Seata 的架构3.3 Seata 的四种分布式事务解决方…...

es6过滤对象里面指定的不要的值filter过滤
//过滤出需要的值this.dataItemTypeSelectOption response.data.filter(ele > ele.dictValue tree||ele.dictValue float4);//过滤不需要的值this.dataItemTypeSelectOption response.data.filter((item) > {return item.dictValue ! "float4"&&it…...
Docker从入门到上天系列第二篇:传统虚拟机和容器的对比以及Docker的作用以及所解决的问题
大神推荐:作者有幸结识技术大神孙哥为好友获益匪浅,现在把孙哥作为朋友分享给大家。 孙哥链接:孙哥个人主页 作者简介:一个颜值99分,只比孙哥差一点的程序员。 本专栏简介:话不多说,让我们一起干翻Docker 本文章简介:话不多说,让我们讲清楚首先讲清楚Docker是什么 文章…...

共话医疗数据安全,美创科技@2023南湖HIT论坛,11月11日见
11月11日浙江嘉兴 2023南湖HIT论坛 如约而来 深入数据驱动运营管理、运营数据中心建设、数据治理和数据安全、数据资产“入表”等热点、前沿话题 医疗数据安全、数字化转型深耕者—— 美创科技再次深入参与 全新发布:医疗数据安全白皮书 深度探讨:数字…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...