单片机的内存问题

华大HC32F460 内存使用注意事项(内存bug) 最近调试HC32F460出现各种奇怪问题,程序不断的从不同位置崩溃,比如增加了堆栈大小(注意,是增加,而且是增加的足够大),修改了一些无关代码,增加了一个啥都不做的线程,等等都会导致程序各种异常,而且调试也找不出原因,表现为与内存溢出一样,内存无然无故变了,但是可以肯定是内存没有溢出,还有的内存竟然无法修改,修改后自己复原了,心里一万个曹尼玛,还有这样的单片机。 但是通过两天的调试,最后怀疑可能是内存问题,之前发现HC32无法使用1,2,1这种方式对齐访问,而其他单片机则不影响,带着怀疑测试,将SRAMH 阅读详情

一、编译优化

1、编译优化说明

  • 编译器想尽办法去压缩程序存储空间,提高运行速度。

  • 一般编译器,优化有多个等级:-O0、-O1、-O2、-O3。 

-O0:缺省(默认)优化级别,不压缩程序存储空间,不提高程序运行速度,保证程序的可靠执行。

-O1:轻度优化,轻度压缩程序存储空间,轻度优化程序运行速度。

-O2:推荐优化等级,在程序存储空间和程序运行速度取得平衡点。

-O3:最高级别的优化等级,有可能导致程序不能运行,也会使用以空间换时间的方法,导致程序体积增大。

2、单片机程序内存说明

Code:代码指令,存储在ROM/Flash,只读不可修改。

RO-data:只读常量(const修饰),存储在ROM/Flash。

RW-data:已初始化全局和静态变量,ROM存初始值,RAM存实际变量。

ZI-data:未初始化全局和静态变量,占用RAM空间。

ROM占用 = Code +RO-data + RW-data

RAM占用 = RW-data + ZI-data

Code、RO-data、RW-data、ZI-data解释说明: https://blog.youkuaiyun.com/qq_45467083/article/details/116203243

查看具体的文本信息:

二、volatile关键字说明

volatile关键字分析,往往应用在三种场合:

(1)、多线程编程共享全局变量的时候,该全局变量要加上volatile进行修饰,让编译器不要省略该变量的访问。

(2)、裸机编程的时候,某函数与中断服务函数共享全局变量的时候,该全局变量要加上volatile进行修饰,让编译器不要省略该变量的访问。

(3)、ARM定义寄存器的时候,寄存器是指向一个地址,要加上volatile进行修饰,让编译器不要优化而省略该变量的访问。

编译器不要优化该变量指的是防止编译器出现优化过度,导致代码运行失效。 加上volatile关键字生成的汇编代码会发生明显的变化,同样调用delay函数,灯的速度发生变化!

汇编指令参考:https://blog.51cto.com/u_12468355/3402996?b=totalstatistic

三、仿真调试

  • 首先,需要将单片机通过调试器(j-link就有这个功能)连接到电脑上,就可以在电脑上的keil5软件上去调试单片机

  • 其次,学会keil5软件上的debug的操作,仿真调试实时跟踪代码的运行,程序出现问题并能跟踪到问题所在。能够观察变量的变化、逐步执行代码。

注意:点击debug按键时,程序先要保证编译并还是0errors。

内存溢出导致单片机启动死机问题 内存溢出是单片机应用中常见的问题之一,我们需要合理使用内存、优化程序、避免内存交叉等方式来避免内存溢出问题。单片机内存有限,当程序运行时,如果申请开辟的空间超过了内存大小,就会发生内存溢出的问题,导致单片机死机无法启动。2.增加单片机的存储器容量:如果单片机内存容量不足,可以考虑增加单片机的存储器容量,如增加数据存储器和程序存储器容量,或考虑使用外部存储器等。1.合理使用内存:在编写程序时,应注意合理使用内存,避免申请过多内存空间,及时释放不再使用的内存,以减少内存溢出的风险。 阅读详情

相关推荐

如何分析单片机的内核内存泄漏问题?

内核内存泄漏是指在程序运行期间,由于某些原因导致内核分配的内存无法释放而持续增加,最终占用系统全部内存,导致程序崩溃。动态内存分析可以通过记录申请和释放内存的操作,统计内存的使用情况,判断是否存在内存泄漏的情况。静态代码分析可以通过检查代码中的变量、指针等,分析是否存在内存泄漏的风险。总结一下,我们可以通过动态内存分析工具来检测和定位单片机的内核内存泄漏问题,及时修复内存泄漏问题,保证程序的稳定性和可靠性。从上述结果可以看出,程序在退出时仍有 10 字节的内存没有释放,这就是一个内存泄漏问题。

uote_e的博客 397

记录单片机使用malloc产生内存泄露的问题及解决方法

项目场景: 单片机使用malloc产生内存泄露的问题 问题描述: bug1:创建了一个结构体指针,通过malloc动态开辟内存的方式开辟了一段内存空间,然后进行写入数据修改数据的操作,但是下面的代码会导致内存泄露: typedef struct{ int name; int sex; }Data_struct; Data_struct* data_receive(void) { Data_struct* msg=(data*)malloc(sizeof(Data_struct)); //开辟内存

倩女不姓倩的博客 1114

单片机开发,malloc申请内存成功后,使用部分后,剩余部分于read读文件,读取的内容存在问题

寞水

寞水 581

『原创』讨论有关单片机内存的问题

                                          分析单片机内存如何使用                作者:小盒子      于:大连   2007.4.24【整理】 由于单片机的内存比较小,在以前的型号如AT89c51内存只有128byte,按照目前的电子市场飞速的发展,这么点点的内存只够做一个简单的电子系统,若是大一点的就远远不够用了,这样要么就要外扩一...

SmallBox00的博客 647

SystemVerilog实战:AXI Stream协议从零搭建(附完整代码解析)

本文详细介绍了如何使用SystemVerilog从零搭建AXI Stream协议,包括核心信号解析、接口设计、主从设备实现及验证环境构建。通过完整的代码示例和工程实践技巧,帮助开发者掌握AXI Stream在FPGA/ASIC设计中的高效数据传输方法,特别适合视频处理和网络数据传输等应用场景。

weixin_29207439的博客 360

CosyVoice 本地部署详细教程 手把手小白教程

本文提供了详细的CosyVoice本地部署教程,强调了避免中文名称和空格的重要性,并列出了必要的软件安装步骤,包括CUDA、cuDNN、Git和Miniconda。教程涵盖了从检查CUDA版本到下载模型和运行模型的全过程,确保用户能够顺利部署并使用CosyVoice。

huazn612的博客 2万+

调试单片机内存不足问题

年轻人还有很长的要走,加油!!!

u013610102的博客 563

基于互相关(NCC)模板匹配——find_ncc_model_defocused.hdev

相关性原理:仅在NCC(r,c) = ±1时,模板与图像完全匹配; NCC绝对值越大,表示模板与正在检测部分图像越接近; NCC绝对值越接近于零,表示模板与图像越不一致。 线性光照变化不会影响NCC计算结果。 重要函数一: 创建模板:create_ncc_model( Template : : NumLevels, AngleStart, AngleExtent, AngleStep, Metric : ModelID) 参数列表: Template(in):单通道灰度图像,它的区域可被创建为模板。 Num

m0_51271525的博客 3413

idata 单片机 新唐_请教新唐单片机N76E003内存空间不足的问题

今天编译程序发现一个奇怪的问题,怎么使用中内存单元只有不到130个字节?具体如下:程序定义如下:#define RECEIVE_BUFFER_SIZE 13UINT8Uart_Receive_Buffer[RECEIVE_BUFFER_SIZE];编译OK的如下:Program Size: data=129.0 xdata=0 code=1776creating hex file...

weixin_29107819的博客 581

深度强化学习研究笔记(1)——入门(马尔科夫决策过程,贝尔曼方程,价值迭代和策略迭代)

1. 强化学习(Reinforcement learning)概述 强化学习(Reinforcement learning)的基本内涵是将问题用代理和环境进行建模。其中代理能够对环境执行一些特定的动作a∈Aa \in Aa∈A,从而到达某个状态s∈Ss \in Ss∈S,然后我们就可以根据该状态为代理赋予特定的奖励rrr。强化学习的基本思想如下图所示: 代理的目标是最大化未来的奖励总和,它通过将...

越野者的博客 5280

XCP_Basic 移植步骤

XCP_Basic 移植步骤

ggzzc的博客 2316

【问题】使用STM32CubeMX开发FreeRTOS只能添加3个任务——单片机操作系统的堆栈内存问题

2. 堆栈溢出导致程序崩溃 2.1 遇见问题 在进行消息队列的实验中,由于之前测试按键扫描任务和跑马灯任务没有删除,直接在之前的prj上添加了向队列发送消息任务和从队列接收消息任务,在程序写完后,编译链接下载没有报错,但是在我使用新创建的队列发送和接收消息任务的时候程序只执行一次就卡死,找了很久没找到原因。 在进行将新添加的任务删除的尝试后,发现程序又可以正常进行多任务切换。只要加上新的任务就跑不通。为了避免程序崩溃是由于消息队列引起的嫌疑,我将消息队列任务移植到前面的3个任务中,并把多余的任务删除。实验现

Ethan-Code's blog 5487

3D Slicer的学习(二) 图像的分割

先对不同层级标注,然后点击Fill between slices -> Initialize -> Apply拖动层级颜色区域就会变成连续自适应的动态变化区域。如图,点击Level tracing,在图像上放置鼠标,会显示可能想要选中区域的轮廓,点击鼠标右键会将其显示为蓝色。然后点击Grow from seeds -> Initialize -> Apply,显示3D之后会自动扩展到其他位置的相同部位,从而展示整个部位。如图为copy之后,将黄色区域的颜色复制到原本的绿色区域。

tuweibazong的博客 6080

51单片机内存问题

关于51单片机内存问题,一直是个疑惑大家的问题,因为51单片机是个很另类的单片机。下面我给楼主讲解一下:51单片机之所以另类,是因为,他寻址内存的空间,不是靠总线,是用指令的方式。51单片机有以下几个内存模块组成:1】ROM或者Flash,叫程序存储区,你写的程序是存在这里面的,上电后从这里面执行。程序存储区也分为片内和片外,一般来说,现在的51很多已经做到了64K,所以很少有外扩片外Flash或...

weixin_30852367的博客 364

10种电阻综合对比——《器件手册--电阻》

可变电阻在电子设备中也有很多用途,如在收音机的音量调节电路中,通过旋转可变电阻的旋钮来改变电路中的电阻值,从而改变通过扬声器的电流,实现音量的调节。根据电阻定律,电阻R = ρ(L/S),其中ρ是导体材料的电阻率,L是导体的长度,S是导体的横截面积。比如,同样材料制成的两根电线,粗的电线电阻比细的电线电阻小,长的电线电阻比短的电线电阻大。电流采样电阻的工作原理基于欧姆定律,即电阻两端的电压与通过电阻的电流成正比,公式为 I = V/R,其中 I是电流,V是电阻两端的电压,R 是电阻值。

XU157303764的博客 3143

若依开源系统多数据源整合clickhouse数据库详细步骤

若依开源系统多数据源整合clickhouse数据库详细步骤

java之书-资源 897

案例分析-FATfs文件系统移植单片机内存不够问题分析和解决

可以看出是下面几个文件占用内存较大,做针对性处理(ZI Data 意思是有定义,但是没有初始化的变量,根据工程分析,可能是分配的空间太多了,需要调整)在通过cubeMX自带的FATfs 文件系统在STM32F103C8T6上进行移植,正式调用后,发现系统报错,出现内存空间不足问题。说明刚开始分析空间不够是对的,是flash不够还是RAM不够,我们看输出文件倒数第四行,算一算到底用了多少Flash,多少RAM呢,这个系列的单片机只有20k,显然超过芯片的20k范围,说明是RAM超了。

冰林科技 2094

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

单片机内存管理实战:手写malloc解决资源受限问题

本文详细介绍了在资源受限的单片机环境中手动实现malloc的方法,解决标准库内存管理的内存碎片和Flash占用问题。通过内存池预分配机制和高效链表管理,提供了完整的代码实现和性能优化技巧,显著提升内存分配效率和系统稳定性。适用于物联网终端设备等长期运行的单片机系统。

weixin_29184075的博客 565

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

单片机程序擦边64kb的内存内存优化问题

有两种开机启动页面模式,一种是文字开机logo,一种是图片的的开机logo,因为我做的是多国语言,所以内存都快用没有了,我的芯片是py32f030x8,64kb的flash,8kb的ram,然后我现在出现的问题是,领导叫我加几个内容,就是WiFi蓝牙那些字模,后文会看到,就是不加就没啥事,加了就有问题了,不是这有问题就是那又问题,以前√在×的后面,现在√变×前面去了,那就是√没有边边角角的毛刺了,反倒是×有了,以前×没有的,结合我的看法,师傅的看法,还有ai的看法,就是内存的原因,那现在只有在优化了。

weixin_47347638的博客 982

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

单片机卡死问题全解析:从死锁、中断到内存越界的排查与解决

在嵌入式系统开发中,系统卡死是常见的棘手问题,其本质是程序执行流因资源冲突、逻辑缺陷或硬件异常而停滞。从技术原理看,这通常涉及多任务间的资源竞争(如信号量、队列)导致死锁,或中断服务程序(ISR)执行不当、内存越界破坏了程序正常流程。其技术价值在于保障系统的实时性与可靠性,尤其在电机控制、通信模块等对稳定性要求高的场景中至关重要。本文聚焦单片机卡死这一典型故障,结合死锁、中断陷阱等热词,深入剖析其成因,并提供从调试器分析到超时机制设计的实战解决方案,帮助开发者构建更健壮的嵌入式系统。

weixin_29170327的博客 302

C语言中的内存问题(51单片机应用中出现的问题)

这几天跟同学一起做模电大作业,有一次用到久违的单片机,使用C语言编写单片机控制程序,有一块用到数模转换物体重量并显示到lcd1602上,其中出现了一个小问题,代码如下 void ValueToString(unsigned char *str, unsigned char val){ unsigned long int sum; sum = (val*500) / 255;

Burt3的博客 629

关于单片机的内存使用问题(norFlash、SRAM、nandFlash)

对单片机编程后,程序的代码段,data段,bss段,rodata段等都存放在Flash中。当单片机上电后,初始化汇编代码将data段,bss段,复制到RAM中,并建立好堆栈,开始调用程序的main函数。以后,便有了程序存储器,和数据存储器之分,运行时从Flash(即指令存储器,代码存储器)中读取指令 ,从RAM中读取与写入数据。RAM存在的意义就在于速度更快。ARM采用哈弗结构,SRAM取数据,FLASH取指令,两者同时进行,效率高。 ********详细请看这里 冯.诺依曼体系与哈佛体系的区别: 二者的区

aiyueyueaoe的博客 2402

嵌入式CPU、单片机数组、结构体内存溢出问题

嵌入式、单片机等硬件软件开发中,经常会用到结构体或者数组,但是在调试中我们经常会发现数组或者结构体变量的内容莫名其妙的被修改了,首先我们确认的是肯定不是代码中我们本意的修改。 解决方法: 出现这种问题基本上就是数组或者指针出现溢出导致的,这里的数组或者指针是指代码中所用得到的所有的数组或者指针,这个时候仔细查看哪里使用数组或者指针了,然后确认下哪里出现空指针或者数组索引指到了超过数组定义的范围了...

Mr-Zhang博客 1492

51单片机时序问题

51单片机时序问题 改变内存配置会影响指令集的调用,故而影响时许

qq_36639978的博客 348

79.单片机内存分区全解析:看懂变量存在哪,解决栈溢出、掉电丢失问题

本文详细介绍了单片机程序内存的五大分区及其应用要点:代码段(.text)存储程序指令;常量区(.rodata)存放只读常量;全局数据区(.data/.bss)存放全局变量;栈区(.stack)自动管理局部变量;堆区(.heap)支持动态内存分配。重点强调了实际开发中的注意事项:避免栈溢出需控制局部变量大小、const修饰固定参数可节省RAM、动态内存必须及时释放。通过合理利用不同内存分区的特性,可有效提升程序稳定性,防止内存泄漏和栈溢出等常见问题,是开发高效可靠嵌入式系统的基础。

u011697185的专栏 288

标准库memcpy()内存对齐异常引发单片机hard fault问题汇总

我们之前使用的是ARM提供的轻量级 C 库(MicroLIB),但是后面引入了一些东西改用C标准库,发现memcpy会经常引起硬件故障hard fault ,然后发现是便准库memcpy内存对齐异常引起的;确实是对齐问题,默认定义变量地址都是对其的,但是使用的时候一般都会加偏移,偏移后没有对齐,标准库的这个函数也会引起硬件故障;1.起因:相同内容使用标准库的memcpy会引起硬件故障,使用自定义内存拷贝正常运行(无内存越界和堆栈溢出)有点像标准库函数有什么性能优化不太适配ARM;发现一个奇怪的现象;

weixin_53592457的博客 893
上一篇: ROS常用工具B-TF工具
下一篇: HAL库与标准库
橙橙笔记
博客等级 码龄4年 13粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值