1.内存图注释
STM32内存被总分为flash(ROM)和sram(RAM),然后分别又包含这几个部分。
1、code代码存储区:存放函数体的二进制代码。
2、Ro-data:常量字符串就是放在这里的。这些数据是只读的,分配在RO-data(只读数据存储区),则被包含在flash中,程序结束后由系统自动释放
3、堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS释放。
4、栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。
5、static:初始化的全局变量和静态变量放在一块区域.
6、Zi-data:未初始化的全局变量和和未初始化的静态变量在相邻的的另一块区域。程序结束后由系统自动释放。
7、栈向下生长,内存地址由高至低;堆向上,内存地址由低至高
2.计算代码量大小
大家先看下STM32编译后的这张图,然后对照着上图分析下。
这个程序的大小:
Flash(ROM)=Code+Ro-data
Sram(RAM)=Rw-data+ZI-data
我们的程序断电后不运行,重新上电后继续运行,为什么会这样呢??因为flash(ROM)里面的数据掉电可保存。
3.静态存储与动态存储的区别
3.1 静态存储
1.静态内存是指在程序开始运行时由编译器分配的内存,它的分配是在程序开始编译时完成的,不占用CPU资源。
2.程序中的各种变量,在编译时系统已经为其分配了所需的内存空间,当该变量在作用域内使用完毕时,系统会
3.自动释放所占用的内存空间。
4.变量的分配与释放,都无须程序员自行考虑。
5.基本类型,数组
3.2 动态存储
1.用户无法确定空间大小,或者空间太大,栈上无法分配时,会采用动态内存分配
2.函数形式参数
3.函数中定义的没有用关键字static声明的变量
4.函数调用时的现场保护和返回地址等存放在动态存储区,函数调用开始时分配,函数结束时释放。在程序执行过程中,这种分配和释放是动态的
3.3 区别
1.静态内存分配在编译时完成,不占用CPU资源; 动态内存分配在运行时,分配与释放都占用CPU资源。
2. 静态内存在栈(stack)上分配; 动态内存在堆(heap)上分配。
3. 动态内存分配需要指针和引用类型支持,静态不需要。
4. 静态内存分配是按计划分配,由编译器负责; 动态内存分配是按需分配,由程序员负责。
4. 举例
int a = 0; // RW-data 全局初始化区
char *p1; // ZI-data 全局未初始化区 bss
const int b = 0; // RO-data 只读变量区
volatile const int b = 0; // RW-data 全局初始化区
main(void)
{
int b; // RW-data 栈区
char s[] = "abc"; // RW-data 栈区
char *p2; // RW-data 栈区
char *p3 = "123456"; // "123456 " 在Ro-data 常量区,p3在RW-data 栈区
static int c =0; // 全局(静态)初始化区 RW-data static区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20); // 分配得来的10和20字节的区域就在Rw-data 堆区
strcpy(p1, "123456"); // "123456 " 放在常量区,编译器可能会将它
// 与p3所指向的"123456"优化成一个地方
}
5. 程序莫名死机问题
猜想因为申请了很多临时变量,可能需要调整Stack_Size的大小 在STM32F10x.s文件中
修改Stack_Size EQU 0x00000200
成Stack_Size EQU 0x00000800
情况会好很多。
上一篇:不得不说的USART中的重定向问题
下一篇:我也是醉了,KEIL5程序下载后不自动运行?
推荐阅读最新更新时间:2024-11-09 11:50
推荐帖子
- 工作机会来啦
- hi我是一家国内知名软件外包公司的HR。现有一外派在日本工作的职位,要求:4年左右嵌入式C\\C++开发经验,日语流利。如对这个职位有意向,可与我祥谈。MSN:jill_xu@MSN.com谢谢!工作机会来啦没遇到过这种情况.
- vanlin1012 嵌入式系统
- 晒WEBENCH设计的过程+设计TMS320F2812的供电电源
- TMS320F2812供电系统由有一个3.3V@1A的外设模块电源和1.8V@0.5A的内核电源构成。因此属于多负载电源。第一步:打开TI官网就能看到WEBENCH,在TI的WEBENCH里,点PowerArchitect,即进入多负载电源设计第二步:添加负载电源。如下图所示,LOAD_1和LOAD_2为2路负载电源。修改电源电压输入范围及2路负载输出电压、电流。在本设计中考虑输入选用DC8V~DC16V之间,LOAD_1输出3.3V@1A,LOAD_2输出1.8V@0.5A
- ltbytyn 模拟与混合信号
- stm32ADC转换输出波动大的问题
- 我是用stm32f103c8t6最小系统板发现的,在ADC转换时不插传感器读取数值正常,但是插上传感器数据就有巨大的波动,请问这个问题该怎么解决?希望大佬解答一下,感谢!!stm32ADC转换输出波动大的问题先检查传感器的输出变化情况,如果传感器输出本身就变化很大,ADC输出变化大才是应该的。检查传感器输出另外STM32的ADC还需要加放大器缓冲开启ADC校准没? 开启了 我插的是水位传感器,如果不在水里显示应该是0,但是就算滤波之后也还是1000多,换了像
- 新手滴滴滴 stm32/stm8
- 如何使用Verilog HDL语言实现在8*8LED点阵显示器上显示一个“北”字
- 如何使用VerilogHDL语言实现在8*8LED点阵显示器上显示一个“北”字~~~实在急需~~若有相似程序,可否借鉴一下~~多谢了~~~如何使用VerilogHDL语言实现在8*8LED点阵显示器上显示一个“北”字
- bpt888 嵌入式系统
- 温度对变压器的影响
- 变压器的指标主要有温升,调整率,功率,输入电压范围,空载电流,抗电强度六项。各项指标之间相互关联又相互制约。为了描述它们之间的关系,可以把每一项指标作为一个轴,越向外该指标越好,越靠近原点越差。这样就可以围成一个六边形。当变压器的体积,磁通密度,电流密度确定后,六边形的面积也就是确定的。通常设计时都采取了折中的方案,图形接近于正六边形。当拔高某项指标时,就会出现右图的情况,功率增大了,但是要牺牲其他的指标作为代价。并且六边形越偏离原点,制作成本越高,性价比越低。温度是决定变压器寿命的
- bjyhdc 工控电子
- cpld与fpga的区别
- 系统的比较,与大家共享:尽管FPGA和CPLD都是可编程ASIC器件,有很多共同特点,但由于CPLD和FPGA结构上的差异,具有各自的特点:①CPLD更适合完成各种算法和组合逻辑,FPGA更适合于完成时序逻辑。换句话说,FPGA更适合于触发器丰富的结构,而CPLD更适合于触发器有限而乘积项丰富的结构。②CPLD的连续式布线结构决定了它的时序延迟是均匀的和可预测的,而FPGA的分段式布线结构决定了其延迟的不可预测性。③在编程上FPGA比CPLD具有更大的灵活性。CPLD通过修改具有固定内连
- glorey FPGA/CPLD