嵌入式系统中的内存分布在嵌入式系统中,内存的管理和组织对于系统的性能和稳定性至关重要。内存主要分为 Flash 和 RAM 两大部分,它们各自存储着不同类型的数据,并且系统中还存在着代码区、全局区、堆区和栈区这四个重要的内存区域。
Flash和RAM的数据存储这个只是主要的部分,可能还有一些没算进去
Flash:Flash 存储器用于存储程序代码和一些只读数据,其存储内容可以表示为:Flash = Code + RO-data + RW-data
.text(code):即编译后的二进制文件,是程序执行的指令集合。
.rodata(RO-data):Read Only data,只读数据,例如只读常量、字面量(字符串)等。
.data初值镜像(RW-data):Read Write data,可读写数据,这些数据在程序启动时需要从 Flash 搬运到 RAM的.data段中。
RAM:随机存取存储器,用于程序运行时的数据存储,其存储内容为:RAM = RW-data + ZI-data。
.data段(RW-data):已初始化的可读写数据,如静态变 ...
嵌入式常识
未读STM32三种启动方式STM32有三种启动模式,用户可以通过设置BOOT0和BOOT1的引脚电平状态,来选择复位后的启动模式:
需要注意的是STM32上电复位以后,代码区都是从0x00000000开始的,三种启动模式只是将各自存储空间的地址映射到0x00000000中。
1.Flash启动:将Flash地址0x08000000映射到0x00000000,这样启动以后就相当于从0x08000000开始的,这是我们最常用的模式;
2.SRAM启动:将SRAM地址0x20000000映射到0x00000000,这样启动以后就相当于从0x20000000开始的,用于调试,笔者基本没用过;
3.系统存储器启动:将系统存储器地址0x1FFFF000映射到0x00000000,这样启动以后就相当于从0x1FFFF000开始执行的,值得注意的是这个系统存储器里面存储的其实是STM32自带的Bootloader代码,这其实是一个官方的IAP,它提供了可以通过UART1接口将用户的代码下载到Flash中的功能,下载完以后再切换到从Flash中启动就可以正常运行了。
STM32启动文件startup_st ...
BROM(一级引导加载程序)基本概念MCU的BROM(Boot ROM,启动只读存储器)代码,是指芯片制造过程中被烧录的,固化在MCU芯片内部的ROM中(独立于Flash)的一段代码,无法被用户更改。
MCU最先运行的就是这段代码,它负责设备上电后最底层的初始化工作,判断启动模式、并加载后续的引导程序Bootloader
BROM作用1. 外设初始配置:BROM通常会做一些最基本的硬件初始化,比如时钟设置、存储器控制器配置等。
2. 启动引导(Boot strapping):MCU上电或复位时,BROM会被第一个执行,判断用来决定MCU的启动方式(比如从外部Flash、内部ROM、或者通过串口、USB等下载程序)。
判断条件:通常是检测Strapping pin管脚,决定启动模式
Strapping pin:用于在上电或复位时配置芯片启动行为或工作模式的引脚
例如:
ESP32的Strapping pin引脚是GPIO0、GPIO2
STM32的相关引脚就是BOOT0、BOOT1
通过检测这两个引脚的电平,来判断如何启动
3. 安全机制:BROM可以集成安全启动(Secure ...
RTT介绍J-Link RTT(Real Time Transfer,实时传输)是 SEGGER 公司为 J-Link 仿真器开发的一项高效调试数据通信技术,用于在嵌入式设备和主机PC之间进行高速、无阻塞的日志输出和数据交互。
在嵌入式开发中,调试信息的打印通常依赖于串口,但若未预留串口,JLINK调试器的RTT(Real-Time Transfer)功能可以成为替代方案。
RTT技术特点
与目标嵌入式应用的双向通信能力
不影响嵌入式应用的实时行为的高速传输速率
使用调试通道(SWD: SWDIO、SWCLK)用作通信(相当于不用再额外占用GPIO等外设接口)
不需要在目标嵌入式系统增加额外的硬件或引脚
任何的J-Link型号都支持(J-Link型号列表和比较可参考https://www.segger.com/products/debug-probes/j-link/models/model-overview/)
能被ARM Cortex-A/R/M系列芯片支持,以及被RISC-V和Renesas RX支持
提供完整的RTT的实现代码
RTT与串口对比:
...
前言在实际开发过程中,经常会遇见卡死的情况,大多数都是因为FreeRTOS的堆栈溢出造成,无论是分配给FreeRTOS的总Heap溢出,或者是单个任务的堆栈不够,都会造成卡死。
所以在FreeRTOS学会定位很重要,可以节省大量的时间,下面就来介绍一下常见的调式手段,在优化内存、定位堆栈溢出有着重要作用
启用FreeRTOS堆栈溢出钩子具体见FreeRTOS中钩子函数相关笔记
输出所有任务的信息vTaskList() 是 FreeRTOS 提供的一个非常有用的调试API,可以输出所有任务的运行状态、剩余栈空间等信息,有助于我们监控对应任务堆栈是否足够,堆栈是否分配过多造成浪费等
要使用vTaskList需要配置这两个宏,具体位置见下方
12#define configUSE_TRACE_FACILITY 1#define configUSE_STATS_FORMATTING_FUNCTIONS 1
configUSE_TRACE_FACILITY: 打开后,FreeRTOS 内核会收集更多和任务相关的运行数据,并使部分调试/统计API可 ...
前言为了方便每一次安装环境都能比较迅速,所以写一篇文档记录配置ESP-IDF环境的流程
参考官方的文档:
快速入门 - ESP32 - — ESP-IDF 编程指南 v5.4.2 文档
搭建ESP-IDF开发环境下载SDK源码和工具集Windows 平台工具链的标准设置 - ESP32 - — ESP-IDF 编程指南 v5.4.2 文档
我们需要的一共有两个东西:
ESP-IDF Frameworks:包含ESP32使用的API(软件库和源代码)和 运行工具链的脚本
ESP-IDF Tools: ESP-IDF需要安装一些必备工具集(平台工具链),才能围绕ESP32构建固件,包括Python、Git、交叉编译器、CMake 和 Ninja等。
我们可以分开下载,但是乐鑫官方为我们提供了一个ESP-IDF离线安装工具,可以同时安装SDK源码和Tool(工具链)等一系列东西
点击修复后,成功支持长路径,点击下一步
这里就是勾选对应的组件,默认即可,底部目标芯片有问题的话再勾选
对应IDF-SDK和工具链的目录,点击安装
然后全部勾选,点击完成
自带命令行使用ESP-IDF安装完 ...
摘自: https://subingwen.cn/cmake/CMake-primer/#2-6-3-%E6%80%BB%E7%BB%93来源: 爱编程的大丙
视频教程:哔哩哔哩_bilibili
官方文档:cmake-commands(7) — CMake 4.0.2 Documentation
CMake概述CMake 是一个跨平台的项目构建工具。关于项目构建还有Makefile(通过 make 命令进行项目的构建),大多是IDE软件都集成了make,比如:VS 的 nmake、linux 下的 GNU make、Qt 的 qmake等,如果自己动手写makefile,就会发现,makefile 通常依赖于当前的编译平台,而且编写makefile 的工作量比较大,解决依赖关系时也容易出错。
而 CMake 恰好能解决上述问题, 其允许开发者指定整个工程的编译流程,再根据编译平台,自动生成本地化的Makefile和工程文件,最后用户只需make编译即可,所以可以把CMake看成一款自动生成 Makefile的工具,其编译流程如下图:
蓝色虚线为makefile构建项目的过程
红 ...
电源转换芯片板子上一般使用的电源就是两类:DCDC(直流-直流变换器),LDO(低压差线性稳压器)
**对电源选择原则上:**大功率电源使用DCDC,因为转换效率很高。而LDO一般使用于小功率电源,电源质量,纹波要求等
线性稳压器LDO
名称:线性稳压器,简称LDO,即Low Dropout Regulator
功能:将较高的输入电压转换为较低且稳定的输出电压(这就是稳压的定义)。LDO的特点是低压差,且只能降压,且即使输入电压与输出电压接近时仍然能够稳定工作。
LDO电源的优缺点(记住纹波小,效率低)
优点:
1.LDO成本低,外围电路少,通常只需要一两个旁路电容
2.LDO负载响应快,输出纹波小,噪声小
缺点:
1.效率低(较大热损失),输入输出压差不能太大(几V左右)
2.LDO只能降压
3.LDO输出电流较低,最高可能就只有几A(1~2A左右),输出功率做不大(同比DC-DC)
应用:适用于低功耗/小功率系统、低纹波、较低噪声的系统,如无线通信设备、音频设备等。
常用LDO芯片:
**AMS1117芯片:**比较经典的芯片,低功耗,常用于5V到3.3
我们的电脑US ...









