正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-6.4--汇编LED驱动程序

 前言:

本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。

引用:

正点原子IMX6U仓库 (GuangzhouXingyi) - Gitee.com

《【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.5.2.pdf》第 8.1 章

《正点原子资料_A盘/02开发板原理图/IMX6ULL_MINI_V2.2(Mini底板原理图).pdf》

  • 资料盘 开发板资料链接: https://pan.baidu.com/s/1j5Jzbdx9i-g0cWIi3wf2XA 提取码:ag1u


正文:

本文是 “正点原子[第二期]Linux之ARM(MX6U)裸机篇--第6.4讲” 的读书笔记。第6.4讲是编译汇编 led.s 程序,并烧录到SD卡。

1. 编写汇编 led.s 程序

在之前的两节博文中,通过查看正点云子 I.MX6ULL ALPHA/Mini 开发板电路原理图,已经从"正点原子I.MX6ULL Mini"电路原理图中知道Mini开发板的 LED 灯接在 I.MX6ULL 芯片的 GPIO1_IO03 管脚。接下来,我们需要编写 led.s 汇编程序来配置 I.MX6ULL 芯片 GPIO1_IO03  GPIO 管脚,来让 gpio1_io03 输出高电平/低电平来控制LED灯的亮灭。

1.1 使用I.MX6ULL GPIO 的步骤

  1. 使能I.MX6ULL 芯片GPIO外设时钟,通过寄存器 CCM_CCGRx (x为从0~6,共7个 CCM_CCGRx寄存器)来使能I.MX6U芯片外设时钟。
  2. 配置IOMUXC_SW_MUX_CTL_PAD_CPIO1_IO03 寄存器来配置芯片IO 复用为 GPIO模式。
  3. 配置IOMUXC_SW_PAD_CTL_PAD_CPIO1_IO03 寄存器来配置芯片IO 的电气特性,如压摆率,速率,等。
  4. 在第2,3 两步复用IO为GPIO模式,并且配置了IO的电气特性图之后。写 GPIO 寄存器开控制GPIO是输入/输出,GPIO输出低电平/高电平。通过寄存器 GPIOx_DR,GPIOx_GDR 两个寄存器。

1.2 编写I.MX6U led.s 汇编程序使用芯片 GPIO 管脚

根据上面的分析,我们按照上面的4个步骤来变下 I.MX6U 的汇编 led.s 程序,通过控制I.MX6U 新品的 GPIO 引脚的方式开控制LED灯的亮灭。

1.2.1 配置 I.MX6U CCM_CCGRx 外设时钟寄存器

从《IMX6ULL参考手册.pdf》手册第18章描述了 I.MX6U 的外设时钟寄存器,打开 CCM_CCGRx 时钟寄存器为 32 位的寄存器,从参考手册中可以看到每2个bit控制一个外设的时钟是否打开,如果外设时钟关闭可以达到省电的效果。参考手册中共有CCM_CCGR0~CCM_CCGR6 共7个芯片外设时钟控制寄存器,为了简单方便起见我们在 led.s 汇编程序中使能所有的外设时钟,也让就是让 

CCM_CCGRx = 0xFFFF_FFFF

CCM_CCGRx 寄存器的地址需要从参考手册中查询。

从参考手册中可以查到 CCM_CCGR0 ~ CCM_CCGR6 寄存器的地址,通过 ARM 汇编指令 LDR, STR 来配置这些寄存器为0xFFFF_FFFF,来使能所有I.MX6U 芯片的所有外设时钟。对应寄存器的地址从 0x020C_4068 开始,到 0x020C_4080 结束。

    /* 使能所有 I.MX6U 芯片外设时钟 */ldr r0, =0x020C4068     @CCM_CCGR0ldr r1, =0xFFFFFFFF     @将0xFFFFFFFF写入CCM_CCGR0写入的数据str r1, [r0]ldr r0, =0x020C406C     @CCM_CCGR1str r1, [r0]ldr r0, =0x020C4070     @CCM_CCGR2str r1, [r0]ldr r0, =0x020C4074     @CCM_CCGR3str r1, [r0]ldr r0, =0x020C4078     @CCM_CCGR4str r1, [r0]ldr r0, =0x020C407C     @CCM_CCGR5str r1, [r0]ldr r0, =0x020C4080     @CCM_CCGR6str r1, [r0]
1.2.2 配置 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 寄存器,复用IO为GPIO

配置 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 寄存器,复用IO为GPIO。查阅参考手册,对应寄存器地址为 0x020E_0068 。

从参考手册可以看到,配置 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 的比特位 bit[3:0] = 0x5,复用该 IO 位 GPIO 模式。编写 led.s 汇编代码,配置如下

    /* 配置 GPIO1_IO03 PIN 复用为GPIO,也就是设置* IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 = 5* 寄存器地址为 0X020E_0068*/ldr r0, =0x020E0068     @IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03ldr r1, =0x5            @将0x5写入到 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 中str r1, [r0]
1.2.3 配置 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 寄存器,配置IO电气特性

配置 IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03 寄存器,复用IO为GPIO。查阅参考手册,对应寄存器地址为 0x020E_02F4 。

查阅参考手册,该寄存器的 bit[31:17]保留没有使用,bit[16:0] 这写bit位通过写对应bit位的值来设置IO的电气特性,例如,压摆率,速率,上拉/保持器,等IO的电气特性。对照这参考手册中 bit 位定义的物理电气特性,我们设置该 IO 的特性如下。

    /* 配置GPIO1_IO03 的电气属性(上下拉,偏摆率),也就是寄存器* IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03* IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03 寄存器地址为 0X020E_02F4*** bit0:          压摆率          值: 0       值含义:低速率* bit2-1:         保留未使用      值: NA      * bit5-3:         驱动能力        值: 110     值含义:R0/6 数值越小,驱动能里越强* bit7-6:         速率            值: 10      值含义:100MHz* bit 10-8:       保留未使用       值: NA * bit11:          开路输出         值: 0       值含义:关闭开路输出* bit12:          上拉/保持使能     值:1       值含义: 使能 Pull/Keeper* bit13:          上拉/保持选择     值: 0       值含义:选择Keeper* bit15-14:       设置上下拉电阻   值: 00       值含义: 100K Ohm Pull Down* bit16:          hyst磁滞(输入有效) 值:0      值含义: Hystersis Disable 磁滞关闭, 关闭Hys* bit31-17:       保留未使用 */

使用 Windows 自带的计算器,通过二进制模式上设置上相应的寄存器bit值为 0/1,来看下最终应该写到寄存器里的值。

按照我们预期的 IO 电气特性,设置了寄存器上对应bit位之后,得到需要写到寄存器里的值为 0x10B0。编写 led.s 汇编代码,配置如下

    ldr r0, =0x020E02F4ldr r1, =0x10B0str r1, [r0]
1.2.4  配置 GPIOx_DR, GPIOx_GDIR 寄存器

在前面第2,3 步配置 I.MX6U 的管脚,把 IO 复用为GPIO模式,并且设置 IO 的电气特性之后,现在 PAD_GPIO1_IO03 已经被配置为复用为 GPIO 管脚,并且配置了管脚的 IO 电气特性()包括压摆率,速率,上拉电阻,驱动能力)。现在可以开始配置 GPIO1 的GPIO特性,配置GPIO是输入还是输出,GPIO输出是低电平还是输出高电平。

《IMX6ULL参考手册.pdf》手册第28章给出了I.MX6U 芯片GPIO 的使用说明。I.MX6U 芯片的GPIO分为 GPIO0~GPIO5 共6组寄存器。

    @ I.MUX6U的GPIO一共有5组:GPIO1,GPIO2,GPIO2,GPIO4 和 GPIO5@ 其中GPIO1有32个IO@ GPIO2有22个IO@ GPIO3有29个IO@ GPIO4有29个IO@ GPIO5最少,只有12个IO@ 这样一共 124 个GPIO@@ 如果想要看每个 IO 能复用成什么外设,可以直接查阅 《I.MX6U参考手册》的第@4章 Chapter 4:External Signals and Pin Multipexing。

通过 GPIOx_DR (数据寄存器Data)可以配置 GPIO1 这一组 32 个 GPIO 的输出电平是高电平还是低电平。GPIO1_DR 寄存器为32位,每一位对应一个 GPIO,从 GPIO1_IO00,GPIO1_IO01,到 GPIO1_IO31。

参考手册中 给出了 GPIOx_DR, GPIOx_GDIR 寄存器的地址,通过写对应GPIOx_DR,GPIOx_GDR 寄存器的值,可以控制对应的GPIO寄存器是工作在输入模式还是输出模式,GPIO是输出高电平还是输出低电平。


GPIOx_GDIR 方向寄存器,控制GPIO是工作在输入模式,还是工作在输出模式:

    /* 设置 GPIO* 设置 GPIO1_GDIR寄存器,设置 设置 GPIO1_IO03 为输出* GPIO1_GDIR 寄存器地址为 0X209_C004,设置 GPIO1_IO03 寄存器 bit3为1* 也就是 GPIO1_IO03为输出*/ldr r0, =0X0209C004  @GPIO1_GDIRldr r1, =0x8         @bit3,从0开始例如GPIO1_IO00,GPIO1_IO01,GPIO1_IO02,GPIO1_IO03str r1, [r0]

 GPIOx_DR 数据寄存器,控制GPIO输出高电平还是输出低电平:

根据"正点原子I.MX6ULL Mini"电路原理图的电路原理图,当LED灯连接的 GPIO1_IO03 输出低电平是LED灯点亮。

    /* 打开LED,也就是设置GPIO1_IO03为0,也就是输出低电平,* 根据正点原子I.M6ULL Mini 开发板电路原理图,GPIO1_IO03 输出低电平* LED灯就打开.* GPIO1_DR 寄存器的地址为 0X0209_C000* GPIOQ_DR bit3 设置为0,输出低电平*/ldr r0, =0x0209C000ldr r1, =0x0str r1, [r0]

1.3 最终的 led.s 汇编程序

如下是正点原子提供了示例 led.s 汇编程序示例截图。

 我自己参考视频写的实力程序存放在 Gitee 代码仓库,可以通过如下链接访问。

led/led.s · iPickCan/imx6ull_mini - Gitee.com

2. 编译 led.s 汇编程序

2.1 arm-linux-gnueabihf-gcc 编译文件

使用ARM交叉编译工具 'arm-linux-gnueabihf-gcc' 编译 led.s 汇编程序,先将 led.s 编译为 .o 目标文件。

arm-linux-gnueabihf-gcc -g -c -o led.o led.s

上述命令将 led.s 编译为 led.o,其中 "-g" 选型是产生调试信息,GDB能够使用这些调试信息进行代码调试。"-c"是编译源文件生成 ".o" 文件,但是不链接。"-o"是指定编译产生的文件名,我们这里指定文件名为 led.o。执行上述编译之后会生成一个 led.o 文件

其中 led.o 文件不是我们可以现在到开发版中运行的文件,一个工程中所有的 C 文件和汇编文件都会编译生成一个对应的 .o 文件,我们需要将这些 .o 文件链接起来组合成可执行文件。

2.2 arm-linux-gnueabihf-ld 链接文件

arm-linux-gnueabihf-ld 用来将众多的 .o 文件链接到一个指定的链接为止。我们现在需要做的是就是确定一下本实验最终的可执行文件的起始地址,也就是链接地址。这里我们需要区分“存储地址”和“运行地址”这两个概念,存储地址就是可执行代码存储在哪里,可执行文件的存储地址可以随意选择。运行地址就是代码运行时所处的地址,这个我们链接的时候就已经确定好了,代码要运行,那就必须处于运行地址处,否则代码肯定会出错。比如 I.MX6U 支持 SD 卡,EMMC,NAND启动,因此代码可以存储到SD卡,EMMC,或者 NAND 中,但是要运行的话就必须将代码从SD卡,EMMC或者NAND中拷贝到其运行地址(链接地址)处,存储地址和运行地址可以一样,比如 STM32 的存储地址和运行起始地址都是 0x0800_0000。

本教程中的所有裸机程序都是烧写到 SD卡中,上电以后 I.MX6U 的内部 boot rom 程序会将可执行文件拷贝到链接地址处,这个链接地址可以在 I.MX6U 的内部 128KB RAM中 (0x0090_0000 ~ 0x0091_FFFF),也可以在外部的DDR中。本教程所有裸机例程的链接地址都在 DDR 中,链接的起始地址为 0x8780_0000。I.MX6U-ALPHA/Mini 开发板的DDR容量有两种:512MB和256MB,起始地址都是 0x8000_0000,只不过512MB的终止地市为 0x9FFF_FFFF (地址范围为: 0x8000_0000 ~ 0x9FFF_FFFF),而256MB容量的终止地址为 0x8FFF_FFFF (地址范围为: 0x8000_0000 ~ 0x8FFF_FFFF)。之所以选在 0x8780_0000 这个地址是因为后面要将的 Uboot 其连接地址就是 0x8780_0000 ,这样我们统一使用 0x8780_0000 这个链接地址,不容易记混。

确定了链接地址以后,就可以使用 am-linux-gnueabihf-ld 链将前面编译出来的 led.o 文件链接到 0x8780_0000 地址,使用如下命令:

arm-linux-gnueabihf-ld -Ttext 0x87800000 led.o -o led.elf

上述命令中 "-Ttext" 就是指定链接地址,"-o" 选项指定链接生成的 elf 文件名,我们这里命名为 led.elf。上数命令执行完成后,就会在工程目录下多了一个 led.elf 文件,如下所示:

led.elf 也不是我们最终烧写到SD卡中的可执行文件,我们需要烧写 bin 文件,因此还需要将 led.elf 转换为 .bin 文件格式,这里我们需要用到 arm-linux-gnueabihf-objcopy 这个工具。

2.3  arm-linux-gnueabihf-objcopy 格式转换

arm-linux-gnueabihy-objcopy 更像是一个格式转换工具,我们要将 led.elf 文件转换为 led.bin 文件,命令如下

arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
  • 上述命令中,"-O"选项执行以什么格式输出,后面的“binary”表示以二进制格式输出,
  • 选型"-S"表示不要复制源文件中的重定位信息和符号信息,"
  • -g"表示不复制源文件中的调试信息。

上面的命令执行完成以后,工程目录如下所示

2.4 arm-linux-gnueabihf-objdump 反汇编

大多数情况下我们都是用 C语言编写实验例程的,有时候需要查看器汇编代码来调试代码,因此就需要进行反汇编,一般可以将 elf 文件反汇编,比如如下命令:

arm-linux-gnueabihf-objdump -D led.elf > led.dis

上述代码中的“-D”选项表示反汇编所有的段,反汇编以后在当前目录下出现一个名为 led.dis 的文件,如下图所示

可以打开看一下 led.s 文件的内容,看看是不是汇编代码,如下图所示

从图中可以看出 led.dis 里面是汇编代码,而且还可以看到内存分配情况。在 0x8780_0000 处就是全局标号 _start,也就是程序开始的地方。通过 led.dis 这个反汇编文件可以明显的看出我们的代码已经链接到了 0x8780_0000 为起始地址的区域。

总结一下我们我了编译ARM开发板上的运行的 led.o 这个文件使用了如下命令

arm-linux-gnueabihf-gcc -c -o led.o led.s
arm-linux-gnueabihf-ld -Ttext 0x87800000 led.o -o led.elf
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
arm-linux-gnueabihf-objdump -D led.elf > led.dis

如果我们修改了 led.s 文件,那么juice需要再重复一次上面的命令,太麻烦了,这个时候我们就可以使用 Makefile 文件了。

2.5 创建 Makefile 文件

使用 "touch"命令在工程根目录下创建一个名字为“Makefile”的文件,创建后Makefile文件后,就需要根据Makefile的语法编写文件。Makefile文件内容如下:

led.bin : led.sarm-linux-gnueabihf-gcc -c -o led.o led.sarm-linux-gnueabihf-ld -Ttext 0x87800000 led.o -o led.elfarm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.binarm-linux-gnueabihf-objdump -D led.elf > led.disclean:rm -f *.o led.bin led.elf led.dis

创建好Makefile以后,我们值需要执行一次"make'命令就可以完成编译,如下图所示

如果要执行清理工作的话,执行 "make clnea",如下图所示

至此有关代码编译,arm-linux-gunueabihf-xxx 交叉编译器的的使用就到这里了,接下来我们讲解如何将 led.bin 烧写到 SD 卡中。

3. 代码烧写

虽然 I.MX6U 内部有 96KB 的 ROM,但是这 96KB 的 ROM 是 NXP 自己用的,不向用户开放。所以相当于 I.MX6U 是没有内部Flash的,但是我们代码需要有地方存放,为此,I.MX6U 支持从外置的 NOR Flash,NAND Flash,SD/EMMC,SPI NOR Flash 和 QSPIFlash这些存储介质中启动,所以我们可以将代码烧写到这些存储介质中。在这些存储介质中,除了SD卡以外,其它一般都是焊接到了开发吧班上的,我们没法直接烧写。但是 SD 卡是活动可插拔的,我们可以将SD卡查到电脑PC上,在电脑上使用软件将 .bin 文件烧写到SD卡中,然后插到开发板上就可以了。其它集中存储介质是我们量产的时候用到了,量产的时候代码就不可能放在SD卡里面了,毕竟SD卡是活动了,不牢固,而其它的都是焊接到板子上的,很牢固。

因此,我们的调试裸机和uboot的时候是将代码现在到SD卡中, 因为这样很方便,当调试完成后量产的时候要将裸机程序或者Uboot稍息到 SPI NOR Flash, EMMC, NAND 这些存储介质中。那么,如何将前面我们编译出来的 led.bin 烧写到 SD 卡中哪?肯定有人认为直接复制 led.bin 到 SD卡中不就行了,错!编译出来的可执行文件是怎么存放在SD卡中的,存放的位置是什么?这是是NXP有详细规定的!我们必须按照NXP的规定来将代码烧写到SD卡中,否则代码是绝对运行不起来的。

《IMX6UL 参考手册》的第 8 章“Chapter 8 System Boot”就是专门讲解 I.MX6U 启动的,我们下一章会详细的讲解 I.MX6U 启动方式的。

正点原子专门编写了一个软件来将编译出来的.bin文件烧写到SD卡中,这个软件叫做 "imxdownlaod" ,软件已经放到了开发光盘中,路径为开发板光盘->5、开发工具->2、Ubuntu 下裸机烧写软件->imxdownload, imxdownlaod 只能在 Ubuntu 下使用,使用步骤如下:
1. 讲 imxdownload 拷贝到工程目录下

我们要将 imxdownload 拷贝到工程目录下,也就是和 led.bin 处在同一个文件夹下,要不然会序烧写失败的,拷贝完成后如下图所示:

2. 给与imxdownload可执行权限

chmod 777 imxdownload

3. 确定要烧写的SD卡

准备一张新的SD卡,确保SD卡里面没有数据,因为我们再烧写代码的时候可能会格式化SD卡!

Ubuntu下所有设备都在目录 “/dev”里面,所以插上SD卡以后会出现在 "/dev”里面,其中存储设备都是以 "/dev/sd"开头的。物流门先看一下不插SD卡是电脑有哪些存储设备,以防插入SD卡后分不清楚谁是谁。输入命令

ls /dev/sd*

从图中可以看到当前电脑有/dev/sda、 /dev/sda1、 /dev/sda2 和/dev/sda5 这 5 个存储设备,使用读卡器将 SD 卡插到电脑,一定要确保 SD 卡是挂载到了 Ubuntu 系统中,而不是 Windows下。 SD 卡挂载到电脑以后, VMware 右下角会出现如图 8.4.3.4 所示图标

如图 8.4.3.4 所示,在 VMware 右小角有个图标看着像硬盘一样的图标: ,这个图标就表示当前有存储设备插入,我们将鼠标放上去就会有提示当前设备名字,比如我这里提示“Realtek USB3.0 Card Reader”,这是我的读卡器的名字。如果 是灰色的话就表示 SD 卡挂载到了 Windows 下,而不是 Ubuntu 上,所以我现在这个电脑的 SD 卡就是挂载到了 Windiows 下,我 肯定要将其挂载到 Ubuntu 中,因为我要在 Ubuntu 下烧写代码。方法很简单,点击图标 ,点击以后如图 8.4.3.5 所示

点击图 8.4.3.5 中的“连接(断开与主机的连接)(C)”,点击以后会弹出如图 8.4.3.6 所示提示界面:

图 8.4.3.6 提示你有个 USB 要从主机(Windows)拔出,插入虚拟机中,点击“确定”按钮即
可。 SD 卡插入到 Ubuntu 以后,图标 就会变为 ,不是灰色的了。在输入命令“ls /dev/sd*”
来查看当前 Ubuutu 下的存储设备,如图 8.4.3.7 所示

4. 向SD卡烧写bin文件

使用 imxdownload 向 SD 卡烧写 led.bin 文件,命令个数如下

./imxdownload <.bin file> <SD Card>

其中.bin 就是要烧写的.bin 文件, SD Card 就是你要烧写的 SD 卡,比如我的电脑使用如下命令烧写 led.bin 到/dev/sdd 中:

./imxdownload led.bin /dev/sdd //不能烧写到/dev/sda 或 sda1 设备里面!那是系统磁盘

烧写的过程中可能会让你输入密码,输入你的 Ubuntu 密码即可完成烧写,烧写过程如图

在图 8.4.3.8 中,烧写的最后一行会显示烧写大小、用时和速度,比如 led.bin 烧写到 SD 卡中的大小是 3.2KB,用时 0.0160821s,烧写速度是 201KB/s。注意这个烧写速度,如果这个烧写速度在几百 KB/s 以下那么就是正常烧写。

烧写完成以后会在当前工程目录下生成一个 load.imx 的文件,如图 8.4.3.9 所示:

load.imx 这个文件就是软件 imxdownload 根据 NXP 官方启动方式介绍的内容,在 led.bin 文件前面添加了一些数据头以后生成的。最终烧写到 SD 卡里面的就是这个 load.imx 文件,而led.bin。至于具体添加了些什么内容,我们会在下一章讲解。

4. 代码验证

代码已经烧写到了 SD 卡中了,接下来就是将 SD 卡插到开发板的 SD 卡槽中,然后设置拨码开关为 SD 卡启动,拨码开关设置如图 8.4.4.1 所示:

设置好以后按一下开发板的复位键,如果代码运行正常的话 LED0 就会被点亮,
 

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

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

相关文章

自定义SpringBoot的starter

案例需求&#xff1a;自定义redis-stater。要求当导入redis坐标时&#xff0c;SpringBoot自动创建Jedis的Bean。 实现步骤&#xff1a; 1、创建redis-spring-boot-autoconfigure模块 2、创建redis-spring-boot-starter模块&#xff0c;依赖redis-spring-boot-autoconfigure的…

4G远程温湿度传感器在农业中的应用—福建蜂窝物联网科技有限公司

解决方案 农业四情监测预警解决方案 农业四情指的是田间的虫情、作物的苗情、气候的灾情和土壤墒情。“四情”监测预警系统的组成包括管式土壤墒情监测站、虫情测报灯、气象站、农情监测摄像机&#xff0c;可实时监测基地状况,可以提高监测的效率和准确性&#xff0c;为农业生…

【云原生】Docker 实践(一):在 Docker 中部署第一个应用

Docker 实践&#xff08;一&#xff09;&#xff1a;在 Docker 中部署第一个应用 1.使用 YUM 方式安装 Docker2.验证 Docker 环境3.在 Docker 中部署第一个应用3.1 小插曲&#xff1a;docker pull 报 missing signature key 错误3.2 重新安装 Nginx 1.使用 YUM 方式安装 Docker…

2024年教你怎么将学浪视频保存到本地

你是否曾为无法将学浪视频保存到本地而烦恼&#xff1f;现在&#xff0c;我们将在2024年教给你如何解决这个问题&#xff01;只需简单几步操作&#xff0c;即可轻松将学浪视频保存到您的本地设备&#xff0c;随时随地想看就看&#xff01; 我已经将下载学浪的工具打包好了&…

Vue+Element UI el-progress进度条内显示自定义数字及文字

需求 进度条内展示 具体的数字值&#xff0c;进度条外展示 百分比数值 数据 data() {return {reNum: 3214,rePer:40,warmPer: 40,warmNum:2132,}}因为样式要求&#xff0c;显示的百分数也是自己写的哈 &#xff0c;没有用进度条自带的 代码 <div class"pick"&g…

(八)Servlet教程——创建Web项目以及Servlet的实现

1. 打开Idea编辑器 2. 点击界面上的“新建项目”按钮 3. 设置好项目名称和位置 应用服务器选择之前设置好的Tomcat服务器 构建系统默认选择Maven 4. 点击“下一步”按钮 5. 点击“完成”按钮&#xff0c;Idea就创建好了项目&#xff0c;创建完成后的目录结构如下图所示 6. 此…

网络安全之弱口令与命令爆破(中篇)(技术进阶)

目录 一&#xff0c;什么是弱口令&#xff1f; 二&#xff0c;为什么会产生弱口令呢&#xff1f; 三&#xff0c;字典的生成 四&#xff0c;使用Burpsuite工具验证码爆破 总结 笔记改错 一&#xff0c;什么是弱口令&#xff1f; 弱口令就是容易被人们所能猜到的密码呗&a…

STM32标准库编译前置条件配置

本文基于stm32f104系列芯片&#xff0c;记录编程代码前需要的操作&#xff1a; 添加库文件 在ST官网下载标准库STM32F10x_StdPeriph_Lib_V3.5.0&#xff0c;解压后&#xff0c;得到以下界面 启动文件 进入Libraries&#xff0c;然后进入CMSIS&#xff0c;再进入CM3&#xff…

Debian 12 -bash: netstat: command not found 解决办法

问题表现&#xff1a; debian 12系统中&#xff0c;不能使用 netstat命令 处理办法&#xff1a; netstat 命令就的net-tools中&#xff0c;把net-tools工具安装上就好了。 apt-get install netstat 安装之后就可以使用netstat 命令了&#xff0c;如查询端口情况&#xff1a; …

什么是内存缓存 DDoS 攻击,改如何防护

DDOS 缓存服务器是世界上许多大型网站&#xff08;如 Facebook、Flickr、Twitter、Reddit、YouTube、Github&#xff09;使用的一项技术。主要作用是利用DDOS缓存技术处理的动态网页应用&#xff0c;可以减轻网站数据库的压力&#xff0c;当这些网站出现大规模连接请求时&#…

python学习之词云图片生成

代码实现 import jieba import wordcloudf open("D:/Pythonstudy/data/平凡的世界.txt", "r", encoding"utf-8") t f.read() print(t) f.close() ls jieba.lcut(t) txt " ".join(ls)w wordcloud.WordCloud(font_path"D:/cc…

如何利用有限的数据发表更多的SCI论文?——利用ArcGIS探究环境和生态因子对水体、土壤和大气污染物的影响

原文链接&#xff1a;如何利用有限的数据发表更多的SCI论文&#xff1f;——利用ArcGIS探究环境和生态因子对水体、土壤和大气污染物的影响https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247602528&idx6&snc89e862270fe54239aa4f796af07fb71&chksmfa82…

【前端探索者:从零到精通的Web前端实战专栏】

🚀 在这个代码编织梦想的时代,Web前端作为互联网的颜值担当,正以日新月异的速度重塑数字世界。想要在前端江湖里游刃有余,你需要的不仅仅是一把锋利的剑,更是一套完整的武功秘籍!今天,我们就为你揭开【Web前端】专栏的神秘面纱,带你从菜鸟到大神,一飞冲天! 📚 专栏…

基于Spring Boot的校园闲置物品交易网站设计与实现

基于Spring Boot的校园闲置物品交易网站设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 系统功能界面图&#xff0c;在系统首页可以查看…

ClickHouse高原理与实践

ClickHouse高原理与实践 1 ClickHouse的特性1.1. OLAP1.2. 列式存储1.3. 表引擎1.4. 向量化执行1.5. 分区1.6. 副本与分片1.7 其他特性 2. ClickHouse模块设计2.1 Parser分析器与Interpreter解释器2.2 Storage2.3 Column与Field2.4 DataType2.5 Block2.6 Cluster与Replication …

ROS2专栏(三) | 理解ROS2的动作

​ 1. 创建一个动作 目标&#xff1a; 在ROS 2软件包中定义一个动作。 1.1 新建包 设置一个 workspace 并创建一个名为 action_tutorials_interfaces 的包&#xff1a; mkdir -p ros2_ws/src #you can reuse existing workspace with this naming convention cd ros2_ws/s…

[1673]jsp在线考试管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 在线考试管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

LeetCode 213 —— 打家劫舍 II

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 此题是 LeetCode 198—— 打家劫舍 的升级版&#xff0c;多了一个首尾相连的设定。 因为首尾相连&#xff0c;所以第一个房屋和最后一个房屋只能偷窃其中一个。 所以&#xff0c;第一种方案就是不偷窃最后一个房…

如何远程访问连接管理器?

远程访问连接管理器是一种方便的工具&#xff0c;可以实现远程访问计算机和网络设备的功能。它使用户能够从任何地点连接到远程计算机&#xff0c;并进行文件传输、桌面共享和远程控制等操作。远程访问连接管理器不仅提供了便利性&#xff0c;还能提高工作效率&#xff0c;并为…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《基于分形理论的新型电力系统规划场景生成方法》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…