学习STM32(1)--Keil软件安装与基本操作和Keil 软件高级应用
目录
1 引 言
2 实验目的
3 实验内容
3.1 认识单片机和STM32
3.2 安装、认识软件Keil和硬件STM32F103开发板
3.3 学习调试工程
3.4 Keil工程软件的配置
4 深入解析
思考一
1.以项目“12-GPIO输出—使用固件库点亮LED”为例子,认识本地工程文件夹:
2.进入keil后的project目录介绍:
3.Keil文件类型概述:
1、Project Files工程类型文件:
2、Source Files源代码类型文件:
3、Listing Files链接类型文件:
4、Object and HEX Files目标和Hex类型文件:
5、Build Files编译类型文件 Debugger Files调试类型文件:
6、Other Files其他类型文件;
思考二
调试功能的用法:
思考三
查阅资料解释Keil软件Option选项卡下面每个子目录下面可配置的参数,以及实现的功能。
Target区域介绍:
第1处:晶振频率
第2处:操作系统
第3处:系统预览文件
第4处:使用交叉模块优化、使用微库microLIB
第5处:ROM/RAM存储地址
Listing区域介绍:
第1处:输出路径、宽高
第2处:输出汇编列表
第3处:C编译列表
第4处:链接列表
C/C++目录
第1处:使用分散文件加载对话框Target页面(Use Memory Layout from Target Dialog)
第2处:分散文件(Scatter File)
第3处:两个选项和C/C++选项一样。
1 引 言
我们要认识单片机、STM32是什么和认识我们实验使用到的软件Keil和硬件STM32F103开发板,和Keil项目中的目录、文件,认识完这些后我们就可以开始单片机的挑战了。我们需要熟悉Keil软件的断点设置、调试功能和掌握Keil软件的工程配置。
2 实验目的
- 认识单片机、STM32是什么
- 认识软件Keil和硬件STM32F103开发板
- 熟悉Keil软件的断点设置、调试功能
- 掌握Keil软件的工程配置
3 实验内容
3.1 认识单片机和STM32
单片机:单片机(Microcontroller)是一种集成了中央处理器(CPU)、存储器(RAM、ROM、闪存等)、输入/输出端口(I/O ports)以及定时/计数器等功能于一体的微型计算机系统。它通常用于嵌入式系统中,用于控制各种设备和系统,例如家电、汽车、医疗设备、工业控制等。
STM32:STM32是STMicroelectronics(意法半导体)推出的一系列32位ARM Cortex-M微控制器(Microcontroller)产品。STM32系列产品具有高性能、低功耗、丰富的外设和灵活的封装等特点,广泛应用于各种嵌入式系统中,包括工业控制、消费电子、汽车电子、智能家居、医疗设备等领域。
3.2 安装、认识软件Keil和硬件STM32F103开发板
Keil软件:Keil软件是一款专业的嵌入式系统开发工具,提供了一套完整的工具链和友好的开发环境,帮助开发者轻松地进行嵌入式系统的软件开发、调试和部署。
通过Keil5安装包安装Keil软件并且安装STM32芯片包。
安装推荐博客(若侵权告知必删):http://t.csdnimg.cn/QKrLf
STM32F103开发板:STM32F103开发板是一种用于STM32F103系列微控制器的软件开发和验证的硬件平台,具有丰富的外设和功能,为开发者提供了方便快捷的开发环境。
图1 F103_霸道V2版本硬件资源标准图
3.3 学习调试工程
调试工程的目的:
1.仿真调试实时跟踪代码的运行,逐步执行代码,程序出现问题并能跟踪到问题所在;
2.设置调试断点,使程序运行到指定位置停下;
3.能够观察全局变量的变化、寄存器的变化;
4.可以查询某个内存地址的存储的数据;
5.显示调用栈的内容,也就是函数指针和局部变量;
6.可以查询片内外设和片外外设的寄存器变化,对照芯片手册的相应寄存器的说明,便可以知道相应外设寄存器的值是否出错。
7. 调试工具栏是我们在线调试时常用的工具栏(按钮),掌握这些按钮就能快速的调试代码,也即能快速的定位我们程序哪些地方存在不足。
图2 工具栏介绍
图3 代码调试心得
图4 工具栏介绍
3.4 Keil工程软件的配置
图5 工程配置的主要方向 .
4 深入解析
思考一
利用Keil5打开所给例程中任何一个工程文件,调查资料并解释Keil5左侧Project窗口中每个目录的作用,以及每个文件的作用。
1.以项目“12-GPIO输出—使用固件库点亮LED”为例子,认识本地工程文件夹:
图6 本地工程文件夹
Doc文件夹:用来存放程序说明的文件,由写程序的人添加。(可以放工程说明.txt)
Libraries文件夹:存放的是库文件(CMSIS: 里面放着跟 CM3 内核有关的库文件 STM32F10x_StdPeriph_Driver: STM32 外设库文件)
Listing文件夹:存放编译器编译时候产生的 C/汇编/链接的列表清单
Output文件夹:存放编译产生的调试信息、hex 文件、预览信息、封装库等
Project文件夹:用来存放工程
User:用户编写的驱动文件(stm32f10x_conf.h:用来配置库的头文件
stm32f10x_it.h stmm32fl0x_it.c:中断相关的函数都在这个文件编写,暂时为空 main.c:main 函数文件)
2.进入keil后的project目录介绍:
图7 Keil中的project目录
STARTUP文件夹:启动文件,由汇编语言编写, 主要负责启动,因为stm32单片机的内部结构非常复杂,启动代码必须使用更高效率的汇编语言,由ST公司提供,一般不需要修改。启动文件由汇编代码编写,一般命名为startup_xxx.s,xxx为支持的某种芯片,比如stm32f10x(意法半导体stm32f10x系列)等Cortext-M0/M3/M4内核芯片。它们的代码格式非常相近,根据启动文件代码由上到下的编写顺序。(可分为五部分:1.堆栈空间定义;2.存放中断向量表;3.复位中断函数(Reset_Handler);4.其它中断异常服务函数,以及弱[WEAK]声明;5.将堆栈地址传递给库函数,利用库函数初始化堆栈,和库函数自身初始化。)
CMSIS文件夹:STM32固件库的CMSIS。CMSIS是ARM公司与多家不同的芯片和软件供应商一起紧密合作定义的,提供了内核与外设、实时操作系统和中间设备之间的通用接口。
图8 基于CMSIS标准的软件架构
core_cm3.h + core_cm3.c:Cortex-M3内核及其设备文件。访问Cortex-M3内核及其设备:NVIC,SysTick等;访问Cortex-M3的CPU寄存器和内核外设的函数。
stm32f10x.h:这个头文件包含了STM32的大部份定义:
a.定义芯片的类型,如#define STM32F10x_MD
b.定义是否包含标准库,#define USE_STDPERIPH_DRIVER
c.定义外部振荡器频率,#define HSE_VALUE
上面三个定义,建议在main.c文件中刚开始就定义好,或者是在编译器选项中定义好,这样就可以不修改这个文件了。
d.采用枚举的方式定义中断号。定义中断号在stm32f10x_it.c stm32f10x_it.h
e.包含 core_cm3.h,system_stm32f10x.h (#include "core_cm3.h" #include "system_stm32f10x.h" #include <stdint.h> )
f.定义数据类型,例如:typedef uint32_t u32此外还定义了FlagStatus,ITStatus及ErrorStatus等。u8,s8等为了兼容以前的库所定义的数据,建议程序中用标准的uint8_t这样的类型。此外还定义了bool,FlagStatus,alStatus及ErrorStatus
g.定义外设结构体,地址及用到的数据常量。
h.包含stm32f10x_conf.h来配置外设。#ifdef USE_STDPERIPH_DRIVER #include "stm32f10x_conf.h" #endif
i.定义位操作的宏
system_stm32f10x.h和system_stm32f10x.c:
a.定义一个全局变量 extern uint32_t SystemCoreClock: 系统时钟频率与你选择有关
b.SystemInit():这个函数就是启动文件中调用的函数
(1) 在system_stm32f10x.c的开始部份,选择相关的系统时钟频率,如#define SYSCLK_FREQ_24MHz 24000000
(2) 通过SystemInit()函数,就将SYSCLK = HCLK = PCLK1=PCLK2=PLL输出24MHz。注意:这个频率为HSE为8MHz时为条件,如果HSE不为8MHz或用HSI时,就会有问题。
c.SystemCoreClockUpdate():更新SystemCoreClock的值,与系统频率一致。
可能看到,这个文件中的RCC设置很有局限性,所以在程序中,可以不用它,而用标准库存中的stm32f10x_rcc中的函数进行设置。
FWLB文件夹:FWLIB下面存放ST官方提供的外设固件库源文件和头文件。每个.c源文件文件对应一个,h头文件。
USER文件夹:用户程序,其中main.c是主程序文件,是用户需要编写的程序部分;该目录下的库文件,一般不需要修改。stm32f10x_it.c/.h中主要用来定义部分中断服务函数。system_stm32f10x.c主要定义systemInit等时钟初始化函数。stm32fl0x_conf.h:用来配置库的头文件。
DOC文件夹:存放开放文档、需求文档
图9 拓展补充总结
图10 代码层次结构图
3.Keil文件类型概述:
Keil文件可以分为7类:
1、Project Files工程类型文件:
工作空间文件:(这类文件不能删除) *.uvmpw:µVision Project file for Multiple Projects多工程文件,也就是我们说的工作空间文件。
工程文件:(这类文件不能删除) *.uvprojx:µVision5工程文件
*.uvproj:µVision4工程文件 *.uv2:µVision3工程文件
工程选项配置文件:(这类文件不能删除) *.uvoptx:µVision5工程选项配置文件
项目界面布局文件:(这类文件可以删除) *.uvguix[.user-name]:µVision5项目界面布局文件。删除之后,重新打开工程,界面布局会恢复到默认布局。如Demo.uvguix.Administrator。
*.uvguix[.user-name]:µVision4项目界面布局文件。
*.uvopt:µVision4工程选项配置文件
2、Source Files源代码类型文件:
*.c:C源文件 *.h:C头文件 *.cpp:C++源文件 *.s:汇编源文件
*.a51:汇编源文件 *.a66:汇编源文件 *.inc:汇编头文件
*.src:C编译器生成的其他源文件
3、Listing Files链接类型文件:
这一类文件属于中间文件,一般在编译过程中产生。可以在工程目标选项中配置对应的链接文件。Project -> Options for Target -> Listing。
*.map:存储镜像文件
*.i:C预处理器输出文件 *.scr:链接器分散加载器文件
*.lst:C编译器或汇编器生成的文件 *.m51:同样也是map文件
*.m66:同样也是map文件 *.htm:链接器的列表文件
4、Object and HEX Files目标和Hex类型文件:
这一类文件同样属于中间文件,一般在编译过程中产生。但这类文件比较重要,调试信息、预览信息、可执行文件等都在这里面。
Project -> Options for Target -> Output。
*.hex:可执行文件
*.axf:包含调试信息的程序文件 有时候我们调试出错,可能是axf没有文件。
*.d:编译生成的依赖文件 一般一个.c文件对应一个.d文件。
*.o:也是目标的依赖文件 重定位定址的依赖文件。
*.lib:库文件 生成的库就在这里。 *.elf:ELF/DWARF链接的文件
*.crf:浏览信息文件 使用Go to Definition Of 功能,就需要有这类文件。
5、Build Files编译类型文件 Debugger Files调试类型文件:
编译和调试,其实是两类不同文件,综合在一起介绍。
*.bat:批处理文件 ._IA, .__I, ._II, .SCR:工具调用文件
*.ini:于初始化源码文件
6、Other Files其他类型文件;
*.pack:软件(支持)包文件 *.sct:链接控制文件
*.lnp:连接器传递命令文件 *.dep:目标编译依赖文件
*.cdb:µVision设备数据库文件
思考二
通过调试源代码“12-GPIO输出—使用固件库点亮LED”,深入熟悉调试功能的用法。
调试功能的用法:
1.理解示例代码:首先,仔细阅读“12-GPIO输出—使用固件库点亮LED”的代码,理解代码中的每一行都在做什么。
2.设置调试环境:确保开发环境已经正确设置,连接了STM32F103开发板到电脑。
3.编译代码:在Keil中编译代码,确保没有语法错误或者编译错误。
4.下载代码到目标板:使用调试器将编译后的代码下载到STM32F103开发板上。
5.启动调试会话:在开发工具中启动调试会话,连接到目标板上的STM32F103。
6.设置断点:在代码中设置断点,例如可以在点亮LED的代码行设置一个断点,这样当程序执行到该行时会暂停。
7.单步执行代码:使用单步执行功能,逐步执行代码,观察代码的执行流程以及变量的值变化。可以在每一步检查GPIO端口的状态,以确保GPIO配置正确。
8.观察LED状态:在单步执行过程中,观察LED的状态是否符合预期。如果LED没有点亮,可以逐步排查问题,例如检查GPIO配置、LED连接是否正确等。
9.使用调试工具:利用调试工具提供的功能,如变量监视器、寄存器查看器等,进一步深入分析代码的执行情况。
10.调试问题:如果遇到问题,可以使用调试工具提供的功能来定位和解决问题。可以通过查看变量的值、观察程序执行流程等方法来调试代码。
思考三
查阅资料解释Keil软件Option选项卡下面每个子目录下面可配置的参数,以及实现的功能。
Device目录: "search"框可以输入芯片名称,快速找到对应的芯片;芯片结构图里也可以选择芯片,这里芯片是按厂家区分,并且芯片结构图里也可以选择芯片,这里芯片是按厂家区分;”Software Pack”框可以查看当前芯片包的版本。具体的software component 在Manage Run-Time Environment对话框可以看到:点击
Target目录:从内容可以看得出来是工程目标的调试晶振频率、选择的编译器、RAM和ROM分配的地址空间等。” STMicroelectronics”框可以查看芯片型号;” Code Generation”框可以选择编译器版本;
图11 target分区域
Target区域介绍:
第1处:晶振频率
这个值主要用于仿真调试用,使用硬件调试则是根据实际的使用频率。
第2处:操作系统
是否选择Keil自带的RTX操作系统,一般都不选。
第3处:系统预览文件
这里是根据前面选择的device自动确定的对应芯片的svd文件,这个文件一般在安装目录下,如果想要更改就勾选Use Custom SVD File再选择文件所在目录。System Viewer功能是用来仿真时观察和修改芯片的在外设寄存器用的,它按芯片厂家的手册直接列出所有寄存器的位和功能指示。在仿真过程中可以修改和查看。
第4处:使用交叉模块优化、使用微库microLIB
跨模块优化:使能链接器反馈文件,从而能够更深层次的代码优化。一般不使用
微库:是缺省的C库,而且microLIB进行了高度优化。如果不勾选“Use MicroLIB”,keil会连接标准C库。所以勾选“Use MicroLIB”会减小code大小。它不完全兼容ANSI,但已能满足大多数的应用。
第5处:ROM/RAM存储地址
这里的ROM存储指的是程序储存的地址,分片外和片内两种。
程序存储在片内好理解(初学者一般下载程序都是下载到片内FLASH),片外存储程序对于初学者来说比较少见,一般都是项目做大了,或有特殊要求时,片内不够使用了才将程序存储在片外。
Output目录:”Select folder for objects”框可以选择存放编译过程中产生的过程文件的目录;“Name of executable”框显示可执行文件名称;下面的选项为输出可执行文件,输出这些信息都很费时间,如果都不勾选这些选项,编译速度会很快。”Debug Infomation”选项输出调试信息,勾选上这个选项,才可以进行调试;”Create HEX File”选项输出可执行Hex文件;“Browse Information”选项输出浏览信息,勾选上这个才能使用go to definition of这个功能。
Listing目录:生成列表相关的选项,对代码分析比较透彻的工程师就需要了解这个选项。常见的就是map地址的分布,就是在这里配置生成的的。
图12 Listing分区域
Listing区域介绍:
第1处:输出路径、宽高
选择列表文件输出的文件夹。可设置文件页面的宽度,长宽
第2处:输出汇编列表
勾选上会输出汇编列表信息(产生后缀为 .lst的文件)。如果工程中没汇编文件,则不会输出信息。这个文件包含了有关编译过程的很多信息,比如编译器版本号、源文件名称,由C语言程序编译产生的汇编代码,以及编译过程中产生的错误、警告信息,这些信息和编译时屏幕显示的提示信息相同。
第3处:C编译列表
C编译程序列表选项,勾选上可生成.txt, .i文件。
第4处:链接列表
可选择生成或禁止生成.map文件。可设置生成代码的详细信息。可选择性的选取输出MAP文件。map文件是通过编译器编译之后,集程序、数据及IO空间的一种映射文件。在遇到内存越界,或溢出的情况时,可以分析map文件。通过map文件可以知道函数大小,入口地址等一些重要信息。
Memory Map:内存映射 Callgraph:图像映射 Symbols:符号
Cross Reference:交叉引用 Size Info:大小信息
Totals Info:统计信息 Unused Section Info:未调用模块信息
Veneers Info:装饰信息
User目录:这个选项是针对用户而设计的,一般不常用,方便用户执行一些程序。
Before Compile C/C++ File参数: 编译c文件之前
Before Build参数:编译之前 After Build/Rebuild参数:编译之后
注:Compile:只编译选定的目标,可以是单个文件,不管之前是否已经编译过,在这个过程中检查语法错误。但并不生成可执行文件
Build:只编译工程中上次修改的文件及其它依赖于这些修改过的文件的模块,同时重新链接生成可执行文件。如果工程之前没编译链接过,它会直接调用Rebuild All。另外在技术文档中,Build实际上是指increase build,即增量编译。
Rebuild:不管工程的文件有没有编译过,会对工程中所有文件重新进行编译生成可执行文件,因此时间较长。
C/C++目录
1. 预处理(Preprocessor Symbols):主要就是预定义功能,相当于程序中的#define xxxx。
2.语言代码生成(Language / Code Generation):编译,链接到最后生成代码,编译优化
[Execute only Code设置编译器命令行]:只生成执行代码,防止编译器生成任何数据访问代码部分。
[Optimize代码优化]:有Level0 - Level3四个选项,初学者、在线调试建议使用Level0,也就是不优化,这样执行的效果才和代码一样。如果配置成Level3,在线调试可能有些地方优化而不能打断点。
[Optimize for Time优化时间]:即优化代码中费时的地方,比如有些算法,本身代码量就比较大,运行需要很长时间(假如需要2秒),这个时候勾选上该功能,会发现运行时间有比较明显的减少(或许不到1秒时间)。
[Split Load and Store Multiple]:加载和存储多个分裂,非对齐数据采用多次访问方式。当 LMD/STM 指令有 4 个以上产生时,列分裂LMD 和 STM 指令,以减不中断延迟。
LDM:(load much)多数据加载,将地址上的值加载到寄存器上
STM:(store much)多数据存储,将寄存器的值存到地址上
[One ELF Section per Function]:优化每一个函数 ELF 段,每个函数都会产生一个 ELF 段,勾选上,允许优化每一个 ELF 段,最会将需要的函数链接成一个大的ELF文件。但是如果没有勾选,Keil将每个文件编译成一个ELF文件(即使文件中用未被使用的函数),最会链接成一个ELF文件。所以勾选会使code变小。这个选项可以减少潜在的共享地址、数据和函数之间的字符串。
[strict ANSI C]:编译时严格按照标准的ANSI C进行检查。
[Enum Container always int]:枚举总是int型
[enum_is_int]:枚举时成员变量类型为int型。
[Plain Char is Signed]:纯字符标记为字符
[Read-Only Position Independent]:为常量生成独立的代码空间。我们定义字库变量为常量,勾选该选项,会将这些字库变量放在独立的代码空间。
[Read-Write Position Independent]:为可读写代码生成独立的代码空间。
[Warnings]:警告
No Warnings:不会有警告提示和输出;
All Warnings:所有警告提示和输出。
Thumb Mode:Thumb模式。
No Auto Includes:不自动添加头文件,不勾选该选项,编译器就会在Keil安装路径寻找你工程中.h文件。
举例:我们定义uint8_t是定义在stdint.h文件里面的,但是我们工程目录下一般是没有stdint.h文件。这时候,编译器就会在Keil路径下去寻找stdint.h文件。
C99 Mode:C99标准模式。(C语音有标准有多个版本,如C89、C90、C99等)
3.include path包含路径:指定工程中使用的h文件的存放位置,让编译器找到对应的文件
4.多功能控件Misc Controls:指定没有单独的对话框控件
5.编译器控制字符串Compiler control string:编译器执行的命名,显示当前在编译器命令行指令。
Asm目录:汇编选项。有条件的装配控制符号(Conditional Assembly Control Symbols):指定汇编条件,这里类似C/C++中的预处理。
语言代码生成(Language / Code Generation)和C/C++中类似
Linker目录:链接配置选项。可以修改、编辑和查看链接的文件。
图13 Linker区域划分
区域介绍:
第1处:使用分散文件加载对话框Target页面(Use Memory Layout from Target Dialog)
Make RW Sections Position Independent:使RW段独立
【设置编译器命令行:–rwpi】
启用时:变量区域(包含RW和ZI)具有独立地址。
禁用时:变量区域(包含RW和ZI)位于绝对的内存地址。
Make RO Sections Position Independent:使RO段独立
【设置编译器命令行:–ropi】
启用时:常量和代码区域(RO)具有独立地址。
禁用时:常量和代码区域(RO)位于绝对的内存地址。
Don’t Search Standard Libraries:不搜索标准库
【设置编译器命令行:–noscanlib】
禁用默认编译器运行时库的扫描。
Report ‘might fail’ Conditions as Errors:报告’might fail’条件认为是错误
【设置编译器命令行:–strict】
报告的条件可能导致失败的错误,而不是警告。
X/O Base:X/O基地址
【设置编译器命令行:–xo_base=address】
R/O Base:R/O基地址
【设置编译器命令行:–ro_base=address】
R/W Base:R/W基地址
【设置编译器命令行:–rw_base=address】
disable Warnings:警用警告
【设置编译器命令行:–diag_suppress】
第2处:分散文件(Scatter File)
这里可以加载、查看和编辑分散文件。点击后面就的三点“…”可以加载文件;点击“Edit…”查看和编辑对应的文件。
第3处:两个选项和C/C++选项一样。
Debug目录:DLL文件属于Keil自身的配置。
CPU/Driver DLL - Parameter:CPU驱动文件和参数
Dialog DLL - Parameter:会话框DLL文件和参数
图14 Debug区域介绍
图15 Debug目录下的setting选项
Utilities目录:配置FLASH菜单命名(Configure Flash Menu Command):这里是二选一选项,一般使用上面的“Update Target Driver for Flash Programming”列表选择和调试接口一致的驱动。
Use Debug Driver:使用调试驱动
Update Target Before Debugging:调试之前更新目标
一般都勾选上,因为我们下载程序之前检测到代码修改了,就会重新编译程序(也就是更新目标)
相关文章:
学习STM32(1)--Keil软件安装与基本操作和Keil 软件高级应用
目录 1 引 言 2 实验目的 3 实验内容 3.1 认识单片机和STM32 3.2 安装、认识软件Keil和硬件STM32F103开发板 3.3 学习调试工程 3.4 Keil工程软件的配置 4 深入解析 思考一 1.以项目“12-GPIO输出—使用固件库点亮LED”为例子,认识本地工程文件夹…...
独立开发者系列(37)——理解async和await
1.理解同步与异步 同步就是执行某个任务A-B-C-D,就是严格按照顺序执行,可以理解为正常的代码逻辑,如果运行的代码都不是很消耗时间的情况系啊,同步可以减少编程的复杂度。但是对于请求远程服务结果的这种服务,如果同步…...
在C#中为图片添加数字水印的几种办法
最近在写个人项目时,有遇到需要将图片加上水印防止被盗取的需求。这里找了几种实现方式,可供有需要的朋友参考。 本身我不是搞算法这块的,所以这里只是找了一些实现,也没有继续深究下去。 以前在学校的时候从书上了解过可以将一…...
Vue的学习(二)
目录 一、class及style的绑定 1.v-bind:class绑定类名 绑定class为对象 编辑2. v-bind:class绑定类名 绑定class为对象 3.v-bind:class绑定类名 绑定class为数组 1) v-bind:class绑定类名 绑定class为数组 方法一: 2) v-bind:class绑定类名 绑定class为数组…...
PointNet和PointNet++论文解读
目录 一、导言 二、PointNet介绍 三、PointNet网络结构 1、损失函数 2、正则化 四、PointNet 1、分层次的点集抽象层 一、导言 PointNet来自CVPR2017,是最早直接处理点云数据用于计算机视觉的模型,并运用于分割、检测、场景理解任务,P…...
Pytest测试报告生成专题
在 pytest 中,你可以使用多个选项生成不同格式的测试报告。以下是几种常用的生成测试报告的方法: 1. 生成简单的测试结果文件 你可以使用 pytest 的 --junitxml 选项生成一个 XML 格式的测试报告,这个报告可以与 CI/CD 工具集成。 pytest --junitxml=report.xml这将在当前…...
【在Python中读取Excel文件内容】
在Python中读取Excel文件内容,常用的库有xlrd(主要用于读取.xls文件,但不支持.xlsx的较新版本),以及openpyxl(专门用于读取和写入.xlsx文件)和pandas(提供了一个更高级别的接口来处理…...
尚品汇-首页三级分类实现-nginx静态代理生成的静态页面(二十六)
目录: (1)问题详解 (2)首页商品分类实现 (3)修改web-all模块 (4)页面渲染 (1)问题详解 (2)首页商品分类实现 前面做了…...
HTML 段落
HTML 段落 概述 HTML(超文本标记语言)是构建网页的标准语言,而段落是构成网页内容的基本单元。在HTML中,段落是通过<p>标签来定义的。本文将详细介绍HTML段落的相关知识,包括段落的基本结构、样式设置、以及在…...
Http自定义Header导致的跨域问题
最近写一个小项目,前后端分离,在调试过程中访问远程接口,出现了CORS问题,接口使用的laravel框架,于是添加了解决跨域的中间件,但是前端显示仍存在跨域问题,以为自己写的有问题,检查了…...
20240805 每日AI必读资讯
世界首例!AI机器人做牙科手术,8倍速诊疗比人类医生更精准 - Perceptive:让人工智能控制的自主机器人,首次对人类患者进行了全过程的牙科手术,速度大约是人类牙医的8倍。 - 两项新技术 1、OCT 3D成像系统:…...
COMSOL金属氢化物-放氢过程
在此记录下放氢过程的软件设置思路 1、采用的是"达西定律""层流" 物理场,其中"层流"物理场选择了”弱可压缩流动“,这里主要是选择”可压缩流动“的话,算出来的瞬时流量值跟实测差距太大了。 2、设置"达西…...
Unity2D在处理精灵表过程中出现不清晰的解决方法
问题阐述 在我们拿到一张精灵表的时候,我们通常要进行切割。但这样往往导致切割的效果不是很好,这里举一个简单的例子。 这是举例子用到的精灵表 我们先对他进行切割处理。 将single改为Multiope 进入精灵编辑器后,我们选择切割方式 此时我…...
C语言第13篇
1.下面程序是计算n个数的平均值,请填空.______ #include<stdio.h> void main( ) { int i,n; float x,avg0.0; scanf("%d",&n); for(i0;i<n;i) { scanf("%f",&x); avgavg______; } avg________; printf("avg%f\n",avg); } A) …...
Meta Reality Labs:巨额亏损背后的挑战与展望
一、财务概况 自2020年以来,Meta的Reality Labs部门累计亏损已超过450亿美元,其中2023年的亏损达到160亿美元,2024年第一季度亏损38亿美元,分析师预计第二季度亏损可能接近50亿美元。尽管投入巨大,Reality Labs的收入却呈现下降趋势,与不断增加的支出形成鲜明对比。 二…...
linux安装docker(实操教程)
一、安装前准备工作 1.查看服务器操作系统版本 2.查看服务器的操作系统内核版本 3.安装依赖包 yum install -y yum-utils device-mapper-persistent-data lvm2如果不是root用户登陆的系统,需要手动输入sudo -i切换到root帐户 4.设置阿里云docker-ce镜像源 yum-c…...
隐写工具steghide linux编译安装
1、git clone https://github.com/StefanoDeVuono/steghide.git 2、autoreconf -i 3、./configure 4、make 编译完成后再src目录下又steghide执行下程序 报错:configure: error: cannot find required auxiliary files: compile时需要执行autoreconf 如果往j…...
山寨手机 老手机 山寨平板 提高速度 cpu超频的方法360超级root和setup
第一,挂机 ,按音量键 ,看机器的配置,注意,山寨机器的 安卓版本不可信啊,安卓4.4.2会标注安卓10 第二 ,下载360超级root, http://2012rs.mysxl.cn/ https://xdaforums.com/t/setcpu-for-root-us…...
【两整数之和】python刷题记录
R3-位运算专题。 仲夏之约,留尺一寸,小记一事,算是了结。 无进位和 与 异或运算 规律相同,进位 和 与运算 规律相同(并需左移一位) 牛啊牛啊 class Solution:def getSum(self, a: int, b: int) -> int…...
常见cms漏洞之dedecms
DedeCMS是织梦团队开发PHP 网站管理系统,它以简单、易用、高效为特色,组建出各种各样各具特色的网站,如地方门户、行业门户、政府及企事业站点等。 下载地址请网上自行寻找 搭建方式选择php study 首先搭建环境 #前台http://localhost/dedecm…...
基于微信小程序的微课堂笔记的设计与实现(源码+论文+部署讲解等)
博主介绍:✌全网粉丝10W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术栈介绍:我是程序员阿龙ÿ…...
如何构建AI产品:OpenAI与前Shopify产品负责人Miqdad Jaffer的经验分享
一、引言 构建AI产品是一项复杂且充满挑战的任务,尤其是当涉及到面向消费者的解决方案时。在最近的一期播客节目中,OpenAI 和前Shopify产品负责人 Miqdad Jaffer 分享了他在构建AI产品的经验和策略。下面我们将探讨构建AI产品的最佳实践,以及…...
C++的结构体、联合体、枚举类型(一)
1.C++的结构体 2.C++的联合体 3.C++的枚举类型 1.C++的结构体 (1)C++中定义结构体变量,可以省略struct关键字 struct XX{…}; XX x;//定义结构体变量直接省略struct(2)C++结构体中可以直接定义函数,谓之成员函数(又叫方法)(3)在成员函数中可以直接访问该结构体的成员变…...
白骑士的PyCharm教学高级篇 3.5 团队协作与集成开发
系列目录 上一篇:白骑士的PyCharm教学高级篇 3.4 服务器部署与配置 在现代软件开发中,团队协作和集成开发环境(IDE)的使用至关重要。PyCharm不仅提供了强大的个人开发支持,还为团队协作和集成开发提供了丰富的功能和工…...
c++ 21 指针
*像一把钥匙 通过钥匙去找内存空间 间接修改内存空间的值 不停的给指针赋值 等于不停的更改指针的指向 指针也是一种数据类型 指针做函数参数怎么看都不可以 指针也是一个数据类型 是指它指向空间的数据类习惯 作业 野指针 向null空间地址copy数据 不断改变指针指向 …...
书籍将整数字符串转成整数值(5)0804
题目 给定一个字符串str,如果str符合日常书写的整数形式,并且属于32位整数的范围,返回str所代表的整数值,否则返回0。 举例 str“123” 返回 123 str“023” 因为023 不符合日常的书写习惯,所以返回0 str“A13” …...
计网:从输入URL到网页显示期间发生了什么
1、URL包含的信息 我们输入的url中包含着一些信息: http:表示的此次我们使用的什么协议/www.baidu.com:表示的是我们想要访问的服务器名称,也就是域名dir3/home.html:表示我们所要访问的资源 2、通过DNS解析URL获得I…...
pg数据库存储过程
一、存储过程 CREATE OR REPLACE PROCEDURE public.p_dm_stock_fx_hangye_d(IN dt_date character varying) LANGUAGE plpgsql AS $procedure$ begin delete from dm_stock_fx_hangye_d where stock_date dt_date; commit; insert into dm_stock_fx_hangye_d select t…...
Arduino PID库 (2) –微分导致的过冲
Arduino PID库 (2) – Derivative Kick 参考:手把手教你看懂并理解Arduino PID控制库——微分冲击 pid内容索引-CSDN博客 Arduino PID库 (1)– 简介 问题 此修改将稍微调整derivative term。目标是消除一种称为“…...
基于Tensorflow.js的花卉识别编程实践
使用TensorFlow.js进行编程有许多优点,特别适合开发机器学习和深度学习的应用。TensorFlow.js可以直接在浏览器中运行,无需服务器或特殊环境配置。这使得开发者可以轻松地创建和部署基于Web的机器学习应用。TensorFlow.js提供了许多预训练模型࿰…...
繁简之争:为什么手机芯片都是 ARM
RISC 和 CISC 指令集 之前的文章《揭秘 CPU 是如何执行计算机指令的》中说到,如果从软件的角度来讲,CPU 就是一个执行各种计算机指令(Instruction Code)的逻辑机器。 计算机指令集是计算机指令的集合,包括各种类型的…...
《机器人SLAM导航核心技术与实战》第1季:第8章_激光SLAM系统
视频讲解 【第1季】8.第8章_激光SLAM系统-视频讲解【第1季】8.1.第8章_激光SLAM系统_Gmapping算法-视频讲解【第1季】8.2.第8章_激光SLAM系统_Cartographer算法-视频讲解【第1季】8.3.第8章_激光SLAM系统_LOAM算法-视频讲解 第1季:第8章_激光SLAM系统 先 导 课第…...
Qt之Gui
组件依赖关系 应用 #mermaid-svg-GADicZtZJRVVUeiF {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GADicZtZJRVVUeiF .error-icon{fill:#552222;}#mermaid-svg-GADicZtZJRVVUeiF .error-text{fill:#552222;stroke:#…...
Redis的回收策略(淘汰策略)
volatile-lru :从已设置过期时间的数据集( server.db[i].expires )中挑选最近最少使用的数据淘汰 volatile-ttl : 从已设置过期时间的数据集( server.db[i].expires ) 中挑选将要过期的数据淘汰 volatile…...
基于Springboot的个人博客系统
文章目录 介绍访问地址一、功能展示1.前台首页归档相册留言关于我登陆注册 2.后台管理系统登陆页面首页文章管理相册管理写博客访客统计 介绍 基于Java(Springboot)可以用做毕业设计的个人博客系统,包括网站前台和后台管理系统两部分。网站前…...
J030_TCP通信
一、需求描述 使用TCP协议进行通信 1.1 一发一收 1.1.1 Client package com.itheima.tcp1;import java.io.DataOutputStream; import java.io.OutputStream; import java.net.Socket;public class Client {public static void main(String[] args) throws Exception {//1、…...
单片机复习题
第1章 思考题及习题 一、填空 1. 除了单片机这一名称之外,单片机还可称为 或 。 2.单片机与普通微型计算机的不同之处在于其将 、 、和 三部分,通过内部 连接在一起,集成于一块芯片上。 …...
Java | Leetcode Java题解之第322题零钱兑换
题目: 题解: public class Solution {public int coinChange(int[] coins, int amount) {int max amount 1;int[] dp new int[amount 1];Arrays.fill(dp, max);dp[0] 0;for (int i 1; i < amount; i) {for (int j 0; j < coins.length; j)…...
【MYSQL】MYSQL逻辑架构
mysql逻辑架构分为3层 mysql逻辑架构分为3层 1). 连接层:主要完成一些类似连接处理,授权认证及相关的安全方案。 2). 服务层:在 MySQL据库系统处理底层数据之前的所有工作都是在这一层完成的,包括权限判断,SQL接口&…...
SQL Server数据库的清洁工:垃圾回收机制解析
SQL Server数据库的清洁工:垃圾回收机制解析 在SQL Server的复杂而精密的数据库管理系统中,垃圾回收机制扮演着至关重要的角色。它负责清理不再需要的数据,释放空间供新数据使用。本文将深入探讨SQL Server中数据库垃圾回收机制的工作原理&a…...
使用MailKit在.NET Core中收发邮件的完整示例
在.NET Core中处理邮件收发操作时,MailKit是一个非常强大的库。它支持SMTP、POP3、IMAP等多种协议,可以轻松实现发送、接收、以及管理邮件的功能。下面我们将通过一个详细的示例,展示如何在.NET Core项目中使用MailKit来收发邮件,…...
flask高频面试题
目录 高频面试题及答案1. 如何在Flask中处理数据库迁移?2. Flask如何处理文件上传?3. 如何在Flask中处理跨域请求(CORS)?4. 如何在Flask中实现用户认证?5. Flask如何处理会话?6. Flask如何处理表…...
【算法模板】图论:Tarjan算法求割边割点
概念 割边(Bridge 或 Cut Edge) 定义: 在一个无向连通图中,如果删除某条边后,图不再连通(即任意两点之间不能相互到达),则称该边为割边。割边也被称为桥,因为它像桥梁…...
python——joblib进行缓存记忆化-对计算结果缓存
问题场景 在前端多选框需要选取多个数据进行后端计算。 传入后端是多个数据包的对应路径。 这些数据包需要按一定顺序运行,通过一个Bag(path).get_start_time() 可以获得一个float时间值进行排序,但由于数据包的特性,这一操作很占用性能和时…...
01 计算机系统基础-2
操作系统 进程管理 进程管理是操作系统的核心,但如果设计不当,就会出现死锁的问题。如果一个进程在等待一件不可能发生的事,则进程就死锁了。而如果一个或多个进程产生死锁,就会造成系统死锁。基于死锁产生机制及解决方案&#…...
2024死磕小红书,一定能赚到钱!
2024死磕小红书,一定能赚到钱!在文末领取小红书运营完全指南电子书 从2023年起,小红书这股热乎劲儿就像开了挂,突然间就成了人人想蹭的“显学”。大伙儿都想趁着平台红利期,分一杯羹。说来惭愧,我从2020年…...
关于JS中的AO对象
在JavaScript中,AO对象(Activation Object,激活对象)是与函数执行上下文相关的概念。每当一个函数被调用时,都会创建一个新的执行上下文,这个执行上下文包含一个AO对象,用于存储在函数执行期间创…...
49 序列解包的多种形式和用法
序列解包(Sequence Unpacking)是 Python 中非常重要和常用的一个功能,可以使用非常简洁的形式完成复杂的功能,提高了代码的可读性,减少了程序员的代码输入量。 x, y, z 1, 2, 3 # 多个变量同时赋值 v_tuple (False…...
2-55 基于matlab的 永磁同步电机滑膜观测器估算电机转速
基于matlab的 永磁同步电机滑膜观测器估算电机转速。精度比传统观测器精度高。分别输出电机转速估计值与实际值、电机转速估计误差、电机转子位置估计值与实际值、电机转子位置估计误差。程序已调通,可直接运行。 2-55滑膜观测器估算电机转速 - 小红书 (xiaohongsh…...
手机在网状态接口如何对接?(二)
一、什么是手机在网状态? 传入手机号码,查询该手机号的在网状态,返回内容有正常使用、停机、在网但不可用、不在网(销号/未启用/异常)、预销户等多种状态。 二、手机在网状态使用场景? 1.用户验证与联系…...