正点原子[第二期]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.rhkb.cn/news/317712.html

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

相关文章

【PPT设计】颜色对比、渐变填充、简化框线、放大镜效果、渐变形状配图、线条的使用

目录 图表颜色对比、渐变填充、简化框线放大镜效果渐变形状配图 线条的使用区分标题与说明信息区分标题与正文,区分不同含义的内容**聚焦****引导****注解****装饰** 图表 颜色对比、渐变填充、简化框线 小米汽车正式亮相&#xff01;你们都在讨论价格&#xff0c;我全程只关…

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

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

Linux 进程间通信之匿名管道

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux知识分享⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d; 目录 前言 一. 进程间通信介绍 1.进程间通…

如何解决pycharm创建项目报错 Error occurred when installing package ‘requests‘. Details.

&#x1f42f; 如何解决PyCharm创建项目时的包安装错误&#xff1a;‘requests’ &#x1f6e0;️ 文章目录 &#x1f42f; 如何解决PyCharm创建项目时的包安装错误&#xff1a;requests &#x1f6e0;️摘要引言正文&#x1f4d8; **问题分析**&#x1f680; **更换Python版本…

利用STM32实现语音识别功能

引言 随着物联网和智能设备的普及&#xff0c;语音识别技术正逐渐成为用户交互的主流方式之一。 STM32微控制器具备处理高效率语音识别算法的能力&#xff0c;使其成为实现低成本、低功耗语音交互系统的理想选择。 本教程将介绍如何在STM32平台上开发和部署一个基础的语音识…

详解SDRAM基本原理以及FPGA实现读写控制

文章目录 一、SDRAM简介二、SDRAM存取结构以及原理2.1 BANK以及存储单元结构2.2 功能框图2.3 SDRAM速度等级以及容量计算 三、SDRAM操作命令3.1 禁止命令&#xff1a; 4b1xxx3.2 空操作命令&#xff1a;4b01113.3 激活命令&#xff1a;4b00113.4 读命令&#xff1a;4b01013.5 写…

---文件操作---

#include<iostream> using namespace std; #include<fstream>void test01() {//1.包含头文件//2.创建流对象ofstream ofs;//3.指定打开方式ofs.open("test.txt", ios::out);//写文件//4.写内容ofs << "张三" << endl;ofs <<…

使用 Flask 和 WTForms 构建一个用户注册表单

在这篇技术博客中&#xff0c;我们将使用 Flask 和 WTForms 库来构建一个用户注册表单。我们将创建一个简单的 Flask 应用&#xff0c;并使用 WTForms 定义一个注册表单&#xff0c;包括用户名、密码、确认密码、邮箱、性别、城市和爱好等字段。我们还将为表单添加验证规则&…

罗宾斯《管理学》第15版笔记/课后习题/考研真题答案

第Ⅰ篇 管理导论 第1章 工作场所中的管理者和你 1.1 知识结构导图 1.2 考点难点归纳 1.3 课后习题详解 1.4 考研真题详解 附加模块一 管理史 知识结构导图 考点难点归纳 课后习题详解 考研真题详解 第2章 决 策 2.1 知识结构导图 2.2 考点难点归纳 2.3 课后习题详解…

git 第一次安装设置用户名密码

git config --global user.name ljq git config --global user.email 15137659164qq.com创建公钥命令 输入后一直回车 ssh-keygen -t rsa下面这样代表成功 这里是公钥的 信息输入gitee 中 输入下面命令看是否和本机绑定成功 ssh -T gitgitee.com如何是这样&#xff0c;恭喜…

类和对象中的默认成员函数(构造,拷贝构造,析构......)深入了解类和对象

文章目录 类的6个默认成员函数构造函数总结构造函数 析构函数总结析构函数 拷贝构造函数总结拷贝构造函数 赋值运算符重载取地址重载和const取地址重载 类的6个默认成员函数 一个什么都不写的类我们称之为“空类” class Test {}我们什么都没写&#xff0c;这里看着空空的&am…

对2023年图灵奖揭晓看法

2023年图灵奖揭晓&#xff0c;你怎么看&#xff1f; 2023年图灵奖&#xff0c;最近刚刚颁给普林斯顿数学教授 Avi Wigderson&#xff01;作为理论计算机科学领域的领军人物&#xff0c;他对于理解计算中的随机性和伪随机性的作用&#xff0c;作出了开创性贡献。这些贡献不仅推…

用FPGA+DAC输出“心”形波

1.前言 之前在做信号处理的时候整了一下活&#xff0c;用FPGADAC&#xff08;数模转换器&#xff09;&#xff0c;输出了一个爱心形状的波形&#xff0c;今天整理资料的时候偶然发现了他&#xff0c;现在把他分享出来。当时将DAC的输出接在示波器上显示如下图所示&#xff1a; …

IDEA创建Tomcat/Servlet项目

作者&#xff1a;私语茶馆 1.前言 利用Idea创建一个Java EE的Tomcat Web项目&#xff0c;记录一下过程。 Jakarta EE介绍&#xff1a;以前被称为Java EE&#xff08;Java Platform, Enterprise Edition&#xff09;&#xff0c;但在Oracle将Java EE相关的技术和知识产权转移到…

如何从 iPhone 恢复已删除或丢失的联系人?

不小心删除了您的 iPhone 联系人&#xff1f;不用担心。我们将向您展示如何从 iPhone或 iPad恢复已删除或丢失的联系人。当您从 iPhone 中删除联系人时&#xff0c;您可能认为无法将其恢复。但事实是&#xff0c;您可以从 iPhone 或 iPad 恢复已删除的联系人&#xff0c;因为它…

vue3实现移动端,PC端响应式布局

纯移动端|PC端 这种适用于只适用一个端的情况 方法&#xff1a;amfe-flexible postcss-pxtorem相结合 ① 执行以下两个命令 npm i -S amfe-flexible npm install postcss-pxtorem --save-dev② main.js文件引用 import amfe-flexible③ 根目录新建一个postcss.config.js文件…

rancher/elemental 构建不可变IOS(一)

一、什么是elemental Elemental 是 Rancher 的一个变种&#xff0c;专注于提供一个更轻量级的 Kubernetes 发行版。它旨在提供简化的部署和管理体验&#xff0c;同时保持 Kubernetes 的灵活性和强大功能。Elemental 通常针对较小的部署场景或资源受限的环境&#xff0c;例如测…

16册 | 移动机器人(自动驾驶)系列

此文档整理推荐了16本移动机器人&#xff08;自动驾驶&#xff09;相关的书籍&#xff0c;内容包括&#xff1a;ROS、机器人基础开发、分布式机器人控制、集群机器人控制、嵌入式机器人、多传感器融合等等。 学习&#xff0c;切勿急于求成&#xff0c;读书自学&#xff0c;需多…

讯饶科技 X2Modbus 敏感信息泄露

讯饶科技 X2Modbus 敏感信息泄露 文章目录 讯饶科技 X2Modbus 敏感信息泄露漏洞描述影响版本实现原理漏洞复现修复建议 漏洞描述 X2Modbus是一款功能很强大的协议转换网关&#xff0c; 这里的X代表各家不同 的通信协议&#xff0c;2是To的谐音表示转换&#xff0c;Modbus就是最…

uniapp 桌面应用插件 Ba-Launcher

简介&#xff08;下载地址&#xff09; Ba-Launcher 可以让你的应用成为简单的桌面应用&#xff0c;如需扩展功能&#xff0c;请联系我。 截图展示 可关注博客&#xff0c;实时更新最新插件&#xff1a; uniapp 常用原生插件大全 使用方法 使用方法也很简单&#xff0c;在插…