七日宠姬bss 段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域;
数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域;
代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域;
这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读(某些架构也允许代码段为可写,即允许修改程序);
堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减;
当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);
也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量);
除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中;
由于栈的先进先出(FIFO)特点,所以栈特别方便用来保存/恢复调用现场;
2.6、一个程序本质上都是由 bss 段、data 段、text 段三个组成
在嵌入式系统的设计中也非常重要,牵涉到嵌入式系统运行时的内存大小分配,存储单元占用空间大小的问题。
在采用段式内存管理的架构中(比如intel的80x86系统),bss 段通常是指用来存放程序中未初始化的全局变量的一块内存区域。
一般在初始化时 bss 段部分将会清零,bss 段属于静态内存分配,即程序一开始就将其清零了。
比如,在C语言之类的程序编译完成之后,已初始化的全局变量保存在.data 段中,未初始化的全局变量保存在.bss 段中。
text和data段都在可执行文件中(在嵌入式系统里一般是固化在镜像文件中),由系统从可执行文件中加载,而bss段不在可执行文件中,由系统初始化。
区别很明显,一个位于.bss段,而另一个位于.data段,两者的区别在于:
bss 段(未手动初始化的数据)并不给该段的数据分配空间,只是记录数据所需空间的大小;
bss 段的大小从可执行文件中得到 ,然后链接器得到这个大小的内存块,紧跟在数据段后面。
data 段(已手动初始化的数据)则为数据分配空间,数据保存在目标文件中;
data 段包含经过初始化的全局变量以及它们的值,当这个内存区进入程序的地址空间后全部清零。
STM32 的存储器结构中 Flash,SRAM 寄存器和输入输出端口被组织在同一个 4GB 的线性地址空间内。
所以,只要不外扩存储器,写完的程序中的所有东西也就会出现在这两个存储器中。
单片机是一种集成电路芯片,集成CPU、RAM、ROM、多种I/O口和中断系统、定时器/计数器等功能。CPU中包括了各种总线电路,计算电路,逻辑电路,还有各种寄存器。
Stm32 有通用寄存器 R0‐ R15 以及一些特殊功能寄存器,其中包括了堆栈指针寄存器。
当stm32正常运行程序的时候,来了一个中断,CPU就需要将寄存器中的值压栈到RAM里,然后将数据所在的地址存放在堆栈寄存器中。
等中断处理完成退出时,再将数据出栈到之前的寄存器中,这个在C语言里是自动完成的。
在编程中很多时候会提到堆栈这个东西,准确的说这个就是RAM中的一个区域。
2) 段的划分,是将类似数据种类存储在一个区域里,方便管理,但正如上面所说,不管什么段的数据,都是最终在flash和ram里面。
这个是 MDK 编译之后能够得到的每个段的大小,也就能得到占用相应的FLASH和RAM的大小,但是还有两个数据段也会占用RAM,但是是在程序运行的时候,才会占用,那就是堆和栈。
在stm32的启动文件.s文件里面,就有堆栈的设置,其实这个堆栈的内存占用就是在上面RAM分配给RW-data+ZI-data之后的地址开始分配的。
是程序运行的时候局部变量的地方,所以局部变量用数组太大了都有可能造成栈溢出。
堆栈的大小在编译器编译之后是不知道的,只有运行的时候才知道,所以需要注意一点,就是别造成堆栈溢出了,会出现 hardfault 问题。
1)用庞大的全局变量数组来圈住一块内存,然后将这个内存拿来进行内存管理和分配。
如果没有初始化数组,或者数组的初始化值为0,堆栈就是占用的RAM的ZI-data部分;
2)就是把编译器没有用掉的RAM部分拿来做内存分配,也就是除掉RW-data+ZI-data+编译器堆+编译器栈后剩下的RAM内存中的一部分或者全部进行内存管理和分配。
这样的情况下就只需要知道内存剩下部分的首地址和内存的尾地址,然后要用多少内存,就用首地址开始挖,做一个链表,把内存获取和释放相关信息链接起来,就能及时的对内存进行管理了。
内存管理的算法多种多样,不详说,这样的情况下:OS的内存分配和自身局部变量或者全局变量不冲突,之前我就在这上面纠结了很久,以为函数里面的变量也是从系统的动态内存中得来的。
默认的STM32F FOC SDK提供的工程文件下载到STM32以后不会电机不会自动转,想要让电机转,必须通过串口上位机ST Motor Control Workbench这个软件 若想脱离上位机让电机上电自动旋转,需要在main函数里面调用电机启动函数 UI_ExecCmd (oUI, MC_PROTOCOL_CMD_START_MOTOR); 根据UM1052 User manual STM32F PMSM single/dual FOC SDK v4.2手册中描述的可以利用FOC提供的UI函数来屏蔽底层驱动,直接在用户层编写程序 提供的函数定义在 UserInterfaceClass.c 中,
一、启动模式(Boot modes) 阅读:STM32中文参考手册_V10.pdf 查看启动配置(Boot modes)。 在STM32F10xxx里,可以通过BOOT 引脚选择三种不同启动模式。 STM32三种启动模式对应的存储介质均是芯片内置的,它们是: 1)用户闪存 = 芯片内置的Flash。 2)系统存储器 = 芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP程序。这个区 域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROM区。 3)SRAM = 芯片内置的RAM区,就是内存啦。 在每个STM32的芯片上都有两个管脚BOOT0和BOOT1,这两个管脚在芯片复位时的电平
程序的烧录方式 与 ISP一键下载 /
摘要:听说还有好多学单片机的小伙伴不会用结构体?指针和结构体是学单片机必须要掌握的,如果你C语言掌握的不牢,单片机根本学不到精髓,只能完成一些低级的项目。看得懂结构体并且能够灵活运用结构体才能说你入门了单片机。本篇将以最通俗的方式结合STM32单片来讲讲结构体的运用。解决你学完C语言、考过了计算机二级还是看不懂单片机结构体的苦恼。宝藏文章,记得点赞转发收藏。 大家知道指针和结构体是单片机的难点,所以就去学习C语言,找视频看书。 这里面每一个视频的播放量都非常高。对于单纯的学习C语言,这里讲的很清楚。看完你不禁在下面评论一句:哇!讲的真的太清楚了吧!但是等你真正的学单片机的时候,你会发现我不是学过C语言吗?计算机二级我也过了
对于MCU,一切底层配置,最终都是在配置寄存器。 STM32F1xx官方资料: 《STM32中文参考手册V10》-第8章通用和复用功能IO(GPIO和AFIO) 51单片机访问地址 51单片机经常会引用一个reg51.h的头文件。下面看看它是怎么把名字和寄存器联系在一起的: sfr p0=0x80; p0=0x00; sfr是一种扩充数据类型,点用一个内存单位,值域为0-255.利用它可以访问51单片机内部所有的特殊功能寄存器。前一句“sfr p0=0x80”就是将P0映射到地址0x80。后一句“p0=0x00”就是往p0地址(0x80)代表的寄存器写值。 STM32访问地址 寄存器地址名称映射 STM32肯定也是
】MDK中寄存器地址名称映射分析 /
1、普通推挽输出(GPIO_Mode_Out_PP): 使用场合:一般用在0V和3.3V的场合。线路经过两个P_MOS 和N_MOS 管,负责上拉和下拉电流。 使用方法:直接使用 输出电平:推挽输出的低电平是0V,高电平是3.3V。 2、普通开漏输出(GPIO_Mode_Out_OD): 使用场合:一般用在电平不匹配的场合,如需要输出5V的高电平。 使用方法:就需要再外部接一个上拉电阻,电源为5V,把GPIO设置为开漏模式, 当输出高组态时,由上拉电阻和电源向外输出5V的电压。 输出电平:在开漏输出模式时,如果输出为0,低电平,则使N_MOS 导通,使输 出接地。若控制输出为1(无法直接输出高电平),则
iic.h文件如下: #ifndef _stm32f103_myi2c_h_ #define _stm32f103_myi2c_h_ //IO方向设置 #define SDA_IN() {GPIOB- CRH&=0XFFFF0FFF;GPIOB- CRH=8 12;} #define SDA_OUT() {GPIOB- CRH&=0XFFFF0FFF;GPIOB- CRH=3 12;} //IO操作函数 #define IIC_SCL PBout(10) //SCL #define IIC_SDA PBout(11) //SDA #define READ_SDA
简介: CAN是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。由德国电气商博世公司在1986年率先提出。此后,CAN通过ISO11898及ISO11519进行了标准化。现在在欧洲已是汽车网络的标准协议。 CAN协议经过ISO标准化后有两个标准:ISO11898标准和ISO11519-2标准。其中ISO11898是针对通信速率为125Kbps~1Mbps的高速通信标准,而ISO11519-2是针对通信速率为125Kbps以下的低速通信标准。 CAN具有很高的可靠性,广泛应用于:汽车电子、工业自动化、船舶、医疗设备、工业设备等方面。 特点: 多主控制。总线空闲时
系列第25篇--CAN总线 /
中国上海,2007年6月27日 —— ARM公司(伦敦证交所:ARM;纳斯达克:ARMHY)宣布即日起,RealView微控制器开发工具包将支持意法半导体基于ARM Cortex-M3处理器的全新 STM32F1xx系列器件。 STM32F101 (接入行)和STM32F103 (性能行)将是意法半导体首个基于ARM Cortex-M3处理器的器件系列,兼具卓越的高性能和低功耗,待机功耗仅为2?A。该系列器件拥有高达72MHz的CPU时钟速度、128Kbyte片上闪存ROM及20Kbyte片上RAM,还包括A/D、CAN、USB、SPI、I2C等众多外设及多达80个GPIO。 RealView微控制器开发工具包3.1可
F103传感器驱动代码
F4差异文档
的智能手表项目案例源代码(智能穿戴领域应用)
H7B3I的FFT频谱仪
使用STM32 Nucleo撬开针对物联网的ARM mbed IDE之门
STM32CubeMX and STM32Cube HAL basics
解锁【W5500-EVB-Pico】,探秘以太网底层,得捷电子Follow me第4期来袭!
【下载】LAT1317 STM32CubeProgrammer和STM32CubeIDE协同调试的方法
【下载】LAT1334 基于MCSDK5.4.8电机库修改两电阻采样方法
【直播】轻松使用STM32MP13x如MCU般在Cortex A 核上裸跑应用程序
【新品】STM32H5-Arm® Cortex®-M33 内核,主频高达250MHz,提升性能与信息安全性
【新品】STM32MP13X-支持Linux、RTOS和Bare Metal应用,新一代通用工业级MPU
【新品】Arm® Cortex®-M33处理器内核,运行频率160 MHz,基于Armv8-M架构并带有TrustZone®
【Matter】康普和意法半导体强强联手,让物联网设备Matter证书管理既安全又简便
【方案】STM32WLE5 x 利尔达LoRa模组助力亚残会开幕式惊艳秀
【新品】意法半导体发布远距离无线微控制器,提高智能计量、智能建筑和工业监控的连接能效
2023年12月20日,中国 - 意法半导体新软件帮助工程师把STM32微控制器应用代码移植到性能更强大的STM32MP1微处理器上,将嵌入式系统设计性 ...
瑞萨推出面向图形显示应用和语音/视觉多模态AI应用的 全新RA8 MCU产品群
瑞萨基于Arm® Cortex®-M85处理器的产品在优化图形显示功能的同时,为楼宇自动化、智能家居、消费及医疗应用带来超高性能和领先的安全性2 ...
Microchip推出PIC18-Q24 系列单片机 为增强代码安全性设置新标准
该系列单片机新增电压电平转换功能,有助于提高灵活性并降低系统成本从手机、汽车到智能恒温器和家用电器,越来越多日常设备与云端相连。随 ...
今天就分享一个读者问到的关于中断处理的问题。 很多人都知道STM32CubeMX这套工具的一个目的:减少开发者对STM32底层驱动的开发时间,把重 ...
在万利STM32学习板的USB摇杆例程中,摇杆的按键处理并没有消抖处理,因此重新修改了摇杆的驱动,顺便还增加了两个按键以及摇杆中键下压的驱 ...
STM32F103+ESP8266接入机智云 实现小型IOT智能家居项目
stm32mp1 Cortex M4开发篇2:通过GPIO点亮LED灯详解
ST 向大众市场推出ST4SIM M2M用兼容GSMA的eSIM卡芯片
消息称三星Exynos 2500芯片秘密开发中 自研GPU将基于AMD技术
三星电子内部开始自研“智能传感器” 预计将应用于无人驾驶和AI半导体制造
消息称台积电 2024 年 3nm 芯片激增,特斯拉将成为 N3P 客户
Mentor线上研讨会 教你在设计工具中进行DFM分析,轻松兼顾效率、成本和质量
站点相关:综合资讯51单片机PIC单片机AVR单片机ARM单片机嵌入式系统汽车电子消费电子数据处理视频教程电子百科其他技术STM32MSP430单片机资源下载单片机习题与教程
|