全志V3s之U-Boot

1、安装交叉编译器:

ARM交叉编译器的官网:交叉编译器

a、使用wget下载:

wget https://releases.linaro.org/components/toolchain/binaries/latest/arm-linux-gnueabihf/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf.tar.xz

b、解压安装:

tar xvf gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf.tar.xz	//解压交叉编译器
mv gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf /opt/      	//将交叉编译器移至opt文件下
vim ~/.bashrc														//使用vim配置文件
# add: export PATH=$PATH:/opt/gcc-linaro-6.3.1-2017.02-x86_64_arm-linux-gnueabihf/bin	//在文件末尾添加交叉编译器路径
source ~/.bashrc													//重新加载用户的 Bash 配置文件

c、查看版本:

arm-linux-gnueabihf-gcc -v

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

d、安装设备树编译器:

sudo apt-get install device-tree-compiler

device-tree-compiler 是一个用于编译和反编译设备树(Device Tree)的工具。

2、编译U-Boot:

U-Boot的官网:U-Boot官网,从上面可以下载所有版本的U-Boot。也可以去荔枝派的网站下载V3s的U-Boot:V3s的U-Boot。

a、使用Git下载U-Boot源代码:

git clone https://github.com/Lichee-Pi/u-boot.git -b v3s-current

b、编译生成二进制文件:

cd u-boot
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LicheePi_Zero_defconfig
make ARCH=arm menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
//如果需要保存编译日志则使用以下指令:
time make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 2>&1 | tee build.log

3、设置U-Boot从TF卡启动:

a、修改 include/configs/sun8i.h, 使u-boot可以直接从tf卡启动:

#define CONFIG_BOOTCOMMAND   "setenv bootm_boot_mode sec; " \
                            "load mmc 0:1 0x41000000 zImage; "  \
                            "load mmc 0:1 0x41800000 sun8i-v3s-licheepi-zero-dock.dtb; " \
                            "bootz 0x41000000 - 0x41800000;"

#define CONFIG_BOOTARGS      "console=ttyS0,115200 panic=5 rootwait root=/dev/mmcblk0p2 earlyprintk rw  vt.global_cursor_default=0"

在这里插入图片描述

b、在U-Boot中设置:

setenv bootargs 'cconsole=ttyS0,115200 panic=5 rootwait root=/dev/mmcblk0p2 earlyprintk rw  vt.global_cursor_default=0'
setenv bootcmd 'fatload mmc 0:1 0x41800000 sun8i-v3s-licheepi-zero.dtb;fatload mmc 0:1 0x41000000 zImage;bootz 0x41000000 - 0x41800000'
saveenv

4、烧录到TF卡中:

sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8

在当前目录下生成了u-boot-sunxi-with-spl.bin,将其烧录到8K偏移处启动。

5、U-Boot文件结构:

├── api                存放uboot提供的API接口函数
├── arch               平台相关的部分我们只需要关心这个目录下的ARM文件夹
│   ├──arm
│   │   └──cpu
│   │   │   └──armv7
│   │   └──dts   
│   │   │   └──*.dts   存放设备的dts,也就是设备配置相关的引脚信息
├── board              对于不同的平台的开发板对应的代码
├── cmd                顾名思义,大部分的命令的实现都在这个文件夹下面。
├── common             公共的代码
├── configs            各个板子的对应的配置文件都在里面,我们的Lichee配置也在里面
├── disk               对磁盘的一些操作都在这个文件夹里面,例如分区等。
├── doc                参考文档,这里面有很多跟平台等相关的使用文档。
├── drivers            各式各样的驱动文件都在这里面
├── dts                一种树形结构(device tree)这个应该是uboot新的语法
├── examples           官方给出的一些样例程序
├── fs                 文件系统,uboot会用到的一些文件系统
├── include            头文件,所有的头文件都在这个文件夹下面
├── lib                一些常用的库文件在这个文件夹下面  
├── Licenses           这个其实跟编译无关了,就是一些license的声明
├── net                网络相关的,需要用的小型网络协议栈
├── post               上电自检程序
├── scripts            编译脚本和Makefile文件
├── spl                second program loader,即相当于二级uboot启动。
├── test               小型的单元测试程序。
└── tools              里面有很多uboot常用的工具。

6、U-Boot配置:

a、U-Boot配置:

make ARCH=arm menuconfig

在这里插入图片描述

b、Architecture select架构选择:

在这里插入图片描述

c、ARM architecture:

在这里插入图片描述

d、LCD配置:

[*] Enable graphical uboot console on HDMI, LCD or VGA   这个就是在显示设备上使能串口控制                                    
[ ] VGA via LCD controller support   使能支持VGA通过LCD的控制器,就是LCD和VAG转换需要的控制器       
(x:800,y:480,depth:18,pclk_khz:33000,le:87,ri:40,up:31,lo:13,hs:1,vs:1,sync:3,vmode:0) LCD pane
> 该选项就是配置LCD的分辨率的配置选项可以看到x是800 y是480 等等一些关于LCD的配置内容,点击回车进去可以对其进行修改。                          
(1)   LCD panel display clock phase   这个是LCD的显示时钟相位
()    LCD panel power enable pin      LCD的电源使能引脚
()    LCD panel reset pin             LCD的复位引脚          
(PB4) LCD panel backlight pwm pin     背光PWN引脚 这个应该是调节亮度的引脚PB4
[*]   LCD panel backlight pwm is inverted            反转PWN背光引脚
[ ]   LCD panel needs to be configured via i2c                        
    LCD panel support (Generic parallel interface LCD panel)  --->     这个选择支持的LCDpanel
            (X) Generic parallel interface LCD panel    这里选择支持通用的并行的LCD接口
            ( ) Generic lvds interface LCD panel        这个是LVDS接口
            ( ) MIPI 4-lane, 513Mbps LCD panel via SSD2828 bridge chip 
            ( ) eDP 4-lane, 1.62G LCD panel via ANX9804 bridge chip    
            ( ) Hitachi tx18d42vm LCD panel                            
            ( ) tl059wv5c0 LCD panel         
(0) GMAC Transmit Clock Delay Chain        

e、时钟频率设置:

在这里插入图片描述

f、开机等待时间设置(以s为单位):

在这里插入图片描述

g、SPL设置:

SPL / TPL ---> 这个就是SPL相关的配置了
[*]   MMC raw mode: by sector                       按扇区      
(0x50)  Address on the MMC to load U-Boot from  mmc加载uboot的地址
[*] Support GPIO                                 支持GPIO
[*] Support I2C                                 支持I2C
[*] Support common libraries                    支持通用lib
[*] Support disk paritions                      支持分区
[*] Support generic libraries                   支持一般lib库
[*] Support MMC                                 支持MMC
[*] Support power drivers                  支持电源驱动
[*] Support serial                               支持串口

7、U-Boot适配Ethernet:

a、配置菜单:

Device Drivers ---->[* ]Network device suppoty ------>[*] Allwinner Sun8i Ethernet MAC support

b、修改设备树文件:

sun8i-v3s-licheepi-zero.dts:

/dts-v1/;
#include "sun8i-v3s.dtsi"
#include "sunxi-common-regulators.dtsi"

/ {
	model = "Lichee Pi Zero";
	compatible = "licheepi,licheepi-zero", "allwinner,sun8i-v3s";

	aliases {
		/**添加以下程序**/
		ethernet0 = &emac;
		serial0 = &uart0;
	};

	chosen {
		stdout-path = "serial0:115200n8";
	};
};

&mmc0 {
	pinctrl-0 = <&mmc0_pins_a>;
	pinctrl-names = "default";
	broken-cd;
	bus-width = <4>;
	vmmc-supply = <&reg_vcc3v3>;
	status = "okay";
};

&uart0 {
	pinctrl-0 = <&uart0_pins_a>;
	pinctrl-names = "default";
	status = "okay";
};

/**添加以下程序**/
&emac{
        phy = <&phy0>;
        phy-mode = "mii";
        allwinner,use-internal-phy;
        allwinner,leds-active-low;
        status = "okay";
        phy0: ethernet-phy@0 {
               reg = <1>;
		};
};

&usb_otg {
	dr_mode = "otg";
	status = "okay";
};

&usbphy {
	usb0_id_det-gpio = <&pio 5 6 GPIO_ACTIVE_HIGH>;
	status = "okay";
};

sun8i-v3s.dtsi:

#include <dt-bindings/clock/sun8i-v3s-ccu.h>
#include <dt-bindings/reset/sun8i-v3s-ccu.h>
#include <dt-bindings/interrupt-controller/arm-gic.h>
#include <dt-bindings/pinctrl/sun4i-a10.h>

/ {
	#address-cells = <1>;
	#size-cells = <1>;
	interrupt-parent = <&gic>;

	cpus {
		#address-cells = <1>;
		#size-cells = <0>;

		cpu@0 {
			compatible = "arm,cortex-a7";
			device_type = "cpu";
			reg = <0>;
			clocks = <&ccu CLK_CPU>;
		};
	};

	timer {
		compatible = "arm,armv7-timer";
		interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
			     <GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
			     <GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
			     <GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>;
	};

	clocks {
		#address-cells = <1>;
		#size-cells = <1>;
		ranges;

		osc24M: osc24M_clk {
			#clock-cells = <0>;
			compatible = "fixed-clock";
			clock-frequency = <24000000>;
			clock-output-names = "osc24M";
		};

		osc32k: osc32k_clk {
			#clock-cells = <0>;
			compatible = "fixed-clock";
			clock-frequency = <32768>;
			clock-output-names = "osc32k";
		};
	};

	soc {
		compatible = "simple-bus";
		#address-cells = <1>;
		#size-cells = <1>;
		ranges;
		/**添加以下程序**/
		syscon: syscon@01c00000 {
                       compatible = "allwinner,sun8i-h3-syscon","syscon";
                       reg = <0x01c00000 0x34>;
               };

		mmc0: mmc@01c0f000 {
			compatible = "allwinner,sun7i-a20-mmc";
			reg = <0x01c0f000 0x1000>;
			clocks = <&ccu CLK_BUS_MMC0>,
				 <&ccu CLK_MMC0>,
				 <&ccu CLK_MMC0_OUTPUT>,
				 <&ccu CLK_MMC0_SAMPLE>;
			clock-names = "ahb",
				      "mmc",
				      "output",
				      "sample";
			resets = <&ccu RST_BUS_MMC0>;
			reset-names = "ahb";
			interrupts = <GIC_SPI 60 IRQ_TYPE_LEVEL_HIGH>;	
			status = "disabled";
			#address-cells = <1>;
			#size-cells = <0>;
		};

		mmc1: mmc@01c10000 {
			compatible = "allwinner,sun7i-a20-mmc";
			reg = <0x01c10000 0x1000>;
			clocks = <&ccu CLK_BUS_MMC1>,
				 <&ccu CLK_MMC1>,
				 <&ccu CLK_MMC1_OUTPUT>,
				 <&ccu CLK_MMC1_SAMPLE>;
			clock-names = "ahb",
				      "mmc",
				      "output",
				      "sample";
			resets = <&ccu RST_BUS_MMC1>;
			reset-names = "ahb";
			interrupts = <GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>;
			status = "disabled";
			#address-cells = <1>;
			#size-cells = <0>;
		};

		mmc2: mmc@01c11000 {
			compatible = "allwinner,sun7i-a20-mmc";
			reg = <0x01c11000 0x1000>;
			clocks = <&ccu CLK_BUS_MMC2>,
				 <&ccu CLK_MMC2>,
				 <&ccu CLK_MMC2_OUTPUT>,
				 <&ccu CLK_MMC2_SAMPLE>;
			clock-names = "ahb",
				      "mmc",
				      "output",
				      "sample";
			resets = <&ccu RST_BUS_MMC2>;
			reset-names = "ahb";
			interrupts = <GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>;
			status = "disabled";
			#address-cells = <1>;
			#size-cells = <0>;
		};

		usb_otg: usb@01c19000 {
			compatible = "allwinner,sun8i-h3-musb";
			reg = <0x01c19000 0x0400>;
			clocks = <&ccu CLK_BUS_OTG>;
			resets = <&ccu RST_BUS_OTG>;
			interrupts = <GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>;
			interrupt-names = "mc";
			phys = <&usbphy 0>;
			phy-names = "usb";
			extcon = <&usbphy 0>;
			status = "disabled";
		};

		usbphy: phy@01c19400 {
			compatible = "allwinner,sun8i-v3s-usb-phy";
			reg = <0x01c19400 0x2c>,
			      <0x01c1a800 0x4>;
			reg-names = "phy_ctrl",
				    "pmu0";
			clocks = <&ccu CLK_USB_PHY0>;
			clock-names = "usb0_phy";
			resets = <&ccu RST_USB_PHY0>;
			reset-names = "usb0_reset";
			status = "disabled";
			#phy-cells = <1>;
		};

		ccu: clock@01c20000 {
			compatible = "allwinner,sun8i-v3s-ccu";
			reg = <0x01c20000 0x400>;
			clocks = <&osc24M>, <&osc32k>;
			clock-names = "hosc", "losc";
			#clock-cells = <1>;
			#reset-cells = <1>;
		};

		rtc: rtc@01c20400 {
			compatible = "allwinner,sun6i-a31-rtc";
			reg = <0x01c20400 0x54>;
			interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>,
				     <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>;
		};

		pio: pinctrl@01c20800 {
			compatible = "allwinner,sun8i-v3s-pinctrl";
			reg = <0x01c20800 0x400>;
			interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>,
				     <GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>;
			clocks = <&ccu CLK_BUS_PIO>, <&osc24M>, <&osc32k>;
			clock-names = "apb", "hosc", "losc";
			gpio-controller;
			#gpio-cells = <3>;
			interrupt-controller;
			#interrupt-cells = <3>;
			
			/**添加以下程序**/
			emac_rgmii_pins: emac0@0 {
                allwinner,pins = "PD0", "PD1", "PD2", "PD3",
                                "PD4", "PD5", "PD7",
                                "PD8", "PD9", "PD10",
                                "PD12", "PD13", "PD15",
                                "PD16", "PD17";
                allwinner,function = "emac";
                allwinner,drive = <SUN4I_PINCTRL_40_MA>;
                allwinner,pull = <SUN4I_PINCTRL_NO_PULL>;
            };

			uart0_pins_a: uart0@0 {
				pins = "PB8", "PB9";
				function = "uart0";
				bias-pull-up;
			};

			mmc0_pins_a: mmc0@0 {
				pins = "PF0", "PF1", "PF2", "PF3",
				       "PF4", "PF5";
				function = "mmc0";
				drive-strength = <30>;
				bias-pull-up;
			};
		};

		timer@01c20c00 {
			compatible = "allwinner,sun4i-a10-timer";
			reg = <0x01c20c00 0xa0>;
			interrupts = <GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>,
				     <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>;
			clocks = <&osc24M>;
		};

		wdt0: watchdog@01c20ca0 {
			compatible = "allwinner,sun6i-a31-wdt";
			reg = <0x01c20ca0 0x20>;
			interrupts = <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>;
		};

		uart0: serial@01c28000 {
			compatible = "snps,dw-apb-uart";
			reg = <0x01c28000 0x400>;
			interrupts = <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>;
			reg-shift = <2>;
			reg-io-width = <4>;
			clocks = <&ccu CLK_BUS_UART0>;
			resets = <&ccu RST_BUS_UART0>;
			status = "disabled";
		};

		uart1: serial@01c28400 {
			compatible = "snps,dw-apb-uart";
			reg = <0x01c28400 0x400>;
			interrupts = <GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH>;
			reg-shift = <2>;
			reg-io-width = <4>;
			clocks = <&ccu CLK_BUS_UART1>;
			resets = <&ccu RST_BUS_UART1>;
			status = "disabled";
		};

		uart2: serial@01c28800 {
			compatible = "snps,dw-apb-uart";
			reg = <0x01c28800 0x400>;
			interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>;
			reg-shift = <2>;
			reg-io-width = <4>;
			clocks = <&ccu CLK_BUS_UART2>;
			resets = <&ccu RST_BUS_UART2>;
			status = "disabled";
		};

		/**添加以下程序**/
		emac: ethernet@1c30000 {
            compatible = "allwinner,sun8i-h3-emac";
            reg = <0x01c30000 0x104>, <0x01c00030 0x4>;
            reg-names = "emac", "syscon";
            interrupts = <GIC_SPI 82 IRQ_TYPE_LEVEL_HIGH>;
            resets = <&ccu RST_BUS_EMAC>, <&ccu RST_BUS_EPHY>;
            reset-names = "ahb", "ephy";
            clocks = <&ccu CLK_BUS_EMAC>, <&ccu CLK_BUS_EPHY>;
            clock-names = "ahb", "ephy";
            #address-cells = <1>;
            #size-cells = <0>;
            status = "disabled";
        };


		gic: interrupt-controller@01c81000 {
			compatible = "arm,cortex-a7-gic", "arm,cortex-a15-gic";
			reg = <0x01c81000 0x1000>,
			      <0x01c82000 0x1000>,
			      <0x01c84000 0x2000>,
			      <0x01c86000 0x2000>;
			interrupt-controller;
			#interrupt-cells = <3>;
			interrupts = <GIC_PPI 9 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>;
		};
	};
};

编译之后出现以下,则代表网卡可以使用:
在这里插入图片描述

c、设置网络:

setenv ipaddr 192.168.1.50				//开发板 ip 地址,可以不设置,使用 dhcp 命令来从路由器获取 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.4				//服务器 IP 地址,也就是 Ubuntu 主机 IP 地址,用于调试代码。
saveenv

8、小问题:

当出现以下情况,则说明网络正常:
在这里插入图片描述
当出现以下情况,则说明网络异常:
在这里插入图片描述
出现异常的原因之一是,当时使用的虚拟机,没有将网络设置为桥接模式,但是板子连接的是外部的路由器,由于网关不通,造成的网络不通,将虚拟机改成桥接模式之后,再进行ping,即可联通。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构从入门到入土——初识泛型

目录 一&#xff0c;包装类 1.基本数据类型和对应的包装类 2.装箱和拆箱 3.自动装箱和自动拆箱 二&#xff0c;什么是泛型&#xff1f; 三&#xff0c;引出泛型 语法 四&#xff0c;泛型类的使用 1.语法 2.类型推导(Type Inference) 五&#xff0c;裸类型(Raw Type) …

Mybatis的foreach标签的使用以及参数的含义

Mybatis的foreach标签的使用以及参数的含义 语法格式&#xff1a; 属性说明&#xff1a; collection属性的注意点&#xff1a;

【UE5.1】套用小白人蓝图,让玩家控制MetaHuman移动

效果 步骤 1. 新建一个工程&#xff0c;创建Basic关卡&#xff0c;添加第三人称游戏资源到内容浏览器 2. 打开Quixel Bridge 选择高质量&#xff0c;然后添加创建好的MetaHuman到内容浏览器 启用所有缺失 立即重启 添加完毕后内容浏览器会多出“MetaGumans”文件夹&#xff0…

字符处理 C语言xdoj52

问题描述 从键盘输入一个字符&#xff0c;若为小写字母&#xff0c;则输出其对应的大写字母&#xff1b;若为大写字母&#xff0c;则输出对应的小写字母&#xff1b;其他字符原样输出。 输入说明 输入一个字符 输出说明 输出一个字符 输入样例 样例1输入 a 样例…

再回首感知损失在low-level上的应用

《Perceptual Losses for Real-Time Style Transfer and Super-Resolution》是李飞飞团队在2016年发表于ECCV的文章。我近几年的工作中&#xff0c;所训练的模型都离不开感知损失。不得不感慨&#xff0c;大佬之所以是大佬&#xff0c;就是因为他们开创性的工作很多年后依然为人…

生成树基本实验

背景 某公司的二层交换网络中&#xff0c;为了提高网络可靠性&#xff0c;故在二层交换网络中增加冗余链路。为了阻 止冗余链路可能带来的广播风暴&#xff0c;MAC地址漂移等负面影响&#xff0c;需要在交换机之间部署生成树 协议。 实验 一.配置stp en 开启 stp en stp …

2021实战面试

1、Rem , em , px , % , vw 之间的区别 PX: px像素&#xff08;Pixel&#xff09;。相对长度单位。像素px是相对于显示器屏幕分辨率而言的。 em: 1,子元素字体大小的em是相对于父元素字体大小 2,元素的width/height/padding/margin用em的话是相对于该元素的font-size rem:1rem是…

计算机毕业设计 SpringBoot的供应商管理系统 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

Kafka-集群架构设计

Kafka的Zookeeper元数据梳理 zookeeper整体数据 Kafka将状态信息保存在Zookeeper中&#xff0c;这些状态信息记录了每个Kafka的Broker服务与另外的Broker服务 有什么不同。通过这些差异化的功能&#xff0c;共同体现出集群化的业务能力。这些数据&#xff0c;需要在集群中各个…

道路清障车行业分析:中国市场发展趋势研究

清障车全名为道路清障车&#xff0c;又称拖车、道路救援车、拖拽车&#xff0c;具有起吊、拽拉和托举牵引等多项功能&#xff0c;清障车主要用于道路故障车辆&#xff0c;城市违章车辆及抢险救援等。清障车按类别主要分为&#xff1a;拖吊连体型、拖吊分离型&#xff0c;一拖一…

leetcode---904. 水果成篮 -- 【滑动窗口/c++】

原题&#xff1a;904. 水果成篮 - 力扣&#xff08;LeetCode&#xff09; 题目解析&#xff1a; 本题中的fruit数组中的元素表示的是数的种类。如示例1&#xff0c;fruit【1,2,1】就表示下标0处有1号类型的树&#xff0c;下标1处有2号类型的树&#xff0c;下标2处有1号类型的…

智能优化算法应用:基于狮群算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于狮群算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于狮群算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.狮群算法4.实验参数设定5.算法结果6.参考文献7.MA…

TSINGSEE青犀基于EasyCVR与AI技术的高校实验室视频可视化监管方案

一、行业背景 实验室作为科研、教学过程中的一个重要场所&#xff0c;其管理也十分至关重要。尤其是高校实验室安全问题&#xff0c;教育部《高等学校实验室安全规范》中说明&#xff0c;需要进一步加强高校实验室的安全管理工作&#xff0c;实现规范化、常态化的管理体制&…

C++ Qt开发:如何使用信号与槽

在Qt中&#xff0c;信号与槽&#xff08;Signal and Slot&#xff09;是一种用于对象之间通信的机制。是Qt框架引以为傲的一项机制&#xff0c;它带来了许多优势&#xff0c;使得Qt成为一个强大且灵活的开发框架之一。信号与槽的关联通过QObject::connect函数完成。这样的机制使…

【Linux】:线程(二)互斥

互斥与同步 一.线程的局部存储二.线程的分离三.互斥1.一些概念2.上锁3.锁的原理4.死锁 一.线程的局部存储 例子 可以看到全局变量是所有线程共享的&#xff0c;如果我们想要每个线程都单独访问g_val怎么办呢&#xff1f;其实我们可以在它前面加上__thread修饰。 这就相当于把g…

leetcode -- 209 长度最小的子数组[滑动窗口/c++]

原题链接&#xff1a;209. 长度最小的子数组 - 力扣&#xff08;LeetCode&#xff09; 算法原理&#xff1a; 滑动窗口其实就是同向双指针&#xff0c;因为计算结果的单调性&#xff0c;在符合条件的情况下&#xff0c;左右指针不必往回回溯&#xff0c;而实现优化的效果。 滑…

Python type函数:动态创建类

之前学习过使用 type() 函数可以查看变量的类型&#xff0c;但如果想使用 type() 直接查看某个类的类型呢&#xff1f;看如下程序&#xff1a; class Role:pass r Role() # 查看变量r的类型 print(type(r)) # <class __main__.Role> # 查看Role类本身的类型 print(type(…

SpringBoot之数组,集合,日期参数的详细解析

1.4 数组集合参数 数组集合参数的使用场景&#xff1a;在HTML的表单中&#xff0c;有一个表单项是支持多选的(复选框)&#xff0c;可以提交选择的多个值。 多个值是怎么提交的呢&#xff1f;其实多个值也是一个一个的提交。 后端程序接收上述多个值的方式有两种&#xff1a; 数…

打造绿色计算数智动力 HashData 入选“绿色计算最具价值解决方案”

12月13日-14日&#xff0c;由绿色计算产业联盟(GCC)、边缘计算产业联盟&#xff08;ECC&#xff09;联合举办“2023计算产业生态大会”&#xff08;CIEC 2023&#xff09;在北京举行。作为计算领域的权威会议&#xff0c;本次大会邀请了多位两院院士、众多产业专家&#xff0c;…

Python自动化测试系列[v1.0.0][多种数据驱动实现附源码]

前情提要 请确保已经熟练掌握元素定位的常用方法及基本支持&#xff0c;请参考Python自动化测试系列[v1.0.0][元素定位] 数据驱动测试是自动化测试中一种重要的设计模式&#xff0c;这种设计模式可以将测试数据和测试代码分开&#xff0c;实现数据与代码解耦&#xff0c;与此同…