linux内核开发基础(linux内核源码、树莓派源码编译、SD卡挂载)

2023-11-09

首先下载树莓派linux内核源码:

  • 下载网址:https://github.com/raspberrypi/linux
  • 在树莓派使用指令:uname -r查看当前树莓派的版本号,然后选择对应的linux内核版本号进行下载。
    在这里插入图片描述
    在这里插入图片描述
  • 将linux内核源码从共享文件夹拷贝到SYSTEM文件夹:cp linux-rpi-4.19.y.zip /home/fhn/SYSTEM/然后使用指令对该压缩文件进行解压:unzip linux-rpi-4.19.y.zip
    在这里插入图片描述

树莓派等芯片带操作系统的启动过程:

之前学习的51和32(裸机)是直接使用C语言操控底层寄存器实现相关业务,这是业务流程型(就是设备有什么功能,要实现什么功能)裸机代码,而linux的BootLoader是超级裸机(BootLoader的主要作用是引导操作系统启动),BootLoader: 刚开始一阶段学习就是让CPU和内存、FLASH、串口、IIC、IIS、数据段打交道,就是驱动这些设备(主要用到汇编和C);二阶段就是对于引导linux内核启动(纯C)。X86架构(比如:Intel),跑的是windows操作系统,上电启动的时候: 首先是启动BIOS然后是启动windows内核,然后就是加载C、D等盘,最后是启动应用程序。对于其他的嵌入式产品(比如:树莓派、mini24440、mini6410、nanopi、海思、RK(瑞芯微)),这些产品上电后启动过程是:首先启动BootLoader(相当于windows的BIOS吧,但这里叫做BootLoader),然后引导linux内核,linux内核启动完成后就是加载文件系统(和C、D盘不太一样,在linux下是根据功能性来组织文件夹,带访问权限(这就是linux文件系统),就是根目录下的那些东西,可以使用指令:cd / 进入),文件系统起来以后才能跑应用程序(比如:KTV点歌机界面等)。BootLoader、linux内核、文件系统构成操作系统,就像之前所说的在目的平台还没有建立的时候,需要通过交叉编译让这些东西可以使用。 安卓的启动过程: 有很多嵌入式设备都开始运行安卓操作系统,首先硬件上电后,启动fastboot(也叫BootLoader,意思和BootLoader一样),然后引导linux内核,linux内核起来以后加载文件系统(因为底层还是linux),文件系统起来以后开始跑一个运行java代码的虚拟机,虚拟机起来以后开始运行home应用程序(就相当于手机的界面),点击home界面的某图标就可以打开相应的app。

  • 简单介绍,根目录下一些文件夹存放的东西,在嵌入式体统中,为了精简系统。/bin,/dev,/etc,/lib,/proc,/var,/usr 对于根文件系统来说是必须具有的,其他目录都是可选的。首先使用指令:cd /进入到根目录,然后可以看到下面的一些文件夹。这篇博文更详细

  • dev: 该目录下存放的是设备文件,设备文件是Linux中特有的文件类型。在Linux系统下,以文件的方式访问各种设备,即通过读写某个设备文件操作某个具体硬件。譬如通过"dev/ttySAC0"文件可以操作串口0。(在linux下一切皆文件,就像之前树莓派的串口就是存放在dev下面)

  • lib: 该目录下存放共享库和可加载驱动程序模块。共享库用于启动系统、支持可执行程序的运行。

  • etc: 该目录下存放着各种配置文件,对于PC上的Linux系统,/etc目录下的文件和目录非常多,这些目录文件是可选的,它们依赖于系统中所拥有的应用程序是否需要配置文件。在嵌入式系统中,这些内容可以大为精减。

  • root: 根用户的目录,与此对应,普通用户的目录是/home下的某个子目录。

  • usr: 该目录存放的是共享、只读的程序和数据,/usr目录下的内容可以在多个主机间共享。

  • var: 与/usr目录相反,/var目录中存放可变的数据,比如spool目录(mail,news),log文件,临时文件。

  • proc: 该是一个空目录,常作为proc文件系统的挂载点,proc文件系统是个虚拟的文件系统,它没有实际的存储设备,里面的文件都是由内核临时生成的,用来表示系统的运行状态,也可以操作其中的文件控制系统。

  • mnt: 用于临时挂载某个文件系统的挂接点,通常是空目录,也可以在里面创建子目录来临时挂载光盘、硬盘,譬如/mnt/cdram /mnt/hda1 。

  • home: 用户目录,它是可选的,对于每个普通用户,在/home目录下都有一个以用户名命名的子目录,里面存放用户相关的配置文件

  • opt: 存放的是和内核底层有些关系的东西

  • bin: 该目录下存放所有用户都可以使用的、基本的命令,譬如cd,ls,cp等。这些命令在挂载其它文件系统之前就可以使用,所以/bin目录必须和根文件系统在同一个分区中,比如:which ls可以查找ls指令的路径

  • sbin: 该目录下存放的是基本的系统命令,它们用于启动系统,修复系统等,与/bin目录相似,在挂接其他文件系统之前就可以使用/sbin,所以/sbin目录必须和根文件系统在同一个分区中

  • boot: 存放的是启动时候的一些数据,包括启动的时候加载的内容、一些命令和命令行的配置等等。

  • tmp: 用于存放临时文件,通常是空目录,一些需要生成临时文件的程序用到的/tmp目录下,所以/tmp目录必须存在并可以访问。

在这里插入图片描述
在这里插入图片描述

linux内核源码树:其实就是目录的组织形式

  • 找到之前下载的linux内核源码
    在这里插入图片描述
  • 使用tree指令,在以后做第三方工具安装的时候会去检查包里面的内容是否完整,或者是有一个文件夹目录下文件比较多的时候使用tree指令方便查看,然后如果出现识别不了表示没有下载,然后使用指令sudo apt install tree进行下载。
    在这里插入图片描述
  • linux内核大约有1.3w个c文件,1100w行代码,是因为linux是一个开源的,支持多架构多平台代码,可移植性非常高。但是linux内核编译出来一般就若干M,因为支持多平台,多架构,所以编译之前要配置,配置成适合目标平台来用。代码编译出来是给一个平台一个架构来用的,很多代码是不参与编译的。例如:ARM架构(海思、RK、树莓派、nanoPi)、X86架构、powerpc、mips等等架构

Linux内核源代码目录树结构:
在这里插入图片描述

  • arch:包含和硬件体系结构相关的代码,每种平台占一个相应的目录。和32位PC相关的代码存放在i386目录下,其中比较重要的包括kernel(内核核心部分)、mm(内存管理)、math-emu(浮点单元仿真)、lib(硬件相关工具函数)、boot(引导程序)、pci(PCI总线)和power(CPU相关状态)。进入arm这个文件夹,这个里面存放的是arm架构相关的设备。mach表示架构相关的,mach-exynos: 是三星公司的架构; mach-hisi : 是海思公司的架构,就单单arm架构下就有很多公司的架构。
    在这里插入图片描述

  • block:部分块设备(跟存储设备相关的,像内存、flash等)驱动程序。

  • crypto:常用加密和散列算法(如AES、SHA等),还有一些压缩和CRC校验算法。

  • Documentation:关于内核各部分的通用解释和注释。

  • drivers:设备驱动程序,每个不同的驱动占用一个子目录。

  • fs:各种支持的文件系统,如ext、fat、ntfs等。

  • include:头文件。其中,和系统相关的头文件被放置在linux子目录下。

  • init:内核初始化代码(注意不是系统引导代码)。

  • ipc:进程间通信的代码(之前学习的进程间通信:管道、消息队列、共享内存,在调用的时候都会触发一个异常,系统调用然后进入到内核态。那些API就是支配内核干活)。

  • kernel:内核的最核心部分,包括进程调度、定时器等,和平台相关的一部分代码放在arch/*/kernel目录下,根目录下的kernel一般都放一些通用的内核的最核心部分,包括进程调度、定时器的代码。

  • lib:库文件代码。

  • mm:内存管理代码,和平台相关的一部分代码放在arch/*/mm目录下。

  • net:网络相关代码,实现了各种常见的网络协议。

  • scripts:用于配置内核文件的脚本文件。

  • security:主要是一个SELinux的模块。

  • sound:常用音频设备的驱动程序等。

  • usr:实现了一个cpio(cpio就是复制入和复制出的意思。cpio可以向一个归档文件(或单个文件)复制文件、列表,还可以从中提取文件)。

  • 在i386体系下,系统引导将从arch/i386/kernel/head.s开始执行,并进而转移到init/main.c中的main()函数初始化内核。

配置Linux内核适合树莓派相关操作:

以后可能涉及驱动代码的编写,驱动代码的编译需要一个提前编译好的内核,编译内核就需要对内核进行配置。配置的最终目标是生成.config文件,该文件指导Makefile去把有用的东西组织成内核。配置的方式有以下几种方式:

  • 第一种方式:厂家会配Linux内核源码,比如说:买了树莓派,厂家会提供Linux内核源码,然后这样就可以将厂家的.config文件里面的代码拷贝到要生成的.config文件即可。进入到Linux内核文件夹下,然后使用指令find . -name *defconfig查找以defconfig结尾的文件。比如树莓派的2和3就是使用的下图的bcm2709_defconfig,然后只需要将它拷贝到要生成的.config文件。
  • 第二种方式:使用make menuconfig(menuconfig、defconfig都是用来配置内核的)一项项配置,通常是基于厂家的config来配置。
  • 第三种方式:完全自己来。
    在这里插入图片描述

树莓派内核编译

  • 首先配置好ubuntu交叉编译的环境,环境的搭建在另一篇文章有配置过程

  • 然后开始配置config,linux源码中有很多工程:树莓派1的工程是bcmrpi_defconfig;树莓派2、3的工程是bcm2709_defconfig配置过程如下:

  • 使用源码里面自带的configARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig此命令功能是获取bcm2709_defconfig的配置到 .config里。这行命令的意思是:指定arch(架构)是arm架构的-------ARCH=arm ;指定编译器是系统里面arm-linux-gnueabihf-这个编译器,这就是之前配好的交叉编译器--------CROSS_COMPILE=arm-linux-gnueabihf- ;指定树莓派的kernel树莓派里面特别指定的---------KERNEL=kernel7;用的config是bcm2709_defconfig所以是-------make bcm2709_defconfig,这就相当于直接拷贝厂家的config到.config。

  • 如果使用指令:ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig出现下图报错,则表示该错误的原因是缺少某些需要的库,需要安装一下需要的库就行了,sudo apt-get install bisonsudo apt-get install flex,如果在安装上面库时提示找不到安装库,就需要更新一下source addr,sudo apt-get update #更新;sudo apt-get upgrade #升级,需要用update更新完才能upgrade;更详细的,请 $man apt-get,记录更新源的文件:/etc/apt/sources.list,默认sources.list中的更新源为官方的,下载速度慢,从而需要寻找符合自己需要的更新源。
    在这里插入图片描述

  • 出现下图表示复制成功,configuration written to .config
    在这里插入图片描述

  • 如果想要添加某些驱动进来,就要:ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make menuconfig,如果没什么改的就不用执行这一步。这时候它就会读取现有.config,给menuconfig做一些基本的项的填充。出现下图错误表示没有ncurses 库,要进行安装:sudo apt-get install libncurses5-dev libncursesw5-devsudo apt-get install libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5,编译的时候还会用到一些其他的必要的库需要进行安装:sudo apt-get install bcsudo apt-get install zlib1g:i386
    在这里插入图片描述

  • 执行完执行menuconfig会出现以下Ncurses界面,一般就是在Device Drivers进行设备驱动的配置,用方向键操作,用enter表示确定选择, Pressin < Y > includes表示要将前面带< Y >的编译进了内核,< M > modularizes features意思都是模块化特性,表示驱动以模块的方式生成驱动文件。< N >表示不需要的略过的就是下图的< >。驱动两种加载方式:① * 编译进内核 zImage包含了驱动 ②M 驱动以模块方式生成驱动文件(xxx.ko)系统启动后,通过命令inmosd xxx.ko加载,下图的< * >就是< Y >。在这个Ncurses界面可以使用空格切换< >中的选项。
    在这里插入图片描述

  • 我们可以直接用工程里的配置,但这样的话可能会丢失原来使用的树莓派的配置,这里提供一个方法可以获取当前正在使用的树莓派的config。获取当前树莓派的config,已经开机的树莓派上会有这个节点:/proc/config.gz,从这个节点可以获取本树莓派的config。如果没有这个节点的话则需要先加载模块:sudo modprobe configs把 config.gz 内容复制到要编译的电脑上:scp pi@[ip]:/proc/config.gz .解压,保存为.confg文件。zcat config.gz > .config注:必须在linux环境下解压,在mac下会乱码。把此config文件复制到linux源码的根目录,这种方法我没尝试过。

已经生成.config文件了,然后就可以该文件指导Makefile去把有用的东西组织成内核:

  • 使用指令:ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs 2>&1 | tee build.log,其中2>&1 | tee build.log是错误处理可以不关心不要。make -j4 zImage modules dtbs这段指令中的-j4是指定电脑(虚拟机)用多少的资源来编译,4表示4线程。zImage表示要生成zImage(内核镜像);modules表示要生成驱动模块;dtbs表示要生成配置文件等等。我编译的过程出现以下错误:原因是:都是没有安装libssl-dev~,libssl-dev包含libraries, header files and manpages,他是openssl的一部分,而openssl对ssl进行了实现。解决方案:使用sudo apt-get install libssl-dev来安装libssl-dev即可,这个编译过程大概持续20分钟。
    在这里插入图片描述

  • 在编译过程中没有报错,并且在linux源码树目录下生成vmlinx,vmlinux是没有压缩的linux,而真正生成的linux内核是在arch/arm/boot下面的zImage
    在这里插入图片描述
    在这里插入图片描述

  • 编译完成后就需要将编译后linux内核放到树莓派去运行,首先将zImage文件打包,直接用linux源码包(要在linux源码包下执行)里的工具:./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img在本目录生成一个kernel_new.img文件,这个文件就是要放到sd卡中的文件。scripts文件夹下面存放的是一些脚本文件,这里的mkknlimg会将zImage打包成kernel_new.img。:网上很多地方说的用tools/mkimage/imagetool-uncompressd.py 的方法不行!!
    在这里插入图片描述

  • dmesg是查看底层的硬件信息。当有设备接入的时候,内核会打印设备驱动的一些东西。可使用该指令查看U盘是否接入到ubuntu,并且可以看到SD的两个分区:sdb1(boot)和sdb2(根目录相关文件)。
    在这里插入图片描述

  • 挂载树莓派sd卡,并安装编译出的DIRECTLY 到sd卡: 把树莓派的sd卡插入ubuntu系统电脑,树莓派的sd卡有两个分区:一个fat分区,是boot相关的内容,kernel的img文件就放在这个分区里;一个是ext4分区,也就是系统的根目录分区。我们生成的文件涉及到这两个分区的内容,一般插入ubuntu后会自动挂载,fat分区可以不用root权限操作,ext4分区需要root权限操作。两个分区具体挂载在什么地方可以自己决定,以下用[fat]表示boot挂载的路径,[ext4]表示ext4挂载的路径。自己创建两个文件夹:fat和ext4

  • 挂载U盘: sudo mount /dev/sdb1 fat将内存卡中的sdb1挂载到fat文件夹夹,这样fat里面就有sdb1(boot相关)的内容了,sudo mount /dev/sdb2 ext4将内存卡中的sdb2(根目录分区)挂载到fat文件夹夹,这样fat里面就有sdb1的内容了
    在这里插入图片描述

  • 挂载分区后,安装modules:sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=[ext4] modules_install 执行指令需要进入到源码下的那个文件夹。操作ext4分区,需要root权限(因为是安装到根目录分区)。自己创建的文件夹名称不同,就将对应的[ext4]换成自己挂载根目录分区的文件夹路径即可。在这过程中会生成好多xxx.ko文件(HDMI、usb、wifi、io等的驱动),如果少了这步操作那些设备可能不会正常工作。下图表示安装成功:
    在这里插入图片描述

  • 更新 kernel.img 文件: 在更新之前可以选择先备份镜像(注意镜像的名字是kernel7.img),使用指令:cp kernel7.img kernel7oled.img,下面对于更新有两种方式:①前面已经用mkknlimg 工具打包了kernel_new.img文件了,把它复制到boot分区并配置使用即可:cp kernel_new.img [fat]/,编辑 [fat]/config.txt 文件,在最后加入一行:kernel=kernel_new.img(在配置文件里面指定内核镜像是kernel_new.img)。②因为前面已经备份了kernel7.img所以可以直接将 kernel_new.img的内容复制到kernel7.img将原有的东西覆盖掉:cp kernel_new.img /home/fhn/fat/kernel7.img。拷贝完成后可以使用指令:du kernel7.img -h查看文件大小,然后可以使用指令:md5sum kernel_new.img查看原镜像的MD5值(每个文件都有它唯一的编码号就是md5的值),然后再查看拷贝后的镜像的MD5值进行比较,若拷贝过程中文件没有损坏,则md5的值相同,否则可能在拷贝过程中文件损坏。
    在这里插入图片描述

  • 复制其他相关文件(配置文件,是为了加载驱动和其他配置文件): cp arch/arm/boot/dts/.*dtb* [fat]/将[fat]换成自己内存卡boot分区挂载的对应的路径,cp arch/arm/boot/dts/overlays/.*dtb* [fat]/overlays/cp arch/arm/boot/dts/overlays/README [fat]/overlays/这两个指令同上也需要将[fat]换成自己内存卡boot分区挂载的对应的路径。

  • 以上内容配置完成后,然后修改config.txt和cmdline.txt文件里面的内容,通过串口观察系统的启动过程。

  • 更新完成后插回树莓派即可开机,开机后可以用 uname -a 命令查看kernel信息已经改变。和从官网下载的内核版本相同。
    在这里插入图片描述

  • 树莓派内核编译部分参考博文

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

linux内核开发基础(linux内核源码、树莓派源码编译、SD卡挂载) 的相关文章

  • 在 Linux 2.6.21 (glibc 2.3.5) 上进行 ARP 和反向 ARP

    我需要在任意 IP 网络上存储对第三方设备的持久引用 其中设备的 IP 地址可能是静态的或由 DHCP 随机分配 我不控制网络上的设备 也不能依赖 DNS 和其他现有的或与设备一起使用的临时网络协议 所以我被指示使用硬件地址和 ARP 进行
  • 从 gitlab docker runner 启动声纳扫描仪

    我有一个 CI 工作流程 集成了 linting 作业和代码质量作业 我的 Linting 工作是一个 docker runner 从应用程序代码启动我的 eslint 脚本 然后我的代码质量工作应该启动声纳扫描仪泊坞窗实例 检查我的代码并
  • sed 仅最后一个匹配模式

    我想sed仅文本文件的最后一个匹配模式 输入文件 boy boy girl boy 输出文件 boy boy girl boys 一种方法是反转文件 仅替换第一个匹配项 然后再次反转 tac
  • 如何使用sprof?

    请举例说明 从邮件中找到here http sources redhat com ml libc alpha 2003 07 msg00029 html and here http sourceware org ml binutils 20
  • 是否有我可以运行的操作系统命令来确定是否在基于 Xen 的虚拟机内运行

    我可以在基于 Xen 的虚拟机中运行一个操作系统命令来告诉我它是一个虚拟机而不是物理机 我听说内核对此有一些自我意识智能 例如就像 ps 输出中的额外列之类的 我知道 vmstat 提供了 st 列 但我在运行 Linux 内核 2 6 1
  • 在 XAMPP 上设置虚拟主机

    我已经在 Ubuntu 上的 opt lampp 目录中安装了 XAMPP 并且想要设置一些虚拟主机 Apache 虚拟主机教程说明放置
  • Nasm 打印到下一行

    我用 nasm Assembly 编写了以下程序 section text global start start Input variables mov edx inLen mov ecx inMsg mov ebx 1 mov eax 4
  • 有关 Linux 内存类型的问题

    关于Linux内存我有以下问题 我知道活动内存是最常访问的内存部分 但是有人可以解释一下 linux 如何考虑将内存位置用于活动内存或非活动内存 主动存储器由哪些部分组成 磁盘 文件缓存是否被视为活动内存的一部分 有什么区别Buffers
  • 跟踪 pthread 调度

    我想做的是创建某种图表 详细说明 Linux 中 两个 线程的执行情况 我不需要查看线程的作用 只需查看它们何时被安排以及持续多长时间 基本上是一条时间线 在过去的几个小时里 我一直在互联网上搜索跟踪 pthread 调度的方法 不幸的是
  • 如何删除树莓派的相机预览

    我在我的 raspberryPi 上安装了 SimpleCv 并安装了用于使用相机板的驱动程序 uv4l 驱动程序 现在我想使用它 当我在 simpleCV shell Camera 0 getImage save foo jpg 上键入时
  • xdotool 类型需要很长时间并导致整个桌面冻结

    我一直在使用xdotool type过去只能在快捷方式上输入耸肩xdotool type 这可行 但总是需要相当长的时间 并导致整个桌面冻结 完全冻结 而不仅仅是输入 几秒钟 不过并没有太打扰我 现在我需要一种方法来从文件中读取内容 对其进
  • 使用 MongoDB docker 镜像停止虚拟机而不丢失数据

    我已经在 AWS EC2 上的虚拟机中安装了官方的 MongoDB docker 映像 并且数据库上已经有数据 如果我停止虚拟机 以节省过夜费用 我会丢失数据库中包含的所有数据吗 在这些情况下我怎样才能让它持久 有多种选择可以实现此目的 但
  • 使用 sed 将 old-link-url 替换为 new-link-url

    我正在 bash 中编写一个脚本 将 old link url 替换为 new link url 我的问题是 sed 由于斜杠而无法替换 url 如果我只输入一些文字就可以了 my code sed e s old link new lin
  • Docker DNS 设置

    我尝试使用自定义网络和 dos 设置创建 docker 容器 docker网络创建 driver bridge opt com docker network bridge enable ip masquerade true opt com
  • 在 Ubuntu 上纯粹通过 bash 脚本安装 mysql 5.7

    我想要一个无需任何手动输入即可安装 MySQL 5 7 实例的 bash 脚本 我正在关注数字海洋教程 https www digitalocean com community tutorials how to install mysql
  • 如何从最新版本的 Ubuntu (18.10) 运行使用 SystemD 的 Docker 容器?

    我正在尝试执行使用 ubuntu latest 构建的 Docker 映像 并且在运行容器时不断收到 SystemD 错误消息 System has not been booted with systemd as init system P
  • 是否有可能通过 mmap 匿名内存“打孔”?

    考虑一个使用大量大致页面大小的内存区域 例如 64 kB 左右 的程序 每个内存区域的寿命都相当短暂 在我的特定情况下 这些是绿色线程的替代堆栈 如何最好地分配这些区域 以便一旦该区域不再使用 它 们的页面可以返回到内核 天真的解决方案显然
  • 如何使用ffmpeg重叠和合并多个音频文件?

    我正在尝试将多个音频文件合并到一个文件中 但我可以使用以下命令来连接 而不是连接 ffmpeg v debug i file1 wav i file2 wav i file3 wav filter complex 0 0 concat n
  • 有没有人在 Ubuntu 16.04 LTS 上安装 QGIS

    按照以下网址提供的说明进行操作 这一页 http www qgis org en site forusers alldownloads html并收到以下错误 以下软件包具有未满足的依赖关系 python qgis Depends pyth
  • sqlite 插入需要很长时间

    我正在将不到 200 000 行插入到 sqlite 数据库表中 我只是在终端中通过 sqlite3 使用一个非常简单的 sql 文件 我打赌它已经运行了至少 30 分钟 这是正常现象还是我应该关闭该过程并尝试不同的方法 sqlite中的插

随机推荐

  • 使用HAL库开发STM32:使用Timer输出PWM信号

    文章目录 目的 基础说明 输出PWM信号 总结 目的 单片机输出PWM信号是很常用的一种功能需求 STM32中通常使用Timer来输出PWM信号 这篇文章将对相关内容做个说明 基础说明 在使用Timer输出PWM信号需要了解一些Timer的
  • Spring Boot, 访问入口配置

    HTTP Server port server port 8080 Make the application accessible on the given context path http localhost 8080 myapp se
  • openGL结合光照与纹理

    openGL系列文章目录 文章目录 openGL系列文章目录 前言 一 实现思路 二 代码 1 c 主程序 2 顶点着色器 3 片元着色器 运行效果 参考 源码下载 前言 在光照模型中 都是假设我们使用按ADS 定义的光源 照亮按ADS 定
  • Python计算商品复购率

    1 Python计算产品复购率 需求 给出数据商品购买数据 数据格式 csv 包含 购买月份 手机号 根据该数据计算产品的复购率 复购率算法 算法一 单位时间内 按每月 R 复购人数 总购买人数 算法二 单位时间内 按每月 R 复购交易次数
  • 应用usb_cam同时打开多个摄像头方法

    最近由于项目需要 需要同时开启多个摄像头 虽然可以用opencv去写对应的摄像头开启的程序 但是 还是想用ros中提供的usb cam去打开多个摄像头 通过usb cam去打开一个摄像头 不用下载源码 可以直接安装usb cam去调用lau
  • 使用GDI/GDI+绘制到D3D9缓冲区的方法

    这个其实是3D绘图里嵌入2D绘图的传统方式 D3D9直接使用GDI GDI 就可以画图 只不过需要额外的设置 而且只支持RGB和XRGB 不支持ARGB 因此这种方法比较适合合成UI元素和不透明的纹理贴图 不适合将要进行AlphaBlend
  • #Mybatis 关于mybatis的一级缓存

    本篇文章主要是为了帮助自己总结和加深理解 若能帮助到其他小伙伴也是极好的 基本介绍 Mybatis中支持一级缓存和二级缓存 一级缓存是默认开启的并且不能关闭 二级缓存默认关闭 可根据需要进行手动开启 总体来说Mybatis的一二级缓存的最终
  • Shell 排序法 - 改良的插入排序

    说明 插入排序法由未排序的后半部前端取出一个值 插入已排序前半部的适当位置 概念简单但速度不快 排序要加快的基本原则之一 是让后一次的排序进行时 尽量利用前一次排序后的结果 以加快排序的速度 Shell排序法即是基于此一概念来改良插入排序法
  • css设置div上下左右均居中 、底部居中

    css设置div或盒子居中 垂直居中 左右居中 底部居中 类型一 固定宽度高度 html代码 div class login container div class login box div 内容 div div div 2 css 外部
  • 软件测试入坑建议

    本科非计算机专业 在深圳做了四年软件测试工作 从之前的一脸懵的点点点 到现在会点自动化测试 说一点点非计算机专业人员从事软件测试的心得体会 仅供参考交流 如果你是非计算机专业 毕业不久 软件测试工作门槛相对较低 比较容易入门 建议入职互联网
  • Halcon学习---玻璃瓶口的缺陷检测

    inspect bottle mouth hdev 巧妙运用了极坐标变换法 细节很精细 值得学习 tuning parameters SmoothX 501 ThresholdOffset 25 MinDefectSize 50 initi
  • 华为机试-----集五福作为近年来大家喜闻乐见迎新春活动,集合爱国福、富强福、和谐福、友善福、敬业福即可分享超大红包

    题目 以0和1组成的长度为5的字符串代表每个人所得到的福卡 每一位代表一种福卡 1表示已经获得该福卡 单类型福卡不超过1张 随机抽取一个小于10人团队 求该团队最多可以集齐多少套五福 输入描述 输入若干个 11010 00110 的由0 1
  • 有限状态机的4中实现对比

    有限状态机的4种实现对比 在日常工作过程中 我们经常会遇到状态的变化场景 例如订单状态发生变化 商品状态的变化 这些状态的变化 我们称为有限状态机 缩写为FSM F State Machine 之所以称其为有限 是因为这些场景中的状态往往是
  • 俄罗斯方块代码

    package Game1 import java awt Color import java awt Font import java awt Graphics import java awt event ActionEvent impo
  • C语言之实现矩阵(3行3列)的转置(即行列互换)

    例如 输入下面的矩阵 100 200 300 400 500 600 700 800 900 程序输出 100 400 700 200 500 800 300 600 900 代码如下所示 include
  • 数据结构视频教程 -《[猎豹网校]数据结构与算法_C语言》

    整个视频打包下载地址 史上最全的数据结构视频教程系列分享之 猎豹网校 数据结构与算法 C语言 转载请保留出处和链接 更多优秀资源请访问 我是码农 数据结构是信息与计算科学专业中一门重要的专业基础课程 当用计算机来解决实际问题时 就要涉及到数
  • vmware esxi 6.7 下载以及如何在虚拟机里实现显卡直通?

    为了让vmware支持显卡 找了好久esxi下载 版本太多了 都不知道要下哪个 找到别人贡献的百度链接 分析给大家 使用esxi也不行 esxi需要安装在裸机上 才能支持独显 不能直接安装在windows上 后来查资料使用 qemu kvm
  • 【Windows基线检查】

    文章目录 前言 一 目的 二 要求 总结 前言 企业在发布服务器到公网前都应该对服务器进行安全测试 包括漏洞扫描 基线检查 业务流程测试等等 本期介绍Windows基线检查的部分内容和一些操作系统策略设置方法 一 目的 旨在为即将发布到公网
  • 获取时间的方法

    Java获取当前年份 月份和日期是通过Calendar类的实例对象来获取的 首先创建一个Calendar类的实例对象 Calendar类属于java util包 Calendar calendar Calendar getInstance
  • linux内核开发基础(linux内核源码、树莓派源码编译、SD卡挂载)

    首先下载树莓派linux内核源码 下载网址 https github com raspberrypi linux 在树莓派使用指令 uname r查看当前树莓派的版本号 然后选择对应的linux内核版本号进行下载 将linux内核源码从共享