【单片机开发】MCU三种启动方式(Boot选择)[主Flash/系统存储器(BootLoader)/嵌入式SRAM]
目录
参考资料:
利用 Boot 选择不同的启动方式:
单片机的存储结构(主 FLASH/系统存储器/嵌入式 SRAM):
1. Cortex-M 内核芯片——启动原理:
1.1. 启动流程:
1.2. 根据单片机的存储器映射和架构图:启动空间必须在代码区域(0x0000 0000 ~ 0x1FFF FFFF)
1.3. 地址映射原理: 存储器别名(memory alias)“技术
1.3.1. 举例
1.3.2. 引出一个问题:为什么可以从其他地址读 0x0000 0000 的中断向量表
1.3.3. 那么新的问题来:(怎么规定/配置内存重映射)
1.3.4. 问题:既然设置到0x0800 0000这么麻烦,为什么不直接使用0x0000 0000?
2. 根据不同的启动方式:会将配置的启动地址(主 FLASH/系统存储器/嵌入式 SRAM)映射到 0x0000 0000(系统中断向量表) 上
2.1. 从系统存储器(System Memory)启动:
2.2. 从主 Flash(Main Flash Memory)启动:这个是平时使用最多的方式,将程序下载到STM32内部Flash,然后从Flash启动。
【不是问题的问题】为什么STM32的Flash地址要设置到0x08000000 - STM32H7 - 硬汉嵌入式论坛 - Powered by Discuz!
2.3. 从嵌入式 SRAM 启动(内部 SRAM):【比较好奇】
2.3.1. 为什么可以从 SRAM 启动:
至于为什么STM32还能从SRAM启动,ST官方资料https://www.st.com/content/ccc/resource/technical/document/reference_manual/59/b9/ba/7f/11/af/43/d5/CD00171190.pdf/files/CD00171190.pdf/jcr:content/translations/en.CD00171190.pdf中的3.4节 给出的说明是:
请注意:从SRAM启动与在SRAM中运行代码是两个不同的概念。
2.3.2. 为什么需要从SRAM启动【应用】
2.3.3. 从 SRAM 启动:
实现原理:
实现步骤:MCU的三种启动方式 - EdgeAI Lab
2.3.4. 【补充】在 SRAM 中运行代码:
实现步骤:在SRAM中运行代码 - EdgeAI Lab
参考资料:
MCU的三种启动方式 - EdgeAI Lab
立芯嵌入式的视频
在SRAM中运行代码 - EdgeAI Lab
【不是问题的问题】为什么STM32的Flash地址要设置到0x08000000 - STM32H7 - 硬汉嵌入式论坛 - Powered by Discuz!
还有一些在标题附近
利用 Boot 选择不同的启动方式:
单片机的存储结构(主 FLASH/系统存储器/嵌入式 SRAM):
如上图所示,STM32内部:
- 一共有两块物理存储设备
-
- 内部 Flash
- 内部 SRAM
- 三块存储区域
-
- Main Flash Memory ——正常单片机启动方式(0x0800 0000~0x0807 FFFF)
- System Memory ——一般存有 BootLoader 程序(0x1FFF 0000~0x1FFF 7A0F)
一般系统存储器又叫 BootROM
-
- SRAM ——比较特殊,在不想影响 FLASH 程序下调试可用(0x2000 0000)
一般调试用,因为断电后数据会消失
-
- 这三块存储区域也就是STM32的三个启动空间。
1. Cortex-M 内核芯片——启动原理:
1.1. 启动流程:
【不是问题的问题】为什么STM32的Flash地址要设置到0x08000000 - STM32H7 - 硬汉嵌入式论坛 - Powered by Discuz!
- M3,M4内核芯片上电复位后,要固定从0x0000 0000地址读取中断向量表
- 获取复位中断服务程序的入口地址后,进入复位中断服务程序
- 其中0x0000 0000是栈顶地址,0x0000 0004存的是复位中断服务程序地址
1.2. 根据单片机的存储器映射和架构图:启动空间必须在代码区域(0x0000 0000 ~ 0x1FFF FFFF)
存储器指可以存储数据的设备(FLASH/SRAM/ROM),本身没有地址信息,对存储器分配地址的过程称为存储器映射
- 单片机默认启动方式:
-
- Cortex®-M3 CPU上电后(开始找中断向量表)
-
-
- 默认从0x0000 0000地址处取得栈顶地址(MSP)
- 通过ICode bus从0x0000 0004地址处取得PC的值(复位向量)
- 然后开始执行代码(进入复位中断服务程序)
-
- 因为ICode bus只能访问代码区域(0x0000 0000 ~ 0x1FFF FFFF),所以启动空间必须在代码区域
【ICode 总线】
1.3. 地址映射原理: 存储器别名(memory alias)“技术
1.3.1. 举例
- STM32内部Flash就位于代码区域(采用从主 FLASH 启动方式),并且通过“ 存储器别名(memory alias)“技术
代码区域——(0x0000 0000 ~ 0x1FFF FFFF)
主 FLASH——(0x0800 0000~0x0807 FFFF)
-
- 可以将STM32的Main Flash Memory的地址空间0x0800 0000 ~ 0x0801 FFFF映射到0x0000 0000 ~ 0x0001 FFFF,对于System memory也是同样的道理。所以STM32可以从Main Flash Memory和System memory启动。
1.3.2. 引出一个问题:为什么可以从其他地址读 0x0000 0000 的中断向量表
- 既然ARM规定了M3,M4内核要从地址0x0000 0000读取中断向量表,而STM32设置Flash地址到0x0800 0000怎么办?
- 解决方法:
-
- STM32支持了个内存重映射功能,将地址0x0800 0000开始的内容重映射到首地址0x0000 0000中,这样就解决了从0x0000 0000读取中断向量表的问题。
1.3.3. 那么新的问题来:(怎么规定/配置内存重映射)
- 你怎么保证0x08000 0000首地址存的就是中断向量表,我们不可以随意设置吗?
- 解决方法:
-
- 保证中断向量表存到0x0800 0000,这个涉及到分散加载的一个小知识
- 以MDK为例:
-
-
- 如果大家看xxx.S启动文件,里面通过AREA定义了一个名叫RESET的段,这段存的就是中断向量表。
-
; Vector Table Mapped to Address 0 at ResetAREA RESET, DATA, READONLYEXPORT __VectorsEXPORT __Vectors_EndEXPORT __Vectors_Size
-
-
- 这个名字很重要,MDK对应的xxx.sct分散加载里面通过下面这句将这个RESET段放在了0x0800 0000优先存储。
-
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************LR_IROM1 0x08000000 0x00200000 { ; load region size_regionER_IROM1 0x08000000 0x00200000 { ; load address = execution address*.o (RESET, +First)*(InRoot$Sections).ANY (+RO).ANY (+XO)}RW_IRAM2 0x24000000 0x00080000 { ; RW data.ANY (+RW +ZI)}
}
-
-
- 这样我们就解决了0x0800 0000首地址存储中断向量表,一旦程序开始运行后,我们就可以随意设置中断向量表的位置了。
- 比如想将中断向量表存到内部SRAM,我们就可以操作寄存器SCB->VTOR 重新安排,然后将0x0800 0000的内容复制到设置的地址内即可。【上电启动后,改为从内部 SRAM 启动】
-
1.3.4. 问题:既然设置到0x0800 0000这么麻烦,为什么不直接使用0x0000 0000?
- 因为我们需要从不同的地址启动,以达到不同的启动程序(BootLoader 程序/正常 APP 应用程序)
- M3、M4 内核:
- M7 内核
2. 根据不同的启动方式:会将配置的启动地址(主 FLASH/系统存储器/嵌入式 SRAM)映射到 0x0000 0000(系统中断向量表) 上
2.1. 从系统存储器(System Memory)启动:
System Memory中是ST预置的bootloader程序,用于通过串口下载用户程序到Flash。
一般系统存储器启动的话会存放 BootLoader 程序
程序下载完毕后,重新将启动模式设置为 “从Flash启动” ,然后开机运行用户程序。
【BootLoader】当选择系统存储器启动,从 0x0000 0000 跳转至对应地址启动(映射),
我们可以提前在系统存储器写入 BootLoader 程序(各种通信接口)的,然后以该方式启动
此时用 IAP 下载工具烧录程序,单片机执行 BootLoader 程序,会以对应的通信接口返回指定数据,符合通信要求后(收发特定数据)。
IAP 下载工具开始发送烧录程序(hex 文件),由单片机的 BootLoader 程序(利用对应通信接口)一一接收,然后逐个刷新到 Flash 上(Flash memory-主 Flash[0x0800 0000 - 0x0807 FFFF = 512KB 标定大小 ]),
一般出厂会自带 Boot 程序,一般系统存储器又叫 BootROM
2.2. 从主 Flash(Main Flash Memory)启动:这个是平时使用最多的方式,将程序下载到STM32内部Flash,然后从Flash启动。
【不是问题的问题】为什么STM32的Flash地址要设置到0x08000000 - STM32H7 - 硬汉嵌入式论坛 - Powered by Discuz!
还是将 0x0800 0000 映射到 0x0000 0000(由 AHB 总线映射)
2.3. 从嵌入式 SRAM 启动(内部 SRAM):【比较好奇】
在SRAM中运行代码 - EdgeAI Lab
2.3.1. 为什么可以从 SRAM 启动:
至于为什么STM32还能从SRAM启动,ST官方资料https://www.st.com/content/ccc/resource/technical/document/reference_manual/59/b9/ba/7f/11/af/43/d5/CD00171190.pdf/files/CD00171190.pdf/jcr:content/translations/en.CD00171190.pdf中的3.4节 给出的说明是:
STM32F10xxx微控制器实现了一个特殊的机制使得STM32不仅能够从Flash memory 和 System memory启动,也能够从SRAM启动。从内嵌SRAM启动:SRAM仅能在地址0x2000 0000处被访问。
STM32F10xxx microcontrollers implement a special mechanism to be able to boot also from SRAM and not only from main Flash memory and System memory.Boot from the embedded SRAM: SRAM is accessible only at address 0x2000 0000.
以上说明并不清楚,ST官方对此含糊其辞,从SRAM启动的具体细节无从知晓,但是通过实验我们发现:
- 将STM32设置为从SRAM启动(a. 配置启动模式引脚BOOT0=1,BOOT1=1;b. 并修改链接脚本将所有代码全部放入SRAM中)
- 系统复位后PC指针总是指向0x2000 0108。
- 所以我们在地址0x2000 0108插入设置SP指针和PC指针的指令就可以实现从SRAM启动了。
请注意:从SRAM启动与在SRAM中运行代码是两个不同的概念。
- 从SRAM启动:
-
- 也属于在SRAM中运行代码,但不同的是程序下载到SRAM后,在MCU不断电的情况下,程序可以一直运行,并且按下复位键后可以重新运行。
- 在SRAM中运行代码:
-
- 将所有的代码放到SRAM运行,此时MCU的启动模式可以是从Main Flash Memory启动
- 将部分代码放到SRAM运行,此时MCU的启动模式可以是从Main Flash Memory启动
- 关于在SRAM中运行代码,请参考这篇文章:在SRAM中运行代码 - EdgeAI Lab
2.3.2. 为什么需要从SRAM启动【应用】
可能的原因有以下几点(参考资料《ARM Cortex M3 & M4权威指南》15.7节MCU经典书籍 - EdgeAI Lab):
- 所使用的设备可能具有OTP ROM(仅可进行一次编程),因此在最终确定前,是不会将程序编程到芯片中的。
- 有些微控制器中没有内部Flash存储器,需要使用外部的存储器,在软件开发期间,可能会想用内部的SRAM进行测试。
- 对于产品测试或者特定方面的测试,不想改动Flash中现有的程序实现某些新功能的测试工作,此时可以将测试代码下载到SRAM中运行。【在 Flash 烧一次后,不想改变现有 Flash 程序,但是想调试,可以利用 SRAM 空间进行调试】
- 对于Flash存储器比较小的系统,可能想在启动阶段将程序从Flash复制到SRAM中以提高性能,并在SRAM中执行程序以达到最佳性能。
- 在 SRAM 中也是可以放一个小的 BootLoader 程序,也可以搞 IAP 下载【应用案例:Jlink 下载算法启动后跑到 SRAM 中】
2.3.3. 从 SRAM 启动:
实现原理:
- 还是将 0x2000 0000 映射到 0x0000 0000(由 AHB 总线映射)
实现步骤:MCU的三种启动方式 - EdgeAI Lab
拿 M3(F103C8T6,RAM大小为20K) 举例
- 修改启动模式
将引脚BOOT0,BOOT1都设置为1,将STM32配置为从SRAM启动。
- 设置中断向量表偏移
添加宏定义 VECT_TAB_SRAM
- 该宏定义影响的代码:
// system_stm32f10x.c
// SystemInit()
#ifdef VECT_TAB_SRAMSCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
#elseSCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
#endif
- 修改启动代码
按照如下所示修改startup_stm32f10x_md.s文件
; 此处省略n行代码; Vector Table Mapped to Address 0 at Reset
; 此处修改AREA RESET, DATA, READONLY 为 AREA RESET, CODE, READONLYAREA RESET, CODE, READONLYEXPORT __VectorsEXPORT __Vectors_EndEXPORT __Vectors_Size__Vectors DCD __initial_sp ; Top of StackDCD Reset_Handler ; Reset HandlerDCD NMI_Handler ; NMI HandlerDCD HardFault_Handler ; Hard Fault HandlerDCD MemManage_Handler ; MPU Fault Handler; 此处省略n行代码DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend; 下面是需要新添加的内容:DCD 0DCD 0DCD 0DCD 0DCD 0DCD 0DCD 0LDR R0, =0x20000000LDR SP,[R0]LDR R0, =0x20000004 LDR PC,[R0]ALIGN 4
; 以上是需要添加的代码; 此处省略n行代码
- 修改链接脚本
按照下图所示方式,即可在Keil编辑器中打开链接脚本:
打开链接脚本文件后,将内容修改如下:
; 以STM32F103C8T6为例
; 从SRAM启动终端向量表(RESET段)必须位于启动空间的0地址
; InRoot$$Sections 必须位于root区域(执行地址与装载地址相同的区域)LR_IROM1 0x20000000 0x00005000 { ;装载地址为SRAM首地址RW_IRAM1 0x20000000 0x00005000 { ;执行地址==装载地址*.o (RESET, +First)*(InRoot$$Sections).ANY (+RO).ANY (+XO).ANY (+RW +ZI)}
}
- 修改Keil中的Flash Download设置
因为是直接从SRAM启动并执行程序,不需要对Flash进行操作,所以把Flash相关操作全部去掉。
- 以上就是完整的配置,现在编译项目并点击调试,就能看到程序成功在SRAM中运行了。
- 关闭调试后,只要STM32不断电,SRAM中的程序就可以一直运行,并且按下复位键后程序会重新运行。
2.3.4. 【补充】在 SRAM 中运行代码:
实现步骤:在SRAM中运行代码 - EdgeAI Lab
我的原文笔记:https://www.yuque.com/u41716106/ni1clp/bhxgk39vmaev9p26?singleDoc#
《【个人理解】MCU三种启动方式(Boot选择)[主Flash/系统存储器(BootLoader)/嵌入式SRAM]》
相关文章:
【单片机开发】MCU三种启动方式(Boot选择)[主Flash/系统存储器(BootLoader)/嵌入式SRAM]
目录 参考资料: 利用 Boot 选择不同的启动方式: 单片机的存储结构(主 FLASH/系统存储器/嵌入式 SRAM): 1. Cortex-M 内核芯片——启动原理: 1.1. 启动流程: 1.2. 根据单片机的存储器映射和架构图:启动…...
实验15 验证LSTM模型的长程依赖
本次实验依托上个实验 一 模型构建 创建LSTM模型,里面包括初始化init函数、初始化权重函数_init_weights、初始化状态函数init_state、前向传播函数forward。 init函数:虽然每个时间的输入和隐层都是一样的,但是他们会有四组不同的权重&am…...
Charles功能说明
1.扫把(clear the current Session) (前头方向) 作用:清除所有抓取的包(正方形框) 2.中心圈-未启用显示(Star Recording)点击启动 -启动之后显示(Stop Recording)点击停止 作用:启动之后开始抓取包(刷新一次页面或跳转抓取内容) 3.锁-未启动显示(Star SSL Proxying)点击启动 -启…...
自动秒收录程序与自动秒收录网站源码论坛版本下载
自动秒收录程序与自动秒收录网站源码论坛版本下载 随着互联网的快速发展,网站优化已成为众多企业和个人博主提升在线影响力的关键手段。其中,SEO(搜索引擎优化)作为提升网站排名的核心策略,备受关注。而SEO优化的一个…...
HTML颜色-HTML脚本
HTML脚本 js使得HTML页面具有更强的动态和交互性 HTML<script>标签 标签用于定义客户端脚本,比如javascript 可包含脚本语句,也可以通过src属性指向外部的脚本文件 JavaScript最常用于图片操作,表单验证以及动态的内容更新 HTML<n…...
【WRF理论第十三期】详细介绍 Registry 的作用、结构和内容
目录 1. Introduction:介绍 Registry 的作用和功能。2. Registry Contents:详细描述 Registry 的结构和内容,包括各个部分的条目类型。2.1. DIMSPEC ENTRIES(维度规格条目)2.2. STATE ENTRIES(状态变量条目…...
使用Kimi开发自己的问答应用
概述 Kimi是大家常用的一个人工智能助手,本文使用Kimi开发文档,以node作为后端,开发与一个问答系统 实现效果 Kimi简介 Kimi是由Moonshot AI开发的人工智能助手,擅长中文和英文对话。目标是帮助用户解决问题、提供信息和执行任…...
Vue前端开发-路由其他配置
在路由文件中,除了跳转配置外,还可以进行路径重定向配置,如果没有找到对应的地址,还可以实现404的配置,同时,如果某个页面需要权限登录,还可以进行路由守卫配置,接下来,分…...
AI与遥感的融合:构建新一代智能监测作业平台
在测绘地理信息与遥感领域,人工智能(AI)技术的融合正推动着一场监测作业模式的革命。AI不仅提升了数据处理的效率,还极大地扩展了遥感技术的应用范围和深度。 遥感监测的智能化趋势 随着遥感数据量的激增,传统的人工…...
3D 视觉定位技术:汽车零部件制造的智能变革引擎
在汽车零部件制造领域,传统工艺正面临着前所未有的挑战。市场对于零部件精度与生产效率近乎苛刻的要求,促使企业寻求突破之道。而 3D 视觉定位技术,为汽车零部件制造开启了精准定位与智能化生产的新纪元。 3D 视觉定位系统的核心技术原理 3…...
git提交时出现merge branch main of xxx
git提交时出现merge branch main of xxx 原因: 1、同事commit了一个修改A,push到remote 2、我把这个修改直接pull了下来(pull是fetchmerge的操作,自动合并到本地workspace) 3、同事因为后续的commit有冲突,…...
重生之我在异世界学编程之C语言:深入结构体篇(上)
大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文《1》 结构体的两种声明一、结构…...
到达率和服务率在python中实现
到达率和服务率在python中实现 概念理解 到达率(Arrival Rate):是指顾客(或任务、事件等)到达服务系统的平均速率,通常用单位时间内到达的数量来表示。例如,在一个客服中心,每小时平均有10个客户来电咨询,这里的每小时10个客户就是到达率。服务率(Service Rate):是…...
重视猫艾滋:宠物健康的隐秘挑战
猫艾滋,全称为猫获得性免疫缺陷综合征(Feline Acquired Immunodeficiency Syndrome),是由猫免疫缺陷病毒(FIV)感染引起的一种严重危害猫类健康的疾病。虽然其名称与人类艾滋病相似,但猫艾滋仅在…...
使用长轮询解决某些场景的实时消息推送需求
需求来源 最近做一个需求实现在移动端通过按钮,远程控制大屏幕上展示的资源进行实时切换,可以展示一个大屏页面,可以展示一段视频,也可以展示一张图片。 解决思路 大屏幕上打开一个游览器,访问指定动态资源展示页面…...
uniapp-内部项目使用文档
uniapp-内部项目使用文档 目录 uniapp-内部项目使用文档阶段1自行实现内容:阶段1问题记录: 阶段2自行实现内容: 阶段3 APP项目介绍及规范阶段4 公共组件方法UseList 列表页面HooksListItem 列表项uni-load-more 列表加载更多组件CardTitle 列…...
linux搭建NFS服务和autofs自动挂载NFS
文章目录 1、nfs服务1、nfs原理2、RPC和NFS通讯原理3、RPC和NFS流程4、NFS工作流程5、服务端搭建6、客户端搭建7、autofs自动挂载 1、nfs服务 1、nfs原理 是一个NAS的存储,通过网络来进行文件的共享,表现出来的形式就是一个文件夹 可以支持多个linux挂…...
springboot415社区网格化管理平台的构建-(论文+源码)_kaic
摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本社区网格化管理平台就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据…...
ubuntu下open-webui + ollama本地大模型部署
文章目录 nvidia gpu驱动安装 安装卸载 ollama 部署 添加docker秘钥docker配置添加国内镜像源ollama安装 从源拉取ollama镜像。启动一个ollama容器 通过ollama下载模型到本地检验本地模型 open-webui 部署 安装容器和镜像下载webui使用查看模型运行时内存、cpu、gpu占用 业余…...
自动化运维-配置Mysql、emqx、redis、nginx等通用性Linux日志分割工具 - logrotate
前言:logrotate 是一个在 Linux 系统中用于管理和轮转日志文件的工具。它的主要目的是帮助系统管理员自动执行日志文件的轮转、压缩、删除和邮件通知等任务,以防止日志文件占用过多的磁盘空间,同时保持日志文件的可管理性。 参考命令&#x…...
71、docker镜像制作上传/下载到阿里云
基本思想:简单学习一下如何制作镜像和上传下载到私有阿里云,然后构建一个gpu的训练/推理环境,以备后续使用 一、配置环境 ubuntu@ubuntu:~$ sudo apt-get install docker.ioubuntu@ubuntu:~$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS P…...
力扣--LCR 178.训练计划VI
题目 教学过程中,教练示范一次,学员跟做三次。该过程被混乱剪辑后,记录于数组 actions,其中 actions[i] 表示做出该动作的人员编号。请返回教练的编号。 示例 1: 输入:actions [5, 7, 5, 5] 输出&#…...
独孤思维:又有一个副业项目降价了
不要过早量出底牌,不然会变得低贱且廉价。 昨天在一个群里,看到有个博主,没有成交订单。 她把和用户的聊天对话发出来,我们大致看了下。 发现人家是有意向付费的。 但是这个博主过于心急,说今天加入可以优惠&#…...
【笔记】分布式任务调度平台XXL-JOB
这篇笔记主要记录以下内容: (1)第一次启动xxl-job的过程 (2)模块、文件、数据库(表和字段)的作用 (3)极少的源码解读(XxlJobConfig) 有点像实…...
Java基础总结上(Ref:JavaGuide)
基础概念与常识 Java语言有哪些特点,优点? 简单易学,是一门面向对象的语言,有封装继承多态三大特性,而且有多重防护机制保证安全性,例如权限修饰符,限制程序直接访问操作系统资源。通过JIT编译…...
嘉誉府5区共有产权看房记
特地工作日来看下嘉誉府5区的网红共有产权的房子,主要是冲着均价2.1万/平才来看。说实话从塘尾地铁步行到嘉誉府5区还挺需要时间的哈。可能以后需要电驴代步到地铁?确实楼盘现在是现楼,今年买明年住。鸿荣源确实很666哈。 今天来不需要排队&a…...
PostgreSQL函数中使用now()或current_timestamp的异同
在PostgreSQL函数中使用now()或current_timestamp可以获取当前的日期和时间。 now()函数返回当前的日期和时间,包括时区信息。它可以用于记录操作的时间戳或在查询中进行时间比较。 current_timestamp函数也返回当前的日期和时间,但不包括时区信息。它…...
跟李笑来学美式俚语(Most Common American Idioms): Part 56
Most Common American Idioms: Part 56 前言 本文是学习李笑来的Most Common American Idioms这本书的学习笔记,自用。 Github仓库链接:https://github.com/xiaolai/most-common-american-idioms 使用方法: 直接下载下来(或者clone到本地…...
类和对象一
目录 1.类的引入 2.类的定义 3.访问限定符 4.类的作用域 5.类对象模型 6.类的大小 1.类的引入 C语言结构体中只能定义变量,在C中,结构体不仅可以定义变量,也可以定义函数。 C兼容C语言,结构用法可以继续使用 同时sruct也升…...
两个数的和最小
两个数的和最小 C 代码C 代码Java 代码Python 代码 💐The Begin💐点点关注,收藏不迷路💐 给你n个整数,你可以从中任意取两个数a和b,问a加上b的和的绝对值最小可能是多少? 输入 有多组测试数据…...
Mac mini m4本地跑大模型(ollama + llama + ComfyUI + Stable Diffusion | flux)
安装chat大模型(不推荐,本地运行的大模型只能聊废话,不如网页版使用openAI等高效) 首先下载ollama的安装包 https://ollama.com/ 点击启动访问:http://localhost:11434 Ollama is running 代表已经运行起来了&#x…...
IoTDB AINode 报错,call inference 301: Error ocurred while executing inference
问题及现象 使用时序数据库 IoTDB 的 AINode 的 call inference 语句后报错: Msg: org.apache.iotdb.jdbc.IoTDBSOLException:301: Error ocurred while executing inference:[tuple object has no attribute inference]解决方法 可以替换 venv 里面的…...
Linux网络 UDP socket
背景知识 我们知道, IP 地址用来标识互联网中唯一的一台主机, port 用来标识该主机上唯一的一个网络进程,IPPort 就能表示互联网中唯一的一个进程。所以通信的时候,本质是两个互联网进程代表人来进行通信,{srcIp&…...
Day2——需求分析与设计
教师端签到应用软件的需求分析; 产品经理如何写好产品需求文档(附模板) 需求分析是软件开发过程中的关键步骤,它确保了开发的软件能够满足用户的需求。以下是进行需求分析的具体步骤: 1. 确定分析目标 明确教师端签到…...
aosp15上winscope离线html如何使用?
背景: aosp15上的如何使用Winscope前面已经有分享过相关的blog,这块其实和aosp14没啥大的差别,具体可以看如下2个文章: 手把手教你aosp14编译Winscope 安卓aosp15手机上如何离线获取winscope文件 文章中也说明在aosp15如果直接使…...
AttributeError: module numpy has no attribute int .报错解决
AttributeError: module numpy has no attribute int .报错解决方案_attributeerror: module numpy has no attribute i-CSDN博客 以上为参考教程,试了卸载再安装,不行,报错: Found existing installation: numpy 1.24.3 error: …...
python爬虫常用数据保存模板(Excel、CSV、mysql)——scrapy中常用数据提取方法(CSS、XPATH、正则)(23)
文章目录 1、常用数据保存模板2.1 保存为Excel格式2.2 保存为CSV格式2.3 保存至mysql数据库2、scrapy中常用数据提取方法2.1 XPath选择器2.2 CSS选择器2.3 正则表达式1、常用数据保存模板 2.1 保存为Excel格式 # 1、导入模块 from openpyxl import workbook# 2、创建一个exce…...
【面试题】简述rabbitmq的组织架构
[面试题]简述rabbitmq的组织架构 RabbitMQ 是一种流行的消息中间件,其架构设计围绕消息生产者, 消息消费者和消息中转(Broker)展开。以下是 RabbitMQ 的主要组织架构组件和它们之间的关系: 1. 核心组件 1.1 Producer࿰…...
C#-WPF 常见类型转换方法(持续更新)
目录 一、普通类型转换 1、Convert类 2、Parse(转String) 3、TryParse(转String) 4、ToString(转String) 5、int转double 6、String转DateTime 7、自定义类型的显示/隐式转换 二、byte[]转ImageSource 方法一 方法二 一、普通类型转换 1、Convert类 提供了一种安全…...
c基础加堆练习题
1】思维导图: 2】在堆区空间连续申请5个int类型大小空间,用来存放从终端输入的5个学生成绩,然后显示5个学生成绩,再将学生成绩升序排序,排序后,再次显示学生成绩。显示和排序分别用函数完成 要求ÿ…...
做了一份前端面试复习计划,保熟~
前言 以前我看到面试贴就直接刷掉的,从不会多看一眼,直到去年 9 月份我开始准备面试时,才发现很多面试经验贴特别有用,看这些帖子(我不敢称之为文章,怕被杠)的过程中对我的复习思维形成影响很大…...
虚幻引擎开发命名规则
UE的命名规则如下: 模版类以T作为前缀,例如TArray, TMap, TSet。UObject派生类都以U前缀。AActor派生类都以A前缀。SWidget派生类都以S前缀。全局对象使用G开头,如GEngine。抽象接口以I前缀。枚举以E开头。bool变量以b前缀,如bPe…...
【蓝桥杯每日一题】砍竹子
砍竹子 2024-12-7 蓝桥杯每日一题 砍竹子 STL 贪心 题目大意 这天, 小明在砍竹子, 他面前有 nn 棵竹子排成一排, 一开始第 ii 棵竹子的 高度为 h i h_i hi. 他觉得一棵一棵砍太慢了, 决定使用魔法来砍竹子。魔法可以对连续的一 段相同高度的竹子使用, 假设这一段竹子的高度为…...
Lambda表达式随记
学习链接 目录 作用定义[capture list] 捕获列表(paramter) 参数列表mutable 可变规格throw() 异常说明-> return-type 返回类型{function statement} lambda函数体 Lambda表达式的优缺点Lambda表达式工作原理适用场景STL算法库短小不需要复用函数场景 作用 Lambda表达式&…...
Vulhub:Log4j[漏洞复现]
CVE-2017-5645(Log4j反序列化) 启动靶场环境 docker-compose up -d 靶机IPV4地址 ifconfig | grep eth0 -A 5 ┌──(root㉿kali)-[/home/kali/Desktop/temp] └─# ifconfig | grep eth0 -A 5 eth0: flags4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 in…...
ubuntu系统生成SSL证书配置https
自签名【Lets Encrypt】的测试证书,有效期三个月。 第一步:安装acme,如果没有安装git,需要提前安装 下载came资源 git clone https://github.com/Neilpang/acme.sh.git 无法访问,可以试用gitee的资源,安…...
记录 idea 启动 tomcat 控制台输出乱码问题解决
文章目录 问题现象解决排查过程1. **检查 idea 编码设置**2. **检查 tomcat 配置**3.检查 idea 配置文件4.在 Help 菜单栏中,修改Custom VM Options完成后保存,并重启 idea 问题现象 运行 tomcat 后,控制台输出乱码 解决排查过程 1. 检查 id…...
C++ unordered_map和unordered_set的使用
1.unordered_set系列的使用 1.1unordered_set和unordered_multiset参考文档 unordered_set和unordered_multiset参考文档 1.2unordered_set类的介绍 • unordered_set的声明如下,Key就是unordered_set底层关键字的类型 • unordered_set默认要求Key⽀持转换为整…...
【探商宝】OpenAI 发布 Sora:视频生成领域的重大突破
2024 年 12 月 10 日,OpenAI 正式推出了备受瞩目的人工智能视频生成模型 Sora,这一举措在科技界引起了轩然大波,为视频创作领域带来了全新的可能性和变革. 一、Sora 的功能与特性 1. 强大的视频生成能力 Sora 能够根据用户输入的文本描述生…...
[代码随想录Day32打卡] 理论基础 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯
理论基础 题型 动归基础(这一节就是基础题)背包问题打家劫舍股票问题子序列问题 动态规划五部曲 确定dp数组及其下标的含义确定递推公式dp数组如何初始化遍历顺序打印dp数组 509. 斐波那契数 简单~ dp数组及下标含义: dp[i]表示第i各斐…...