单片机开发中的内存溢出的状况

发布者:RadiantEyes最新更新时间:2024-07-15 来源: elecfans关键字:单片机开发  内存溢出  STM32 手机看文章 扫描二维码
随时随地手机看文章

在进行单片机开发的过程中,出现单片机内存溢出的小状况及总结:

  1. 循环遍历溢出

  2. 在初学C语言时可能会犯的错误,for循环遍历一个数组时,循环的次数超出了数组的长度。c语言编程时都要特别注意,细心。

  3. 各种string.h中的函数

    string.h提供了许多方便的处理字符串的函数,像是strcpy,strcmp。但是这些函数都是用于处理字符串的,它们的参数都只给了一块内存的首地址,函数通过’’字符来判断是否到了字符串结尾。如果用这些函数处理一块不含’’的内存(或者自己代码有误没把’’写进去),就会发生内存溢出的问题。

    推荐使用带n的函数,例如strncmp,memcpy,snprintf等,这样就可以配合sizeof来限制要处理的内存的长度,不发生越界。

  4. sizeof的使用

  5. sizeof反馈的是数据结构的字节数。在STM32上,sizeof(int)就是4,sizeof(float)也是4。不过最常用的还是sizeof自己定义的各种各样的结构体。

    但是我有一次不小心把sizeof(结构体类型名)写成了sizeof(结构体指针名)。这样sizeof就反馈的不是结构体占有的字节数了,而是一个指针占有的字节数(在32位单片机上是4个字节)。于是又导致了规划的内存空间长度比实际数据长度短,然后又溢出了。

  6. 多线程”合作

    遇到的bug是前后台系统数据处理速度不匹配造成的(我不知道前后台系统能否称为多线程,故打了引号)。

    两个模块之间,如果数据产生速度远大于数据处理速度,就会造成数据的积压然后爆内存(感觉有点像电磁场里面散度>0,算了我又在瞎想了),这种情况下,即使有再大的FIFO也不够,因为数据总是会爆满的。最好的办法就是降低数据产生速度,或者提高数据处理速度。


关键字:单片机开发  内存溢出  STM32 引用地址:单片机开发中的内存溢出的状况

上一篇:rt-thread操作系统下timer使用
下一篇:STM32的GPIO使用

推荐阅读最新更新时间:2024-11-12 23:45

基于STM32的半导体激光光源驱动器的设计方案
  0 引言   半导体激光器是实用中最重要的一类激光器。半导体激光器具有转换效率高、体积小、重量轻、可靠性高,能直接调制等优点。由于半导体激光器的这些优良特性,因而越来越广泛地被用于国防、科研、医疗、光通信等领域。由于半导体激光器的输出光强主要受电流和温度两个物理量影响,因此实现半导体激光器驱动电流和温度的精密控制十分重要。   本方案设计了一套完善的半导体激光器驱动控制系统。系统采用的微控制器是基于Cortex-M3内核的ARM微控制器STM32F103VCT6,其具有低成本、低功耗等特点,并以TEC驱动器MAX1968为执行器件,MAX1968能高效率工作以减小热量,而且体积小,系统外部元件少,因此设计的驱动器具有高性价
[单片机]
基于<font color='red'>STM32</font>的半导体激光光源驱动器的设计方案
STM32捕获/比较通道
每一个捕获/比较通道都是围绕着一个捕获/比较寄存器(包含影子寄存器),包括捕获的输入部分(数字滤波、多路复用和预分频器),和输出部分(比较器和输出控制)。 输入:数字滤波、多路复用和预分频器 输出:比较器和输出控制 在捕获模式下,捕获发生在影子寄存器上,然后再复制到预装载寄存器中。 在比较模式下,预装载寄存器的内容被复制到影子寄存器中,然后影子寄存器的内容和计数器进行比较。 输出比较模式的配置步骤: 1. 选择计数器时钟(内部,外部,预分频器) 2. 将相应的数据写入TIMx_ARR和TIMx_CCRx寄存器中 3. 如果要产生一个中断请求和/或一个DMA请求,设置CCxIE位和/或CCxDE位。 4. 选择输出模式,例如
[单片机]
stm32专题八:端口复用及重映射
stm32有很多的外设,这些外设的引脚都是与GPIO引脚复用的。也就是说,一个GPIO,既可以当作普通的IO口(此时按照通用配置),也可以配置为外设引脚(此时配置为复用输出/输入),如串口USART,IIC,之前提到的MCO系统时钟监测引脚等,接下来专门介绍端口复用和重映射。 在stm32中文参考手册的第8章,有专门提到端口复用的章节如下 以下是关于复用功能的描述: 根据描述我们知道,在使用复用功能前,我们需要先配置对应的GPIO。具体配置的结构框图,也在“复用功能配置”中有说明。注意,在复用开漏模式下,读输入数据寄存器IDR可以得到IO口的状态,很明显,这在软件模拟IIC时,获得应答信号ACK非常有用。那么外设的GP
[单片机]
<font color='red'>stm32</font>专题八:端口复用及重映射
关于Stm32内核外设Systick与普通外设中断优先级的比较
有网友经实验验证,Systick虽然作为与CPU紧耦合的内核外设,但其中断优先级并不比普通外设要高,并不因为它是内核外设而特殊,它还是遵循中断优先级高低的规则来响应。 https://blog.csdn.net/To_be_a_fisher/article/details/84986790 Systick优先级是最低的 https://www.cnblogs.com/jieruishu/p/4444701.html Systick虽然作为与CPU紧耦合的内核外设,但其中断优先级并不比普通外设要高,并不因为它是内核外设而特殊,它还是遵循中断优先级高低的规则来响应。 NVIC_SetPriority (SysTi
[单片机]
STM32下单只DS18B20的驱动
折腾了一晚上,才把DS18B20的驱动移植到STM32上来。以前在51上使用过单个和多个连接的DS18B20,有现成的程序了,以为很快就能弄好,结果还是被卡住了,下面说下几个关键点吧: 首先是延时的问题,STM32上若用软件延时的话不太好算时间,所以要么用定时器要么用SysTick这个定时器来完成延时的计算。相比之下用SysTick来的简单方便点。 接着是STM32 IO脚的配置问题,因为51是双向的IO,所以作为输入输出都比较方便。STM32的IO是准双向的IO,网上查了下资料,说将STM32的IO配置成开漏输出,然后外接上拉即可实现双向IO。于是我也按规定做了,但调了老半天都不成功,是因为DS18B20没有响应的信号
[单片机]
STM32 USART 使用DMA 详解
前言(绕开吧): 这段时间由于我们的项目Manibus板卡需要融入 WIFI, BLT, 网口,CAN,串口的多位一体通讯,互不干扰,而且可以相互调用彼此进行数据通讯,这里为了节省MCU资源,所以就使用DMA的方式来进行串口 和 ESP8266的通讯,接下来就介绍一下具体的操作内容! DMA具体的不介绍,总的来说,他就是一个中转站,数据给DMA,他帮你传递或接受,你只要读就行了!! 接下来看代码! void localUsartDMAConfig(void){ DMA_InitTypeDef DMA_InitStructure; RCC_AHBPeriphClockCmd(RC
[单片机]
<font color='red'>STM32</font> USART 使用DMA 详解
STM32单片机的串口通信波特率计算方法
1. 什么是波特率 不管是什么单片机,在使用串口通信的时候,有一个非常重要的参数:波特率。什么是波特率:波特率就是每秒传送的字节数。双方在传输数据的过程中,波特率一致,这是通讯成功的基本保障。下面以STM32单片机为例,讲解一下串口波特率的计算方法。 2. STM32波特率相关的寄存器 STM32单片机设置波特率的寄存器只有一个:USART_BRR寄存器,如下图所示。 该寄存器的有效位数为16位,前4位用于存放小数部分,后12位用于存放整数部分。将波特率算出来后,数值填入这个波特率就可以了。下面介绍如何计算。 3. 波特率计算方法 STM32的数据手册给出了计算方法,有一个公式,如下图所示: 在这个公式上,共有三个变量
[单片机]
<font color='red'>STM32</font><font color='red'>单片机</font>的串口通信波特率计算方法
蓝桥杯单片机设计与开发笔记(三)
数码管显示几乎是每次蓝桥杯单片机设计与开发组竞赛的必考部分,相对于使用LCD1602作为显示设备,使用数码管来显示能够更好的考察参赛选手的单片机基本功,因为CT107D开发平台的设计使得数码管的显示不仅牵扯到数码管显示的 基本内容,还涉及到74HC573锁存器,74HC02异或门,74HC138译码器,以及中断的知识,所以这是值得我们重视的一个部分。 一、原理分析 根据CT107D的原理图我们可以看出,数码管显示同样涉及到74HC573、74HC138和74HC02,这与上一节中的LED灯、继电器和蜂鸣器的控制大同小异。如下图,蓝色标注为位选控制端口,由锁存器U6来控制,需配置红色标注的Y6C来控制锁存;黄色标注为段选控制端口
[单片机]
蓝桥杯<font color='red'>单片机</font>设计与<font color='red'>开发</font>笔记(三)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved