<Linux开发>系统移植 -之- linux内核移植过程详细记录(第二部分完结)

2023-11-13

<Linux开发>系统移植 -之- linux内核移植过程详细记录(第二部分完结)

前面,第一部分讲解了,NXP官方原厂的Linux直接编译下载到开发板的操作过程,及测试效果。以及过程中设计使用的一些辅助工具。从第一部分,可以熟悉整个Linux编译到下载运行的流程,方便接下来的移植操作。

uboot移植可参考一下:

<Linux开发> -之-系统移植 uboot移植过程详细记录(第一部分)
<Linux开发> -之-系统移植 uboot移植过程详细记录(第二部分)
<Linux开发> -之-系统移植 uboot移植过程详细记录(第三部分)(uboot移植完结)

Linux内核及设备树移植可参考一下:
<Linux开发>系统移植 -之- linux内核移植过程详细记录(第一部分)

本次为Linux系统移植中Linux移植的第二部分,主要讲解NXP原厂Linux移植到正点原子Linux开发板的过程,并记录。操作流程均参考正点原子官方Linux开发手册,如有讲解不详细、错误、遗漏之处,可联系作者修改补充,也可参考正点原子官方资料。
联系方式QQ:759521350

注:作者采用的是正点原子的IMX6ULL-EMMC版本的Linux开发板。

接下来讲解主要过程记录。

一、在Linux源码内添加使用的开发板型号
1、添加开发板默认配置文件
(1)将之前第一部分解压后的文件夹,复制一份,并重命名为“linux-imx-onefu”
命令:

cp linux-imx-rel_imx_4.1.15_2.1.0_ga_onefu/ linux-imx-onefu -rf

在这里插入图片描述
(2)添加所用开发板的默认配置文件
将arch/arm/configs目录下的imx_v7_mfg_defconfig重新复制一份,命名为imx_onefu_emmc_defconfig,命令如下:

cd arch/arm/configs/
cp imx_v7_mfg_defconfig  imx_onefu_emmc_defconfig

在这里插入图片描述
后续开发中,imx_onefu_emmc_defconfig就做为正点原子Linux-emmc开发板的配置文件。

(3)添加所用开发板的设备树文件
添加开发板的设备树文件,进入目录arch/arm/boot/dts中,复制一份imx6ull-14x14-evk.dts,然后将其重命名为imx6ull-onefu-emmc.dts,命令如下:

cd arch/arm/boot/dts/
cp imx6ull-14x14-evk.dts imx6ull-onefu-emmc.dts

在这里插入图片描述
.dts是设备树源码文件,编译Linux的时候会将其编译为.dtb文件。

二、移植文件修改
1、设备树文件修改
使用VScode打开,找到路径下“arch/arm/boot/dts/Makefile”,这个文件,在找到“dtb-$(CONFIG_SOC_IMX6ULL)”配置项。添加一下内容:

imx6ull-onefu-emmc.dtb \

如下图示,此句就是前面添加的“imx6ull-onefu-emmc.dts”设备树文件,编译后生成.dtb的设备树文件,将.dtb设备树文件下载到Linux开发板使用。
注意:要有斜杠…
在这里插入图片描述

2、修改脚本文件
测试NXP原厂Linux时写的脚本“imx6ull_onefu_emmc.sh”如下:
在这里插入图片描述
移植到开发板后,修改后如下:
在这里插入图片描述

3、主频修改
根据正点原子官方文档介绍,正点原子I.MX6U-ALPHA开发板所使用的I.MX6ULL芯片主频都是792MHz的,也就是NXP官方宣传的800MHz版本。
接下来就修改CPU的工作频率。
打开 “arch/arm/configs/imx_onefu_emmc_defconfig”,找到下面几句:

CONFIG_CPU_FREQ_GOV_POWERSAVE=y //使能powersave策略
CONFIG_CPU_FREQ_GOV_USERSPACE=y //使能userspace策略
CONFIG_CPU_FREQ_GOV_ONDEMAND=y  //配置ondemand为默认调频策略。
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y//直接上最高频率,然后看CPU负荷慢慢降低

在这里插入图片描述
查看是否存在“ CONFIG_CPU_FREQ_GOV_ONDEMAND=y”,如果没有,则添加,否则不做修改。

根据具体打开的文件查看配置,**正点原子官方指导手册此处和上图不一样,**所以需要按照上述添加对应语句。但是本次操作查看,配置已经存在“ CONFIG_CPU_FREQ_GOV_ONDEMAND=y”,所以无需更改。
正点原子手册截图如下:
在这里插入图片描述

4、使能8线EMMC驱动
Linux内核驱动里面EMMC默认是4线模式的,4线模式肯定没有8线模式的速度快,由于正点原子的Linux开发板上EMMC采用的是8线模式,所以我们需要将EMMC的驱动修改为8线模式。修改方法很简单,直接修改设备树即可,打开文件imx6ull-onefu-emmc.dts,找到如下所示内容:

&usdhc2 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_usdhc2>;
	non-removable;
	status = "okay";
};

在这里插入图片描述
修改后如下:

&usdhc2 {
	pinctrl-names = "default", "state_100mhz", "state_200mhz";
	pinctrl-0 = <&pinctrl_usdhc2_8bit>; 
	pinctrl-1 = <&pinctrl_usdhc2_8bit_100mhz>;
	pinctrl-2 = <&pinctrl_usdhc2_8bit_200mhz>;
	bus-width = <8>;
	non-removable;
	status = "okay";
};

在这里插入图片描述
5、修改网络驱动
Linux驱动开发的时候要用到网络调试驱动,所以必须要把网络驱动调试好。在讲解uboot移植的时候就已经说过了,正点原子开发板的网络和NXP官方的网络硬件上不同,网络PHY芯片由KSZ8081换为了LAN8720A,两个网络PHY芯片的复位IO也不同。所以Linux内核自带的网络驱动是驱动不起来I.MX6U-ALPHA开发板上的网络的,需要做修改。

(1)修改LAN8720的复位以及网络时钟引脚驱动
打开“arch/arm/boot/dts/imx6ull-onefu-emmc.dts”

a.删除NXP原厂旧的网络引脚配置
删除下面截图红色标框部分:
在这里插入图片描述
在这里插入图片描述
b.添加正点原子Linux开发板网络引脚
在imx6ull-onefu-emmc.dts里面找到名为“iomuxc_snvs”的节点(就是直接搜索),然后在此节点下添加网络复位引脚信息,添加完成以后的“iomuxc_snvs”的节点内容如下:

&iomuxc_snvs {
	pinctrl-names = "default_snvs";
        pinctrl-0 = <&pinctrl_hog_2>;
        imx6ul-evk {
		省略..........................
		/*enet1 reset water*/ 
		pinctrl_enet1_reset: enet1resetgrp {
				fsl,pins = <
				/* used for enet1 reset */ 
				MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x10B0
				>;
		}; 
		/*enet2 reset water*/ 
		pinctrl_enet2_reset: enet2resetgrp {
				fsl,pins = <
				/* used for enet12 reset */ 
				MX6ULL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x10B0	
				>;
		}; 

修改一下ENET1和ENET2的网络时钟引脚配置,继续在imx6ull-onefu-emmc.dts中找到,修改后如下所示代码:
在这里插入图片描述
(2)修改fec1和fec2节点的pinctrl-0属性
在imx6ull-alientek-emmc.dts文件中找到名为“fec1”和“fec2”的这两个节点,修改其中的“pinctrl-0”属性值,修改后如下:
在这里插入图片描述
(3)修改LAN8720A的PHY地址
ENET1的LAN8720A地址为0x0,ENET2的LAN8720A地址为0x1;在imx6ull-alientek-emmc.dts中找到节点fec1和fec2,修改后如下所示:

&fec1 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_enet1
				&pinctrl_enet1_reset>;
	phy-mode = "rmii";
	phy-handle = <&ethphy0>;
	phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;
	phy-reset-duration = <200>;
	status = "okay";
};

&fec2 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_enet2
				&pinctrl_enet2_reset>;
	phy-mode = "rmii";
	phy-handle = <&ethphy1>;
	phy-reset-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;
	phy-reset-duration = <200>;
	status = "okay";

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

		ethphy0: ethernet-phy@0 {
			compatible = "ethernet-phy-ieee802.3-c22";
			smsc,disable-energy-detect;
			reg = <0>;
		};

		ethphy1: ethernet-phy@1 {
			compatible = "ethernet-phy-ieee802.3-c22";
			smsc,disable-energy-detect; 
			reg = <1>;
		};
	};
};

在这里插入图片描述
第177和178行,添加了ENET1网络复位引脚所使用的IO为GPIO5_IO07,低电平有效。复位低电平信号持续时间为200ms。
第188和189行,ENET2网络复位引脚所使用的IO为GPIO5_IO08,同样低电平有效,持续时间同样为200ms。
第198和204行,“smsc,disable-energy-detect”表明PHY芯片是SMSC公司的,这样Linux内核就会找到SMSC公司的PHY芯片驱动来驱动LAN8720A。
第196行,注意“ethernet-phy@”后面的数字是PHY的地址,ENET1的PHY地址为0,所以“@”后面是0(默认为2)。
第199行,reg的值也表示PHY地址,ENET1的PHY地址为0,所以reg=0。
第202行,ENET2的PHY地址为1,因此“@”后面为1。
第205行,因为ENET2的PHY地址为1,所以reg=1。
至此,LAN8720A的PHY地址就改好了,保存一下imx6ull-alientek-emmc.dts文件。然后使用“make dtbs”命令重新编译一下设备树。
(4)修改fec_main.c文件
要在I.MX6ULL上使用LAN8720A,需要修改一下Linux内核源码,打开drivers/net/ethernet/freescale/fec_main.c,找到函数fec_probe,在fec_probe中加入如下代码:

/* 设置MX6UL_PAD_ENET1_TX_CLK和MX6UL_PAD_ENET2_TX_CLK 
 * 这两个IO的复用寄存器的SION位为1。 
 */
	void __iomem *IMX6U_ENET1_TX_CLK;	//定义映射后的地址指针
	void __iomem *IMX6U_ENET2_TX_CLK;	//定义映射后的地址指针

	IMX6U_ENET1_TX_CLK = ioremap(0X020E00DC, 4);	//映射地址
	writel(0X14, IMX6U_ENET1_TX_CLK);				//写寄存器数据

	IMX6U_ENET2_TX_CLK = ioremap(0X020E00FC, 4);	//映射地址
	writel(0X14, IMX6U_ENET2_TX_CLK);				//写寄存器数据

在这里插入图片描述
第3455~3462就是新加入的代码,如果要在I.MX6ULL上使用LAN8720A就需要设置ENET1和ENET2的TX_CLK引脚复位寄存器的SION位为1。

6、配置Linux内核,使能LAN8720驱动
输入命令“make menuconfig”,打开图形化配置界面,选择使能LAN8720A的驱动,路径如下:

-> Device Drivers
 -> Network device support 
  -> PHY Device support and infrastructure 
   -> Drivers for SMSC PHYs

在这里插入图片描述
选中“Drivers for SMSC PHYs”后,按“y”,按下后,选项的前面中括号内会出现*,LAN8720A是SMSC公司出品的,因此勾选这个以后就会编译LAN8720驱动,配置好以后,通过键盘上的“→”,移动到“Save”,然后按下回车键,在弹出的对话框输入“arch/arm/configs/imx_onefu_emmc_defconfig ”,然后选择“OK”。退出配置界面,然后重新编译一下Linux内核。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7、修改smsc.c文件
需要找到LAN8720A的驱动文件,LAN8720A的驱动文件是drivers/net/phy/smsc.c,在此文件中有个叫做smsc_phy_reset的函数,看名字都知道这是SMSC PHY的复位函数,因此,LAN8720A肯定也会使用到这个复位函数,修改此函数的内容,修改以后的smsc_phy_reset函数内容如下所示:

static int smsc_phy_reset(struct phy_device *phydev)
{
	int err, phy_reset;
	int msec = 1;
	struct device_node *np;
	int timeout = 50000;
	if(phydev->addr == 0) /* FEC1 */ {
		np = of_find_node_by_path("/soc/aips-bus@02100000/ethernet@ 02188000");	/*查找设备节点*/
		if(np == NULL) {
			return -EINVAL;
		}
	}

	if(phydev->addr == 1) /* FEC2 */ {
		np = of_find_node_by_path("/soc/aips-bus@02000000/ethernet@ 020b4000"); /*查找设备节点*/
		if(np == NULL) {
			return -EINVAL;
		}
	}

	err = of_property_read_u32(np, "phy-reset-duration", &msec);		/*读取只有一个整形值的属性*/
	/* A sane reset duration should not be longer than 1s */
	if (!err && msec > 1000)
		msec = 1;
	phy_reset = of_get_named_gpio(np, "phy-reset-gpios", 0);
	if (!gpio_is_valid(phy_reset))
		return; 
	gpio_direction_output(phy_reset, 0);		/*设置GPIO的输出方向-0:输出*/
	gpio_set_value(phy_reset, 0);				/*设置GPIO的为0*/
	msleep(msec); 								/*延时1ms*/
	gpio_set_value(phy_reset, 1);				/*设置GPIO的为1*/

	int rc = phy_read(phydev, MII_LAN83C185_SPECIAL_MODES);
	if (rc < 0)
		return rc;

	/* If the SMSC PHY is in power down mode, then set it
	 * in all capable mode before using it.
	 */
	if ((rc & MII_LAN83C185_MODE_MASK) == MII_LAN83C185_MODE_POWERDOWN) {
		int timeout = 50000;

		/* set "all capable" mode and reset the phy */
		rc |= MII_LAN83C185_MODE_ALL;
		phy_write(phydev, MII_LAN83C185_SPECIAL_MODES, rc);
		phy_write(phydev, MII_BMCR, BMCR_RESET);

		/* wait end of reset (max 500 ms) */
		do {
			udelay(10);
			if (timeout-- == 0)
				return -1;
			rc = phy_read(phydev, MII_BMCR);
		} while (rc & BMCR_RESET);
	}
	return 0;
}

在这里插入图片描述
第7~12行,获取FEC1网卡对应的设备节点。
第14~19行,获取FEC2网卡对应的设备节点。
第21行,从设备树中获取“phy-reset-duration”属性信息,也就是复位时间。
第25行,从设备树中获取“phy-reset-gpios”属性信息,也就是复位IO。
第29~32行,设置PHY的复位IO,复位LAN8720A。
第41~48行,以前的smsc_phy_reset函数会判断LAN8720是否处于Powerdown模式,只有处于Powerdown模式的时候才会软复位LAN8720。这里我们将软复位代码移出来,这样每次调用smsc_phy_reset函数LAN8720A都会被软复位。
最后我们还需要在drivers/net/phy/smsc.c文件中添加两个头文件,因为修改后的smsc_phy_reset函数用到了gpio_direction_output和gpio_set_value这两个函数,需要添加的头文件如下所示:

#include <linux/of_gpio.h> 
#include <linux/io.h> 

以上就是在NXP官方提供的Linux的基础上移植修改,移植符合正点原子的Linux开发板上的使用,移植修改后,接下来就是编译测试。

三、网络驱动测试
修改好设备树和Linux内核以后重新编译一下,得到新的zImage镜像文件和imx6ull-onefu-emmc.dtb设备树文件,使用网线将I.MX6U-ALPHA开发板的两个网口与路由器或者电脑连接起来,最后使用新的文件启动Linux内核。启动以后使用“ifconfig”命令查看一下当前活动的网卡有哪些,结果如下图所示:
将新得到的zImage 和imx6ull-onefu-emmc.dtb设备树文件放到tftp服务器设置的文件夹内,命令:

cd /home/water/linux/tftpboot    				//进入到tftp文件夹
cp /home/water/water/kernel/linux-imx-onefu/arch/arm/boot/zImage .  //复制镜像
cp /home/water/water/kernel/linux-imx-onefu/arch/arm/boot/dts/imx6ull-onefu-emmc.dtb  .   //复制设备树

在这里插入图片描述
启动开发板进入boot,并下载zImage 和imx6ull-onefu-emmc.dtb设备树文件
输入命令:

tftp 80800000 zImage
tftp 83000000 imx6ull-onefu-emmc.dtb
bootz 80800000 - 83000000

在这里插入图片描述

首先确保根文件系统已存在。。。。

使用“ifconfig”命令查看网卡。
在这里插入图片描述
如果没有活动的网卡,可使用如下命令查看存在的网卡:

ifconfig -a

然后使用如下命令启动网卡:

ifconfig eth0 up    //eth0表示启动的网卡名称
ifconfig eth1 up 

使用如下命令设置网卡的IP地址:

ifconfig eth0 192.168.1.145 
ifconfig eth1 192.168.1.146 

使用"ping"命令ping一下ubuntu主机,命令如下:

ping 192.168.144

在这里插入图片描述
可以看出,ping成功,说明网络驱动修改成功!我们在后面的构建根文件系统和Linux驱动开发中就可以使用网络调试代码啦。

关于Linux内核的移植就讲解到这里,简单总结一下移植步骤:
①、在Linux内核中查找可以参考的板子,一般都是半导体厂商自己做的开发板。
②、编译出参考板子对应的zImage和.dtb文件。
③、使用参考板子的zImage文件和.dtb文件在我们所使用的板子上启动Linux内核,看能否启动。
④、如果能启动的话就万事大吉,如果不能启动那就悲剧了,需要调试Linux内核。不过一般都会参考半导体官方的开发板设计自己的硬件,所以大部分情况下都会启动起来。启动Linux内核用到的外设不多,一般就DRAM(Uboot都初始化好的)和串口。作为终端使用的串口一般都会参考半导体厂商的Demo板。
⑤、修改相应的驱动,像NAND Flash、EMMC、SD卡等驱动官方的Linux内核都是已经提供好了,基本不会出问题。重点是网络驱动,因为Linux驱动开发一般都要通过网络调试代码,所以一定要确保网络驱动工作正常。如果是处理器内部MAC+外部PHY这种网络方案的话,一般网络驱动都很好处理,因为在Linux内核中是有外部PHY通用驱动的。只要设置好复位引脚、PHY地址信息基本上都可以驱动起来。
⑥、Linux内核启动以后需要根文件系统,如果没有根文件系统的话肯定会崩溃,所以确定Linux内核移植成功以后就要开始根文件系统的构建。

以上内容均参考正点原子linux开发板配套资料,如有不足,遗漏,错误之处,可联系作者,进一步改善。
如若获取更详细的资料可到正点原子官方网址下载。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

<Linux开发>系统移植 -之- linux内核移植过程详细记录(第二部分完结) 的相关文章

  • PHP 致命错误:未找到“MongoClient”类

    我有一个使用 Apache 的网站 代码如下 当我尝试访问它时 我在 error log 中收到错误 PHP Fatal Error Class MongoClient not found 以下是可能错误的设置 但我认为没有错误 php i
  • ansible 重新启动 2.1.1.0 失败

    我一直在尝试创建一个非常简单的 Ansible 剧本 它将重新启动服务器并等待它回来 我过去在 Ansible 1 9 上有一个可以运行的 但我最近升级到 2 1 1 0 并且失败了 我正在重新启动的主机名为 idm IP 为 192 16
  • Unix 命令列出包含字符串但*不*包含另一个字符串的文件

    如何递归查看包含一个字符串且不包含另一个字符串的文件列表 另外 我的意思是评估文件的文本 而不是文件名 结论 根据评论 我最终使用了 find name html exec grep lR base maps xargs grep L ba
  • 修改linux下的路径

    虽然我认为我已经接近 Linux 专业人士 但显然我仍然是一个初学者 当我登录服务器时 我需要使用最新版本的R 统计软件 R 安装在 2 个地方 当我运行以下命令时 which R I get usr bin R 进而 R version
  • 在 Linux 上更快地分叉大型进程?

    在现代 Linux 上达到与 Linux 相同效果的最快 最好的方法是什么 fork execve combo 从一个大的过程 我的问题是进程分叉大约 500MByte 大 并且一个简单的基准测试只能从进程中实现约 50 个分叉 秒 比较最
  • Android:ANT 构建失败,并显示 google-play-services-lib:“解析为没有项目的 project.properties 文件的路径”

    我正在尝试使用 ANT 构建我的应用程序 但在包含 google play services lib 库项目后 我惨遭失败 Step 1 我在 project properties 文件中设置了对库项目的引用 android library
  • Bash 解析和 shell 扩展

    我对 bash 解析输入和执行扩展的方式感到困惑 对于输入来说 hello world 作为 bash 中的参数传递给显示其输入内容的脚本 我不太确定 Bash 如何解析它 Example var hello world displaywh
  • 抑制 makefile 中命令调用的回显?

    我为一个作业编写了一个程序 该程序应该将其输出打印到标准输出 分配规范需要创建一个 Makefile 当调用它时make run gt outputFile应该运行该程序并将输出写入一个文件 该文件的 SHA1 指纹与规范中给出的指纹相同
  • 如何通过替换为空页映射来取消映射 mmap 文件

    Linux 用户空间有没有办法用空页面 映射自 dev null 或者可能是一个空页面 重复映射到从文件映射的页面的顶部 对于上下文 我想找到这个 JDK bug 的修复 https bugs openjdk java net browse
  • 跟踪 Linux 程序中活跃使用的内存

    我想跟踪各种程序在特定状态下接触了多少内存 例如 假设我有一个图形程序 最小化时 它可能会使用更少的内存 因为它不会重新绘制窗口 这需要读取图像和字体并执行大量库函数 这些对象仍然可以在内存中访问 但实际上并没有被使用 类似的工具top它们
  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel
  • 如何在bash中使用jq从变量中包含的json中提取值

    我正在编写一个 bash 脚本 其中存储了一个 json 值 现在我想使用 Jq 提取该 json 中的值 使用的代码是 json val code lyz1To6ZTWClDHSiaeXyxg redirect to http examp
  • 内核开发和 C++ [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 从我know https stackoverflow com questions 580292 what languages are windo
  • 为什么 Linux perf 使用事件 l1d.replacement 来处理 x86 上的“L1 dcache misses”?

    在英特尔 x86 上 Linux用途 https stackoverflow com a 52172985 149138事件l1d replacements来实施其L1 dcache load misses event 该事件定义如下 计数
  • 大多数 Linux 系统头文件与 C++ 兼容吗?

    大多数 Linux 系统头文件 API C 兼容吗 今天我试图做这样的事情 include
  • 我可以从命令行打印 html 文件(带有图像、css)吗?

    我想从脚本中打印带有图像的样式化 html 页面 谁能建议一个开源解决方案 我使用的是 Linux Ubuntu 8 04 但也对其他操作系统的解决方案感兴趣 你可以给html2ps http user it uu se jan html2
  • Linux中的定时器类

    我需要一个计时器来以相对较低的分辨率执行回调 在 Linux 中实现此类 C 计时器类的最佳方法是什么 有我可以使用的库吗 如果您在框架 Glib Qt Wx 内编写 那么您已经拥有一个具有定时回调功能的事件循环 我认为情况并非如此 如果您
  • 在哪里可以找到并安装 pygame 的依赖项?

    我对 Linux 比较陌生 正在尝试安装 python 的 pygame 开发环境 当我运行 setup py 时 它说我需要安装以下依赖项 我找到并安装了其中之一 SDL 然而 其他人则更加难以捉摸 Hunting dependencie
  • 域套接字“sendto”遇到“errno 111,连接被拒绝”

    我正在使用域套接字从另一个进程获取值 就像 A 从 B 获取值一样 它可以运行几个月 但最近 A 向 B 发送消息时偶尔会失败 出现 errno 111 连接被拒绝 我检查了B域套接字绑定文件 它是存在的 我也在另一台机器上做了一些测试 效
  • arm64和armhf有什么区别?

    Raspberry Pi Type 3 具有 64 位 CPU 但其架构不是arm64 but armhf 有什么区别arm64 and armhf armhf代表 arm hard float 是给定的名称Debian 端口 https

随机推荐

  • 内网穿透,外网进行访问本地。

    前言 内网穿透 就是可以本地进行搭建环境 外网进行访问地址 首先我们这边使用natapp进行内网穿透 https natapp cn 1 首先在本站注册账号 点击注册 2 登录后 点击左边 购买隧道 免费 付费均可 3 根据需要选择隧道协议
  • 关于用指针交换两个数

    关于用指针交换两个数 西邮Linux 兴趣小组又到了纳新季 作为一个老学长 面试学弟学妹们的时候 必然要然他们感受到小组的关怀 受尽折磨 这一届孩子还是挺强的 但是一到指针上就栽了坑 在加上我们小组的陈年老题swap屡试不爽 所以在这里总结
  • 机械电子工程中的计算机思维,人工智能技术在机械电子工程领域的应用

    鲁芸 朱慧 摘 要 目前 科学技术的不断发展 人工智能的发展也是一个快速发展的趋势 已被广泛应用于各个领域 机电工程的发展也将呈现出新的发展趋势 传统机械工程随着信息技术的融合 它逐渐向智能化方向发展 机电一体化工程与人工智能技术的融合主要
  • 紧急更新下降难度,《王者荣耀》绝悟 AI 难倒一片玩家

    By 超神经 内容概要 在 5 月 1 日 5 月 4 日期间 玩家通过 王者荣耀 最新版本客户端进入游戏 即可与绝悟 AI 对战 一时间哀鸿遍野 普通玩家 游戏主播 职业选手 纷纷表示被绝悟 AI 虐到体无完肤 关键词 王者荣耀 游戏AI
  • 《实时碰撞检测算法技术》读书笔记(七):分离轴测试

    分离轴测试基于凸体 给定两凸体集A和B 若两集合不存在交集 则必定存在一个轴使得两凸体投影无重叠 若找不到该轴 则两凸体集相交 对于对称几何体如线段 AABB OBB 球体等 其包含中心C且为投影轴上投影区间的中心位置 只需计算其投影区间的
  • Windows 下快速删除大量文件的办法

    本来觉得这么一件小事 没必要写个博客 不过搜了好多地方 竟然没有找到很好的解决方法 所以只好不走寻常路了 今天遇到这么一个问题 在学习用卷积神经网络进行特征和提取的时候 准备实验其中一个Demo 主要是进行猫狗图片识别 于是下载了一个包含猫
  • 前几篇的简要总结

    列表的内置方法 1 插入新元素 list1 append 100 将括号内的字符插入到列表末端 无论输入什么数据类型 都会转换成字符串 list1 insert 0 hello insert可以插入到列表的任意位置 所以要在括号内额外添加索
  • unef螺纹_收藏!英制螺纹详细说明

    一 严格地说 UN UNR UNC UNF UNS以及UNEF是螺纹系列的规定代号 而不是某些英文词组的缩写 统一螺纹 Unified Screw Threads 由英国 United Kingdom 加拿大 Canada 和美国 Unit
  • [HashMap源码学习之路]---数组扩容后元素的前后变化

    HashMap数组扩容后元素的前后变化 前一段时间看了HashMap 的扩容方法 觉得写的太好了 对我很有帮助 现以我理解的来写一下 主要说两方面 扩容后元素的位置 扩容后元素如何分布的 1 resize方法的源码 HashMap 中扩容方
  • ESP32的液晶中文显示

    上一篇简单说明了ESP32进行SSD1306的液晶显示 然后希望显示字符 使用前一篇的SSD1306是一个入门 但是不能显示中文 因此本篇主要演示显示中文 在arduino中有一个u8g2库 当时用UNO时使用过该库 但是用在ESP32上
  • 全国职业技能大赛云计算--高职组赛题卷①(私有云)

    全国职业技能大赛云计算 高职组赛题卷 私有云 第一场次题目 OpenStack平台部署与运维 任务1 基础运维任务 5分 任务2 OpenStack搭建任务 15分 任务3 OpenStack云平台运维 15分 任务4 OpenStack云
  • IDEA的下载、安装及配置

    IDEA的下载 安装及配置 IDEA简介 IDEA下载 安装 准备工作 IDEA工具下载 IDEA工具安装 IDEA工具启动 IDEA配置 IDEA基本配置 Appearance 显示 主题配置 关闭Intellij IDEA自动更新 Ke
  • 简易JDBC连接数据库

    简易JDBC连接数据库 1 导入jar包 首先在项目中创建lib文件包 在lib文件包中粘贴MySQL的jar包 将lib包添加为库 2 注册驱动 在类中注册驱动 Class forName com mysql jdbc Driver 提示
  • (Redis) 跳跃表(skiplist)实现原理

    跳跃表简介 跳跃表 skiplist 是一种随机化的数据 由 William Pugh 在论文 Skip lists a probabilistic alternative to balanced trees 中提出 跳跃表以有序的方式在层
  • PHP curl 获取返回的内容和头部信息示例

    请求示例 function curl res string url string data array header is post false is post false url 请求地址 token token 头部 header Co
  • WPA渗透-pyrit:GPU加速_Hash-table

    WPA渗透 pyrit GPU加速 Hash table 1 pyrit工具介绍 pyrit是一款开源且完全免费的软件 任何人都可以检查 复制或修改它 它在各种平台上编译和执行 包括FreeBSD MacOS X和Linux作为操作系统以及
  • 大学生数学竞赛习题精讲_陈兆斗

    大学生数学竞赛习题精讲 陈兆斗 链接 https pan baidu com s 1ctyZqmD 6VFgILBM0DiTcg 提取码 i76s 复制这段内容后打开百度网盘手机App 操作更方便哦
  • mysql用事务实现更新数据

    前言 在手动批量更新正式环境数据库时 建议使用事物进行更新 避免更错数据 造成不必要的麻烦 现表中有三条数据 使用事物批量将name字段为mgx phone字段为17837107346 所有数据中的address字段更新成河北唐山 开始事物
  • moco接口框架介绍

    moco接口框架介绍 Moco 是一个搭建模拟服务器的工具 其支持 API 和独立运行两种方式 前者通常是在 junit testng等测试框架中使用 后者则是通过运行一个 jar 包开启服务 在maven中央仓库中 moco有三个版本 分
  • <Linux开发>系统移植 -之- linux内核移植过程详细记录(第二部分完结)

    Linux开发 系统移植 之 linux内核移植过程详细记录 第二部分完结 前面 第一部分讲解了 NXP官方原厂的Linux直接编译下载到开发板的操作过程 及测试效果 以及过程中设计使用的一些辅助工具 从第一部分 可以熟悉整个Linux编译