正点原子STM32新建工程
MDK 源自德国的 KEIL 公司,是 RealView MDK 的简称。
MDK5 由两个部分组成: MDK Core 和 Software Packs。
MDK Core 又分成四个部分: uVision IDE with Editor(编辑器), ARMC/C++ Compiler(编译器), Pack Installer(包安装器), uVision Debugger with Trace(调试跟踪器)。Software Packs(包安装器)又分为: Device(芯片支持), CMSIS(ARM Cortex 微控制器软件接口标准) 和 Mdidleware(中间库)三个小部分。MDK5 安装包可以在: http://www.keil.com/demo/eval/arm.htm 下载到。
新建工程步骤:
- 首先,打开 MDK(以下将 MDK5 简称为 MDK)软件。然后点击 ProjectàNew uVision Project如图 3.2.1 所示:
弹出如图 3.2.2 所示界面:
在桌面新建一个 TEST 的文件夹,然后在 TEST 文件夹里面新建 USER 文件夹,将工程名字设为 test,保存在这个 USER 文件夹里面之后, 弹出选择器件的对话框,如图 3.2.3 所示。
因为 ALIENTEK 精英 STM32F103 所使用的 STM32 型号为 STM32F103ZET6,所以在这里我们选择STMicroelectronicsàSTM32F1 SeriesàSTM32F103àSTM32F103ZET6(如果使用的是其他系列的芯片,选择相应的型号就可以了,特别注意: 一定要安装对应的器件 pack 才会显示这些内容哦!!,如果没得选择,请关闭 MDK,然后安装 光盘: 6,软件资料\1,软件\MDK5\ Keil.STM32F1xx_DFP.1.0.5.pack 这个安装包)。
点击 OK,MDK 会弹出 Manage Run-Time Environment 对话框, 如图 3.2.4 所示:
这是 MDK5 新增的一个功能,在这个界面,我们可以添加自己需要的组件,从而方便构建开发环境直接点击 Cancel即可,得到如图 3.2.5 所示界面:
到这里只是建了一个框架,还需要添加启动代码,以及.c 文件等。启动代码是一段和硬件相关的汇编代码。 是必不可少的! 这代码主要作用如下: 1、堆栈(SP)的初始化; 2、初始化程序计数器(PC); 3、设置向量表异常事件的入口地址; 4、调用 main 函数。ST 公司提供了 3 个启动文件给我们,分别用于不同容量的 STM32 芯片,这三个文件是:startup_stm32f10x_ld.s
startup_stm32f10x_md.s
startup_stm32f10x_hd.s
其中, ld.s 适用于小容量 产品; md.s 适用于中等容量产品; hd 适用于大容量产品;这里的容量是指 FLASH 的大小.判断方法如下:
小容量: FLASH≤32K
中容量: 64K≤FLASH≤128K
大容量: 256K≤FLASH
开发板使用的是 STM32F103ZET6, FLASH 容量为 512KB,属于大容量产品,所以选择 startup_stm32f10x_hd.s 作为启动文件。
这三个启动文件在开发板光盘à4, 程序源码àSTM32 启动文件 文件夹里面(也可以从我们 的 论坛 下载 到 ,下 载地 址 : http://www.openedv.com/posts/list/313.htm ), 这 里我们 把startup_stm32f10x_hd.s 拷贝到刚刚新建的 USER 文件夹里面。不过这个启动文件,我们做了一点点修改,具体是 Reset_Handler 函数,该函数修改后代码如下:
这段代码屏蔽了复位中断服务函数(Reset_Handler)对函数 SystemInit 的调用,如果是库函数版本,可以取消这个函数的注释,并在外部实现 SystemInit 函数。在图 3.2.5 中,我们找到 Target1àSource Group1à双击à设置打开文件类型为 Asm Sourcefileà选择 startup_stm32f10x_hd.sà点击 Add,如图 3.2.6 所示:
这里看到的 2 个文件夹: Listings 和 Objects,是 MDK5 自行创建的,用于保存编译过程中生成的一些文件,后续会介绍。 添加完后,我们得到如图 3.2.7 所示的界面:
至此就可以开始编写自己的代码了。不过, 在此之前,我们先来做两件事: 第一件,先编译一下,看看什么情况?编译后如图 3.2.8 所示:
图 3.2.8 中 1 处为编译当前目标按钮; 2 处为全部重新编译按钮(工程大的时候,编译耗时较久,建议少用)。 出错和警告信息在下面的 Bulilt Output 对话框中提示出来了。 因为工程中没有 main 函数, 所以报错了。接下来,第二件事, 让我们看看存放工程的文件夹有什么变化?打开我们刚刚建立的TEST\USER 文件夹,可以看到里面多了 2 个文件夹: Listings 和 Objects,如图 3.2.9 所示:
在 USER 文件夹下, startup_stm32f10x_hd.s(启动文件)和 test.uvprojx(MDK5 工程文件)是我们必须用到的 2 个文件,然后 Listings 和 Objects 文件夹是 MDK5 自动生成的,如果打开Listings 和 Objects 文件夹,就可以看到里面多了一些文件,这就是 MDK 编译过程产生的中间文件, 如果工程量大,产生的文件更多(多的可达 100 MB 以上!!)。
MDK5.14 已经默认将这些文件生成在了 Listings 和 Objects 文件夹里面,但是 MDK5.11A及之前版本是不会自动生成这两个文件夹的,所有中间文件都是生成在工程同面目录下,也就是 USER 文件夹下,这样会显得比较混乱。这里,我们不用 MDK5 自己生成的这两个文件夹来存放中间文件, 而是在 TEST 目录下新建一个新的 OBJ 文件夹来存放这些中间文件。这样, USER 文件夹专门用来存放启动文件(startup_stm32f10x_hd.s)、工程文件(test.uvprojx)等不可缺少的文件,而 OBJ 则用来存放这些编译过程中产生的中间文件(包括.hex 文件也将存放在这个文件夹里面)。然后把 Listings 和Objects 文件夹里面的东西全部移到 OBJ 文件夹下(当然要先关闭 MDK 软件)。整理后效果如图 3.2.10 所示:
由于上面我们还没有任何代码在工程里面,这里我们把系统代码 COPY 过来(即 SYSTEM文件夹,该文件夹由 ALIENTEK 提供,可以在光盘任何一个实例的工程目录下找到,不过不要拷贝错了! 不要把库函数代码的系统文件夹拷贝到寄存器代码里面用,反之亦然! 这些代码在任何 STM32F10x 的芯片上都是通用的,可以用于快速构建自己的工程,后面会有详细介绍)。完了之后, TEST 文件夹下的文件如图 3.2.11 所示:
然后我们在 USER 文件夹下面找到 test.uvprojx,打开它, 然后在 Target 目录树上点击右键àManage Project Items, 弹出如图 3.2.12 所示对话框:
在上面对话框的中间栏,点新建(用红圈标出)按钮(也可以通过双击下面的空白处实现),新建 USER 和 SYSTEM 两个组。 然后点击 Add Files 按钮,把 SYSTEM 文件夹三个子文件夹里面的: sys.c、 usart.c、 delay.c 加入到 SYSTEM 组中。注意: 此时 USER 组下还是没有任何文件,得到如图 3.2.13 所示的界面:
点击 OK,退出该界面返回 IDE。 这时,我们在 Target1 树下发现多了 2 个组名,就是我们刚刚新建的 2 个组。如图 3.2.14 所示:
接着,我们新建一个 test.c 文件,并保存在 USER 文件夹下。 然后双击 USER 组,会弹出加载文件的对话框,此时我们在 USER 目录下选择 test.c 文件,加入到 USER 组下。 得到如图3.2.15 所示的界面:
至此,我们就可以开始编写我们自己的代码了。 我们在 test.c 文件里面输入如下代码:#include "sys.h"
#include "usart.h"
#include "delay.h"
int main(void)
{
u8 t=0;
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,115200); //串口初始化为 115200
while(1)
{
printf("t:%d\r\n",t);
delay_ms(500);
t++;
}
} 如果我们此时编译的话,生成的中间文件,还是会存放在 Listings 和 Objects 文件夹下,所以,我们先设置输出路径,再编译。 点击 (Options for Target 按钮),弹出 Options forTarget’ Target 1’ 对话框,选择 Output 选项卡à选中 Create Hex File(用于生成 Hex 文件,后面会用到) à点击 Select Folder for Objectsà找到 OBJ 文件夹à点击 OK,如图 3.2.16 所示:
接着,再设置 Listings 文件路径,在图 3.2.16 的基础上,打开 Listing 选项卡à点击 Select Folder for Listingsà找到 OBJ 文件夹à点击 OK,如图 3.2.17 所示:
最后点击 OK,回到 IDE 主界面。如图 3.2.18 所示:
这个界面,同我们刚输入完代码的时候一样,在第一行,会出现一个红色的“X”,把光标放上面,会看到提示信息:fatal error:‘sys.h’ file not found,意思是找不到 sys.h 这个源文件。这是 MDK4.7 以上才支持的动态语法检查功能,不需要编译,就可以实时检查出语法错误,方便编写代码,非常实用的一个功能,后续会详细介绍。当然,我们也可以编译一下, MDK 会报错,然后双击第一个错误即可定位到出错的地方,如图 3.2.19 所示:
双击红圈内的内容, 你会发现在 test.c 的第 1 行出现了一个浅绿色的三角箭头,说明错误是这个地方产生的(这个功能很实用的哦!熟悉 C++的人就知道 C++也有这个功能,快速定位错误、警告产生的地方。)。
错误提示,已经很清楚的告诉我们错误的原因了: 就是 sys.h 的 include 路径没有加进去,MDK 找不到 sys.h,从而导致了这个错误。现在我们再次点击 (Options for Target 按钮),弹出 Options for Target’ Target 1’ 对话框,选择 C/C++选项卡,如图 3.2.20 所示:
这里特别提醒大家: 图中 1 处,我们必须根据所用 STM32F1 型号的容量,来输入相关宏定义,对于 STM32F103 系列芯片,设置原则如下:
16KB≤FLASH≤32KB | 选择: STM32F10X_LD |
64KB≤FLASH≤128KB | 选择: STM32F10X_MD |
256KB≤FLASH≤512KB | 选择: STM32F10X_HD |
因为精英板使用的是 STM32F103ZET6, FLASH 容量为 512KB,所以,这个位置我们设置为: STM32F10X_HD。
图中 2 处是编译器优化选项,有-O0~-O3 四种选择(default 则是-O2),值越大,优化效果越强,但是仿真调试效果越差。这里我们选择-O0 优化,以得到最好的调试效果,方便开发代码,在代码调试结束后,大家可以选择-O2 之类的优化,得到更好的性能和更少的代码占用量。图中 3 处, One ELF Section per Function 主要是用来对冗余函数的优化。通过这个选项,可以在最后生成的二进制文件中将冗余函数排除掉,以便最大程度地优化最后生成的二进制代码,所以,我们一般勾选上这个,这样可以减少整个程序的代码量。
然后在 Include Paths 处(4 处),点击 5 处的按钮。在弹出的对话框中加入 SYSTEM 文件夹下的 3 个文件夹名字,把这几个路径都加进去(此操作即加入编译器的头文件包含路径, 后面会经常用到)。如图 3.2.21 所示:
点击 OK 确认,回到 IDE,此时再点击 按钮,再编译一次,发现没错误了,得到如图 3.2.22所示的界面:
因为我们之前选择了生成 Hex 文件,所以在编译的时候, MDK 会自动生成 Hex 文件(图中圈出部分),这个文件在 OBJ 文件夹里面,串口下载的时候,我们就是下载这个文件到STM32F1 里面的,这个在后面的程序下载一节会介绍。这里有的朋友编译后,可能会出现一个警告: warning: #1-D last line of file ends without a newline。这个警告是在告诉我们,在某个 C 文件的最后,没有输入新行,我们只需要双击这个警告,跳转到警告处,然后在后面输入多一个空行就好了。至此,一个完整的 STM32F1 开发工程在 MDK5 下建立了。 接下来我们就可以进行代码下载和仿真调试了。
3.3 MDK5 使用技巧
3.3.1 文本美化
文本美化,主要是设置一些关键字、注释、数字等的颜色和字体。 前面我们在介绍 MDK5新建工程的时候看到界面如图 3.2.22 所示,这是 MDK 默认的设置, 可以看到其中的关键字和注释等字体的颜色不是很漂亮,而 MDK 提供了我们自定义字体颜色的功能。我们可以在工具条上点击 (配置对话框)弹出如图 3.3.1.1 所示界面:
在该对话框中,先设置 Encoding 为:Chinese GB2312(Simplified),然后设置 Tab size 为: 4。以更好的支持简体中文(否则,拷贝到其他地方的时候,中文可能是一堆的问号),同时 TAB间隔设置为 4 个单位。然后,选择: Colors&Fonts 选项卡,在该选项卡内,我们就可以设置自己的代码的子体和颜色了。由于我们使用的是 C 语言,故在 Window 下面选择:C/C++ Editor Files在右边就可以看到相应的元素了。如图 3.3.1.2 示:
然后点击各个元素修改为你喜欢的颜色(注意双击,且有时候可能需要设置多次才生效,MDK 的 bug),当然也可以在 Font 栏设置你字体的类型,以及字体的大小等。设置成之后,点击 OK,就可以在主界面看到你所修改后的结果,例如我修改后的代码显示效果如图 3.3.1.3 示:
这就比开始的效果好看一些了。 字体大小,则可以直接按住: ctrl+鼠标滚轮,进行放大或者缩小,或者也可以在刚刚的配置界面设置字体大小。
细心的读者可能会发现,上面的代码里面有一个 u8,还是黑色的,这是一个用户自定义的关键字,为什么不显示蓝色(假定刚刚已经设置了用户自定义关键字颜色为蓝色)呢?这就又要回到我们刚刚的配置对话框了,单这次我们要选择 User Keywords 选项卡,同样选择: C/C++Editor Files,在右边的 User Keywords 对话框下面输入你自己定义的关键字,如图 3.3.1.4 示:
图 3.3.1.4 中我定义了 u8、 u16、 u32 等 3 个关键字,这样在以后的代码编辑里面只要出现这三个关键字,肯定就会变成蓝色。点击 OK,再回到主界面,可以看到 u8 变成了蓝色了,如图 3.3.1.5 示:
3.3.2 语法检测&代码提示
MDK4.70 以上的版本,新增了代码提示与动态语法检测功能,使得 MDK 的编辑器越来越好用了,这里我们简单说一下如何设置,同样,点击 ,打开配置对话框,选择 Text Completion选项卡,如图 3.3.2.1 所示:
Strut/Class Members,用于开启结构体/类成员提示功能。Function Parameters,用于开启函数参数提示功能。Symbols after xx characters,用于开启代码提示功能,即在输入多少个字符以后,提示匹配的内容(比如函数名字、结构体名字、变量名字等),这里默认设置 3 个字符以后,就开始提示。如图 3.3.2.2 所示:
Dynamic Syntax Checking,则用于开启动态语法检测,比如编写的代码存在语法错误的时候,会在对应行前面出现 图标,如出现警告,则会出现 图标,将鼠标光标放图标上面,则会提示产生的错误/警告的原因,如图 3.3.2.3 所示:
这几个功能,对我们编写代码很有帮助,可以加快代码编写速度,并且及时发现各种问题。不过这里要提醒大家,语法动态检测这个功能, 有的时候会误报(比如 sys.c 里面,就有误报),大家可以不用理会,只要能编译通过(0 错误, 0 警告),这样的语法误报,一般直忽略即可。
3.3.3 代码编辑技巧
这里给大家介绍几个我常用的技巧,这些小技巧能给我们的代码编辑带来很大的方便,相信对你的代码编写一定会有所帮助。
1) TAB 键的妙用
首先要介绍的就是 TAB 键的使用,这个键在很多编译器里面都是用来空位的,每按一下移空几个位。如果你是经常编写程序的对这个键一定再熟悉不过了。但是 MDK 的 TAB 键和一般编译器的 TAB 键有不同的地方,和 C++的 TAB 键差不多。 MDK 的 TAB 键支持块操作。也就是可以让一片代码整体右移固定的几个位,也可以通过 SHIFT+TAB 键整体左移固定的几个位。假设我们前面的串口 1 中断响应函数如图 3.3.3.1 所示:
图 3.3.3.1 中这样的代码大家肯定不会喜欢,这还只是短短的 30 来行代码,如果你的代码有几千行,全部是这个样子,不头大才怪。看到这样的代码我们就可以通过 TAB 键的妙用来快速修改为比较规范的代码格式。选中一块然后按 TAB 键, 你可以看到整块代码都跟着右移了一定距离,如图 3.3.3.2 所示:
接下来我们就是要多选几次,然后多按几次 TAB 键就可以达到迅速使代码规范化的目的,最终效果如图 3.3.3.3 所示
图 3.3.3.3 中的代码相对于图 3.3.3.1 中的要好看多了,经过这样的整理之后, 整个代码一下就变得有条理多了,看起来很舒服。
2) 快速定位函数/变量被定义的地方 上一节,我们介绍了 TAB 键的功能,接下来我们介绍一下如何快速查看一个函数或者变量所定义的地方。
大家在调试代码或编写代码的时候,一定有想看看某个函数是在那个地方定义的,具体里面的内容是怎么样的,也可能想看看某个变量或数组是在哪个地方定义的等。尤其在调试代码或者看别人代码的时候,如果编译器没有快速定位的功能的时候, 你只能慢慢的自己找,代码量比较少还好,如果代码量一大,那就郁闷了,有时候要花很久的时间来找这个函数到底在哪里。型号 MDK 提供了这样的快速定位的功能。只要你把光标放到这个函数/变量(xxx)的上面(xxx 为你想要查看的函数或变量的名字),然后右键, 弹出如图 3.3.3.4 所示的菜单栏 :
在图 3.3.3.4 中,我们找到 Go to Definition Of‘STM32_Clock_Init’ 这个地方,然后单击左键就可以快速跳到 STM32_Clock_Init 函数的定义处(注意要先在 Options for Target 的 Output选项卡里面勾选 Browse Information 选项,再编译,再定位,否则无法定位!)。如图 3.3.3.5 所示:
对于变量,我们也可以按这样的操作快速来定位这个变量被定义的地方,大大缩短了你查找代码的时间。很多时候,我们利用 Go to Definition 看完函数/变量的定义后,又想返回之前的代码继续看,
此时我们可以通过 IDE 上的 按钮(Back to previous position)快速的返回之前的位置,这个按钮非常好用!
3) 快速注释与快速消注释接下来,我们介绍一下快速注释与快速消注释的方法。在调试代码的时候, 你可能会想注释某一片的代码,来看看执行的情况, MDK 提供了这样的快速注释/消注释块代码的功能。也是通过右键实现的。这个操作比较简单,就是先选中你要注释的代码区,然后右键,选择AdvancedàComment Selection 就可以了。 以 Stm32_Clock_Init 函数为例,比如我要注释掉下图中所选中区域的代码,如图 3.3.3.6 所示:
我们只要在选中了之后,选择右键,再选择 AdvancedàComment Selection 就可以把这段代码注释掉了。执行这个操作以后的结果如图 3.3.3.7 所示:
这样就快速的注释掉了一片代码,而在某些时候,我们又希望这段注释的代码能快速的取消注释, MDK 也提供了这个功能。与注释类似,先选中被注释掉的地方,然后通过右键àAdvanced,不过这里选择的是 Uncomment Selection。
3.3.4 其他小技巧除了前面介绍的几个比较常用的技巧,这里还介绍几个其他的小技巧,希望能让你的代码编写如虎添翼。
第一个是快速打开头文件。在将光标放到要打开的引用头文件上,然后右键选择 Open Document“XXX”,就可以快速打开这个文件了(XXX 是你要打开的头文件名字)。如图 3.3.4.1所示:
第二个小技巧是查找替换功能。这个和 WORD 等很多文档操作的替换功能是差不多的,在 MDK 里面查找替换的快捷键是“CTRL+H”,只要你按下该按钮就会调出如图 3.3.4.2 所示界面:
这个替换的功能在有的时候是很有用的,它的用法与其他编辑工具或编译器的差不多,相信各位都不陌生了,这里就不啰嗦了。
第三个小技巧是跨文件查找功能,先双击你要找的函数/变量名(这里我们还是以系统时钟初始化函数: Stm32_Clock_Init 为例),然后再点击 IDE 上面的 ,弹出如图 3.3.4.3 所示对话框:
点击 Find All, MDK 就会帮你找出所有含有 Stm32_Clock_Init 字段的文件并列出其所在位置,如图 3.3.4.4 所示:
该方法可以很方便的查找各种函数/变量,而且可以限定搜索范围(比如只查找.c 文件和.h文件等),是非常实用的一个技巧。
相关文章:
正点原子STM32新建工程
MDK 源自德国的 KEIL 公司,是 RealView MDK 的简称。 MDK5 由两个部分组成: MDK Core 和 Software Packs。 MDK Core 又分成四个部分: uVision IDE with Editor(编辑器), ARMC/C Compiler(编译…...
计算机网络 第三章:运输层(一)
运输层位于应用层和网络层之间,是分层的网络体系结构的重要部分。该层为运行在不同主机上的应用进程提供直接的通信服务。通常特别关注因特网协议,即 TCP 和 UDP 运输层协议。 讨论运输层和网络层的关析,为研究运输层第一个关键功能ÿ…...
机器学习(14)——模型调参
文章目录 一、动态调参方法论1. 调参策略选择2. 千万数据优化原则 二、模型调参策略对比1. LightGBM调参路线2. XGBoost调参路线3. 随机森林调参策略 三、代码实现示例通用数据准备(适用于所有模型)1. LightGBM调参示例2. XGBoost调参示例3. 随机森林调参…...
基于PetaLinux的Zynq PS应用自启动全攻略
一、嵌入式Linux启动管理的艺术 在工业机器人、智能摄像头、边缘计算网关等场景中,开机自启动管理是系统可靠性的第一道关卡。本文将深入讲解Zynq PS端在PetaLinux环境下实现: Systemd服务深度定制启动时序精准控制启动速度优化技巧动态服务管理创新方案二、环境搭建与工程配…...
贪心算法:多处最优服务次序、删数问题
多处最优服务次序问题 问题描述:设有n个顾客同时等待一项服务。顾客i需要的服务时间为ti(1≤i≤n),共有s处可以提供此项服务。应如何安排n个顾客的服务次序,才能使平均等待时间达到最小?平均等待时间是n个顾客等待服务时间的总和除以n。 算法设计:对于给定的n个顾…...
使用 Flask 框架实现FTP,允许用户通过 Web 界面浏览和下载文件夹中的所有文件
Flask 文件和文件夹下载服务实现 以下是一个基于 Flask 框架的简单 Web 服务,用于开放指定文件夹(./shared_files),允许用户通过浏览器浏览和下载文件夹中的所有文件和子文件夹。ZIP 和 TAR 文件将直接下载,而文件夹将…...
【Go】从0开始学习Go
文章目录 从0开始学习Go0 与C对比1 代码框架1.1 helloworld式代码示例1.2 主体代码元素(核心三部分)1.3 其他 2 与C/C区别3 有用的小工具4 注意事项 从0开始学习Go 0 与C对比 特性CGo编译型语言需要编译为机器码直接编译为二进制可执行文件静态类型类型…...
软件设计师SQL考点分析——求三连
一、考点分值占比与趋势分析 综合知识分值统计表(75分制) 年份考题数量分值分值占比考察重点2018334%关系代数、权限控制2019222.67%SQL注入、授权语句2020445.33%投影操作、权限回收2021334%视图操作、权限传递2022222.67%数据库安全、WITH GRANT OPT…...
使用tcs34725传感器和51单片机识别颜色
使用TCS34725颜色传感器和51单片机来识别颜色是一个非常有趣的项目。TCS34725是一种常用的RGB颜色传感器,能够测量红、绿、蓝光的强度,从而实现颜色识别。 1. 硬件连接 TCS34725传感器通过IC接口与51单片机连接。以下是连接方式: SDA&…...
数据库-oracle-包-视图传参
并发下可能不准确 -- 修改包规范 CREATE OR REPLACE PACKAGE sczz.p_view_param IS function set_n(n varchar2) return varchar2; function get_n return varchar2; function set_ny(ny varchar2) return varchar2; function get_ny return varchar2; …...
深入探讨Java中的上下文传递与ThreadLocal的局限性及Scoped Values的兴起
在Java开发中,特别是在依赖框架的应用程序中,上下文数据的管理是一个常见但具有挑战性的问题。上下文数据可能包括元数据、配置信息或其他需要在代码不同部分之间共享的信息。传统的做法是通过方法参数显式传递这些上下文,但这种方法会导致代码复杂、难以维护,尤其是在大型…...
Spring boot 学习笔记2
Maven 项目管理工具:Maven 通过 pom.xml(Project Object Model)文件描述项目配置,包括依赖、构建流程、插件等,实现项目标准化管理 依赖管理:自动下载并管理项目所需的第三方库(如 Spring、MyB…...
“保证医疗器械信息来源合法 真实、安全的保障措施、情况说明及相关证明”模板
保证医疗器械信息来源合法真实、安全的保障措施、情况说明及相关证明 一、医疗器械信息来源合法、真实、安全的管理措施 目前我公司网站所展示的医疗器械是企业代理品种,是取得合法注册资格的产品,拥有合法证明文件的产品。本网站仅展示本公司行政许可…...
Feature Toggle 不再乱:如何设计一个干净、安全、可控的特性开关系统?
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
不锈钢保温容器行业2025数据分析报告
不锈钢保温容器市场概况 2024年全球不锈钢保温容器市场规模约为453.3亿元,预计到2031年将增长至608.3亿元,年均复合增长率(CAGR)为4.3%。这一增长主要得益于全球范围内对保温容器需求的持续增加,尤其是在户外活动、餐…...
leetcode239 滑动窗口最大值deque方式
这段文字描述的是使用单调队列(Monotonic Queue) 解决滑动窗口最大值问题的优化算法。我来简单解释一下: 核心思路 问题分析:在滑动窗口中,若存在两个下标 i < j 且 nums[i] ≤ nums[j],则 nums[i] 永远…...
腾讯云怎么在游戏云中助力
腾讯云游戏云:依托深厚游戏基因,打造高质量全方位生态平台 在竞争激烈的云计算市场中,腾讯云凭借其得天独厚的游戏生态资源和深耕多年的技术沉淀,正成为游戏行业不可忽视的重要力量。腾讯不仅是全球领先的游戏开发和发行商&#…...
深入理解pip:Python包管理的核心工具与实战指南
# 深入理解pip:Python包管理的核心工具与实战指南 在Python开发中,第三方库是提升效率的关键。而pip作为Python官方的包管理工具,承担着安装、卸载、升级和管理库的重要职责。本文将全面解析pip的核心命令,结合实例演示用法&#…...
【python】windows修改 pip 默认安装路径
在 Windows 系统 下,希望修改 pip 默认安装路径,结合你前面贴的图片和信息,一个 推荐做法(不修改 site.py)的完整教程。 目标:让 pip 安装包默认装到你指定的路径(如 D:\MyPythonLibsÿ…...
Python函数——万字详解
—— 小 峰 编 程 导 语: 从今天开始,我们将进入第二模块的学习——函数。第一模块主要是学习python基础知识,从第二模块开始就可以通过程序去解决工作中实际的问题。从今天开始,我们将进入第二模块的学习,此模块…...
es在已有历史数据的文档新增加字段操作
新增字段设置默认值 场景 在已经有大量数据的索引文档上,增加新字段 技术实现 一.更新索引映射 通过PUT请求显式定义新字段类型,确保后续写入的文档能被正确解析 PUT /文档名/_mapping {"properties": {"字段名1": {"type…...
LeetCode 35 搜索插入位置题解
LeetCode 35 搜索插入位置题解 题目描述 题目链接 给定一个排序数组和一个目标值,在数组中找到目标值并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置(需保证数组仍然有序)。要求时间复杂度为 O(log n)。…...
RabbitMQ通信模式(Simplest)Python示例
RabbitMQ通信模式-Python示例 0.RabbitMQ官网通信模式1.Simplest(简单)模式1.1 发送端1.2 接收端 0.RabbitMQ官网通信模式 1.Simplest(简单)模式 1.1 发送端 # -*- coding: utf-8 -*- """ Author: xxx date: 2025/5/19 11:30 Description: Simaple简单模…...
游戏开发实战(一):Python复刻「崩坏星穹铁道」嗷呜嗷呜事务所---源码级解析该小游戏背后的算法与设计模式【纯原创】
文章目录 奇美拉项目游戏规则奇美拉(Chimeras)档案领队成员 结果展示: 奇美拉项目 由于项目工程较大,并且我打算把我的思考过程和实现过程中踩过的坑都分享一下,因此会分3-4篇博文详细讲解本项目。本文首先介绍下游戏规则并给出奇美拉档案。…...
力扣热题100之删除链表的倒数第N个节点
题目 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 代码 方法一 将链表中的值放入列表中,然后删除倒数第n个值,再将剩下的数依次转化为链表 # Definition for singly-linked list. # class ListNode: # …...
OCframework编译Swift
建一个OC的framework: 需要对外暴露的OC文件,需要放到OC的.h文件中 framework中,OC类,调用framework中的Swift类: #import "WowAudioFocus/WowAudioFocus-Swift.h" //02 #import "{工程名}/{工程…...
【AI News | 20250519】每日AI进展
AI Repos 1、deepdrone DeepDrone是一款基于smolagents框架的无人机聊天代理,集成DroneKit实现无人机分析与操作。用户可通过自然语言聊天与无人机助手交互,实现飞行路径和传感器数据可视化、基于飞行时长的维护建议、任务规划以及真实的无人机控制&…...
分布式ID生成系统
代码地址: github mid 简介 分布式 ID 生成系统是一个高性能、可靠的 ID 生成服务,支持两种模式:Snowflake(基于时间戳的内存生成)和 Segment(基于 MySQL 的号段分配)。系统采用双 Buffer 策略优化性能,集成 Prometheus 监控和 Zap 结构化日志,确保高可用性和可观测性…...
MAC常用操作整理
音量方法: 电脑键盘的右上角就有静音和不静音的按钮,还有调节音量的按钮,调节屏幕亮度的按钮 切换输入法方法: 1.大写按键,2.function按键(fn), 3.control 空格键, 选择上一个输入法,4.controloption空格…...
【Canvas与图标】圆角方块蓝星CSS图标
【成图】 120*120的png图标 大小图: 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>圆角方块蓝星CSS Draft1</…...
易境通散货拼柜系统:提高货代企业货物配载效率
在国际物流代理运输领域,货物配载是整个供应链的核心环节,其优化对于提升整个供应链的效率至关重要。传统的配载管理方式往往依赖人工操作,不仅效率低下,还容易出现错误。面对多订单、多货主、多目的地的复杂场景,传统…...
[Spring Boot]整合Java Mail实现Outlook发送邮件
日常开发过程中,我们经常需要使用到邮件发送任务,比方说验证码的发送、日常信息的通知等。日常比较常用的邮件发送方包括:163、QQ等,本文主要讲解Outlook SMTP的开启方式、OutLook STARTTTL的配置、如何通过JavaMail来实现电子邮件的发送等。 Outlook作为微软提供的企业电子…...
【盈达科技】GEO优化实战策略
提升内容在生成式引擎中的可见性:实战策略 随着生成式引擎(Generative Engines, GEs)的兴起,内容创作者面临着新的挑战和机遇。这些引擎通过整合和总结多源信息来提供精准且个性化的回答,正在迅速取代传统搜索引擎。为…...
HTTP 协议基础
本篇文章会从如下角度介绍 HTTP 协议: 原理与工作机制请求方法与状态码Header 与 Body 1、原理与工作机制 1.1 HTTP 是什么 HyperText Transfer Protocol,超文本传输协议,"超"表示扩展而非超级,即可以链接到其他文本…...
ros运行包,Ubuntu20.04成功运行LIO-SAM
zz:~/lio_sam_ws$ source devel/setup.bash zz:~/lio_sam_ws$ roslaunch lio_sam run.launch 创建包链接: 链接1:Ubuntu20.04成功运行LIO-SAM_ubuntu20.04运行liosam-CSDN博客 链接2:ubuntu 20.04 ROS 编译和运行 lio-sam,并且导出PCD文件…...
Linux《自主Shell命令行解释器》
在上一篇的进程控制当中我们已经了解了进程退出、进程等待以及进程替换的相关概念,那么在了解了这些的概念之后接下来在本篇当中我们就可以结合之前我们学习的知识来实现一个自主的Shell命令行解释器,通过Shell的实现能让我们进一步的理解操作系统当中的…...
设置IDEA打开新项目使用JDK17
由于最近在学习Spring-AI,所以JDK8已经不适用了,但是每次创建新项目都还是JDK8,每次调来调去很麻烦 把Projects和SDKs都调整为JDK17即可 同时,Maven也要做些更改,主要是添加build标签 <build><plugins>&…...
Vue百日学习计划Day36-42天详细计划-Gemini版
总目标: 在 Day 36-42 理解组件化开发的思想,熟练掌握 Vue 组件的注册、Props、Events、v-model、Slots、Provide/Inject 等核心概念和实践,能够构建可复用和易于维护的组件结构。 所需资源: Vue 3 官方文档 (组件基础): https://cn.vuejs.org/guide/es…...
Python对JSON数据操作
在Python中,对JSON数据进行增删改查及加载保存操作,主要通过内置的json模块实现。 一、基础操作 1. 加载JSON数据 • 从文件加载 使用json.load()读取JSON文件并转换为Python对象(字典/列表): import json with open…...
upload靶场1-5关
网上的解析有一些题目对应不上,比如第五关说是 空格 点 空格绕过 ,我这里就无法成功解析,但大小写绕过就成功了,慢慢会把后面的关卡也写出来 这里建议开一台win7的虚拟机,在上面搭建靶场,可以省很多麻烦 …...
网络传输(ping命令,wget命令,curl命令),端口
网络传输: ping命令:检查指定的网络服务器是否是可联通状态 语法:ping 【-c num】IP或主机名 -c:是检查的次数,不使用-c,将无限次持续检查 wget命令:wget是非交互式的文件下载器࿰…...
upload-labs靶场通关详解:第10关
一、分析源代码 $is_upload false; $msg null; if (isset($_POST[submit])) {if (file_exists(UPLOAD_PATH)) {$deny_ext array(".php",".php5",".php4",".php3",".php2",".html",".htm",".ph…...
深入解析`lsof`命令:查看系统中打开文件与进程信息
1、lsof的基本概念 lsof (List Open Files) 提供了一种方式来查看系统上哪些进程正在访问哪些文件,能够显示文件类型、文件名、文件描述符、所属进程等详细信息。 在类Unix系统中,几乎所有的操作都与文件相关联,文件不…...
C++ 与 Python 内存分配策略对比
内存管理是编程中的一个核心概念,它直接影响程序的性能、稳定性和资源利用率。C 和 Python 作为两种广泛使用的编程语言,在内存分配和管理方面采用了截然不同的策略。 C 内存分配策略 C 赋予程序员对内存的精细控制能力,同时也带来了更大的…...
TB开拓者策略交易信号闪烁根因及解决方法
TB开拓者策略信号闪烁分析 TB开拓者策略交易信号闪烁根因 TB开拓者策略交易信号闪烁根因分析 信号闪烁是交易策略开发中常见的问题,特别是在TB(TradeBlazer)开拓者等平台上。以下是信号闪烁的主要根因分析: 主要根因 未来函数问题 使用了包含未来信息…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(24):受身形
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(24):受身形 1、前言(1)情况说明(2)工程师的信仰2、知识点(1)うけみけい 受身形(2)復習(ふくしゅう):3、单词(1)日语(2)日语片假名单词4、相近词练习5、单词辨析记录6、总结1、前言 (1)情况说明 自己在今…...
牛客网NC209794:使徒袭来
牛客网NC209794:使徒袭来 题目背景 问题分析 数学建模 设三位驾驶员的战斗力分别为 a, b, c已知条件:a b c n (n为输入的正整数)目标:求 a b c 的最小值 解题思路 根据算术-几何平均值不等式(AM-GM不等式),对于任意正实数a, b, c&a…...
命令行登录 MySQL 报 Segmentation fault 故障解决
问题描述:对 mysql8.0.35 源码进行 make,由于一开始因为yum源问题少安装依赖库 库,在链接时遇到错误 undefined reference to,后来安装了相关依赖库,再次 make 成功。于是将 mysqld 启动,再用 mysql -u roo…...
2025ICPC邀请赛南昌游记
滚榜时候队伍照片放的人家的闹麻了,手机举了半天 。 最后银牌700小几十罚时,rank60多点。 参赛体验还行,队长是福建人,说感觉这个热度是主场作战哈哈哈哈。空调制冷确实不太行吧。 9s过A是啥,没见过,虽然…...
kotlin flow的写法
以下是 Android 开发中 Kotlin Flow 的常见使用模式和操作符的完整中文总结: 1. 基本 Flow 创建方式 // 从多个值创建 val flow1 flowOf(1, 2, 3)// 使用 flow 构建器 val flow2 flow {emit(1)delay(100)emit(2) }// 从集合创建 val flow3 listOf(1, 2, 3).asFl…...