目录
提示:以下是本篇文章正文内容,下面案例可供参考
学习途径
C语言中变量定义方式
存储类型 + 特征修饰 + 数据类型 + 变量名
eg. static volatile int a;
-
- 存储类型 -> 决定变量的存储位置
- 特征修饰 -> 决定变量的特征属性
- 数据类型 -> 决定变量的存储空间及数据范围
- 变量名字 -> 决定变量的引用标识
Linux操作系统的进程结构/内存空间管理
将一个可执行文件加载到内存去运行将变成一个或多个进程;一个进程就是一个运行中的程序段;操作系统会为内个进程提供一个独立的4G(32bit操作系统虚拟内存空间大小:2的32次方 = 4G)的虚拟内存空间,其中1G的内核空间和3G的用户口空间。
C语言变量存储类型
总结
C语言中的存储类型通过auto,static,extern,register关键字修饰其变量能决定其变量在内存中的空间分配。
附加图:SRAM中变量空间分布
1.堆和栈大小
定义大小在startup_stm32f2xx.s
Stack_Size EQU 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp; Heap Configuration
; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
;Heap_Size EQU 0x00000200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base2.堆和栈位置
通过MAP文件可知
HEAP 0x200106f8 Section 512 startup_stm32f2xx.o(HEAP)
STACK 0x200108f8 Section 1024 startup_stm32f2xx.o(STACK)__heap_base 0x200106f8 Data 0 startup_stm32f2xx.o(HEAP)
__heap_limit 0x200108f8 Data 0 startup_stm32f2xx.o(HEAP)
__initial_sp 0x20010cf8 Data 0 startup_stm32f2xx.o(STACK)显然 Cortex-m3资料可知:__initial_sp是堆栈指针,它就是FLASH的0x8000000地址前面4个字节(它根据堆栈大小,由编译器自动生成)
3.堆和栈空间分配
栈:向低地址扩展
堆:向高地址扩展
显然如果依次定义变量
先定义的栈变量的内存地址比后定义的栈变量的内存地址要大
先定义的堆变量的内存地址比后定义的堆变量的内存地址要小
4.堆和栈变量
栈:临时变量,退出该作用域就会自动释放
堆:malloc变量,通过free函数释放
另外:堆栈溢出,编译不会提示,需要注意
------------------------------------------------------------------------------------------------------
如果使用了HEAP,则必须设置HEAP大小。
如果是STACK,可以设置为0,不影响程序运行。
IAR STM8定义STACK,是预先在RAM尾端分配一个字节的区域作为堆栈预留区域。
当程序静态变量,全局变量,或者堆与预留堆栈区域有冲突,编译器连接的时候就会报错。
你可以吧STACK设置为0,并不影响运行。(会影响调试,调试会报堆栈溢出警告)。
其实没必要这么做。
一般程序,(在允许范围内)设置多少STACK,并不影响程序真实使用的RAM大小,
(可以试验,把STACK设置多少,编译出来的HEX文件都是一样),
程序还是按照它原本的状态使用RAM,把STACK设置为0,并不是真实地减少RAM使用。
仅仅是欺骗一下编译器,让程序表面上看起来少用了RAM。
而设置一定size的STACK,也并不是真的就多使用了RAM,只是让编译器帮你
检查一下,是否能够保证有size大小的RAM没有被占用,可以用来作为堆栈。
以上仅针对IAR STM8.