stm32 RAM分配及占有

发布者:JoyfulSunflower最新更新时间:2017-02-05 来源: eefocus关键字:stm32  RAM  分配及占有 手机看文章 扫描二维码
随时随地手机看文章

一个小的项目,在测试时间和产品量稍微大一些之后,出现了一些莫名其妙的非逻辑错误的Bug(最头疼的是不能每次都能复制出来)。经过修改后,最近一个月的测试都没有出现。本人在这里得到了原子哥和其他朋友的很多帮助,也把自己的一些经验分享给各位,也欢迎大家指正。

1. 程序偶尔会出现一些Bug,经过output串口信息发现一些堆栈的临时变量被莫名其妙的修改。
stm32103rbt6的内存是20K,算比较小了,看到程序出错的那个函数申请了很多零时变量,也需要访问很多全局变量。猜想是内存被其他操作更改所致。
解决ram被使用过多的一个方法是尽量少用全局变量,能用const就用一定用const变量,因为这样会放在flash,而不是ram.
我的程序未将全局变量修改成const变量之前,编译出来
Program Size: Code=40998 RO-data=8702 RW-data=3724 ZI-data=3260 
尽量将全局变量修改成const变量之后,编译出来
Program Size: Code=35778 RO-data=13470 RW-data=108 ZI-data=2060     
大大减少了RW-data,这个问题就再也没出现了。

相关资料:
Code为程序代码部分
RO-data 表示 程序定义的常量 const temp;
RW-data 表示 已初始化的全局变量
ZI-data 表示 未初始化的全局变量
Total RO  Size (Code + RO Data)
Total RW  Size (RW Data + ZI Data) 
Total ROM Size (Code + RO Data + RW Data)
初始化时RW-data从flash拷贝到RAM

2. 程序莫名其妙死机,
猜想因为申请了很多零时变量,可能需要调整Stack_Size
在STM32F10x.s文件中
修改Stack_Size      EQU     0x00000200
成Stack_Size      EQU     0x00000400
就再没出现死机的情况。

关键字:stm32  RAM  分配及占有 引用地址:stm32 RAM分配及占有

上一篇:对STM32的NVIC_PriorityGroupConfig使用及优先级分组方式理解
下一篇:STM32F103的11个定时器详解

推荐阅读最新更新时间:2024-03-16 15:32

stm32 u8g2移植笔记
前言 当初想写一个单色屏菜单时,曾移植过u8g2到STM32平台(这里用的是keil MDK),不过当时一直有一个问题没有搞懂:为什么u8g2用在flash为32k,ram为2k的arduino uno上都不会报空间不足,却在flash为512k,ram64k的stm32zet6上报错空间不足?这是由编译器导致的,arduino使用的是avr-gcc编译器在编译的时候会加-ffunction-sections -fdata-sections,链接的时候会加-Wl,-gc-sections选项,因而可以只链接用到的函数。stm32编译选项中有个类似的选项One ELF Section per Function,勾选该项可以极大的减少
[单片机]
STM32 在 KEIL 下使用 SWV 输出调试信息
—— 使用STM32,个人认为 keil 还是首选 SWV 需要占用一个引脚 PB3/JTDO/TRACES WO 与 JTDO 复用,使用 SW 时,这一脚将被占用,作为 TRACES WO,一般常见仿真器直接支持 首先重写 fputc #include stdio.h int fputc(int c, FILE *f) { ITM_SendChar(c); return(c); } 就可以使用 printf 输出调试信息,但实际上我这么做失败了,初始化的时候不知道卡在了哪里,也不弄了,反正 ITM_SendChar 一样可以输出。 打开工程选项: - project - options for target - Debug 标
[单片机]
stm32学习笔记(三)串口通讯实验
#include sys.h #include usart.h ////////////////////////////////////////////////////////////////////////////////// //如果使用ucos,则包括下面的头文件即可. #if SYSTEM_SUPPORT_OS #include includes.h //ucos 使用 #endif ////////////////////////////////////////////////////////////////////////////////// //本程序只供学习使用,未经作者许可,不得用于其它
[单片机]
<font color='red'>stm32</font>学习笔记(三)串口通讯实验
Microchip加倍LCD PIC18单片机闪存RAM容量以降低成本
PIC18F85J90系列单片机可提供集成的LCD模块、32 KB闪存及内部电压控制器,瞄准成本敏感的嵌入式显示应用 全球领先的单片机和模拟半导体供应商——Microchip Technology Inc.(美国微芯科技公司)推出6款集成了液晶显示器(LCD)模块的8位PIC单片机系列新产品。PIC18F85J90系列的闪存及RAM存储器容量比现有的64及80引脚系列器件增加了1倍,适用于需要嵌入式控制的高成本效益的人机接口应用,包括恒温器、民用表具及医疗仪器。存储容量的增加有助于用户增加更多诸如语音回放的复杂功能,拥有更多的自编程存储器分配,同时利用3V PIC18 J系列的制造工艺技术节省了成本。 具有片上LCD模块的PI
[新品]
IAR STM32 函数和变量的绝对地址定位
昨天我突然冒出个想法,能否利用函数和变量的绝对定位,实现程序的模块化更新。 也就是说,如果我要改变某个函数,只需要更新flash里面一个局部,也许只需要更新几百个字节,而无须重新下载整个上百K的程序。 经过查找资料和反复实验,终于实现了,现总结如下: 1) 把函数定位在FLASH高端的指定位置,以后更新,只更新那小块地方就可以了。 方法一: IAR里面进行函数定位, 必须要在.icf里面,进行定义。 void sendstr(unsigned *buf,unsigned short len) @ .sendstr { .... } .icf文件,加入这样一句: place at add
[单片机]
STM32的FSMC地址块划分
注意:每个区都有独立的寄存器控制,都有单独的片选引脚,故每个区都可以接不同的外设。
[单片机]
<font color='red'>STM32</font>的FSMC地址块划分
STM32对码盘的正交信号处理
STM32的每个TIMER都有正交编码器输入接口,TI1,TI2经过输入滤波,边沿检测产生TI1FP1,TI2FP2接到编码器模块,通过配置编码器的工作模式,即可以对编码器进行正向/反向计数。 如下图,编码器使用了A,B两相信号,但是我只需要对TI1信号进行计数(第一行),我也是刚发现了这个错误,原来对两个信号都计数,导致码盘转一周得到不止100个脉冲(100线的光电码盘)。通过STM32的编码器模块比较两想的电平信号就可以很容易地计算出编码器的运行情况了。 下面是调试OK的代码: void Encoder_Configration(void) { GPIO_InitTypeDef GPIO_InitStruct
[单片机]
<font color='red'>STM32</font>对码盘的正交信号处理
STM32(一) 汇编操作GPIO
平台:keil4.72 开发板:stm32F103 72M 测试代码: 汇编: __asm void asm_LED1_TOGGLE(void) { ;GPIOA_ODR EQU 0x4001080C| LDR R0, = 0x4001080C LDR R1, ;R1 = *R0 EOR R1,#0x0100 ;r1 = r1^0x0100 STR R1, ;*R0 = R1 BX LR ; } 对应的C void c_LED1_TOGGLE(void) { GPIOA- ODR ^= GPIO_Pin_8; } 测试用主函数 int main(v
[单片机]
<font color='red'>STM32</font>(一) 汇编操作GPIO
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved