鱼鳞病

注册

 

发新话题 回复该主题

浅谈嵌入式MCU软件开发之内存分配详解 [复制链接]

1#
小孩白癜风怎么治疗好 http://www.baidianfeng51.cn/m/

内容提要

引言1.基于C语言的嵌入式MCU应用工程编译结果的代码和数据段(segment)概述1.1.text/.code段1.2.bss段1.3.data段1.4堆(.heap)1.5栈(.stack)2..text、.bss、.data、.heap和.stack段在嵌入式MCU内存中的空间分布3.链接器对全局符号的处理--强符号(StrongSymbols)与弱符号(WeakSymbols)3.1什么是强符号(StrongSymbols)和弱符号(WeakSymbols)3.2链接器对全局符号的处理规则和注意事项4.什么是.COMMON段及其与.bss段的关系4.1什么是.
  .text/.code代码段(textsegment/codesegment)是用于存储程序执行代码的一块内存区域。


  这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读(某些架构也允许代码段为可写,即允许修改程序,将SRAM属性定义为只读存储器(readonly),也可以用作.text段的存储器)。

Tips:代码段中,除了用户程序代码(.code/.text)外,还包含以下只读的常数数据:

.const/.rodata段:存放const定义的只读数据.string段:存放字符串常量;.copy/.init段:存放有初始化值全局变量(.data段)的初始化值;1.2.bss段


  .bss符号起始块段(bsssegment)是用于存储程序中初始化值为0或未初始化的全局变量的一块内存区域。


  bss是英文BlockStartedbySymbol的简称。


  bss段属于静态内存分配。

1.3.data段
  .data数据段(datasegment)是用于存放程序中已初始化的全局变量的一块内存区域。


  数据段属于静态内存分配。其初始化值存储在Flash中,掉电不丢失,但运行时(runtime)地址在SRAM中。所以.data段占用相同大小的Flash和SRAM存储器地址空间。

.data段在每次MCU复位启动(startup)过程中,由启动代码完成初始化,从而保证,在进入main()函数后,第一次使用.data段中的全局变量时,初始化值是编程时设置的。1.4堆(.heap) 堆(.heap堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。


  当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);


  当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)。

1.5栈(.stack)栈(.stack)又称堆栈,由C语言运行时自动分配和管理(通过嵌入式MCUCPU内核专用堆栈指针寄存器SP--StackPointor实现),是C语言运行访问最为频繁的内存空间。


  在函数中定义的局部变量(但不包括static声明的变量,static意味着在数据段中存放变量)通常会被分配带栈中。


  

除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中返回给调用函数。


  栈的压栈(push)和出栈(pop)具有后进先出(LIFO--LastInFirstOut)的特点,其保证了C语言程序函数调用和中断处理时的现场保护/恢复,从而使得嵌入式MCU中的应用程序可以正常工作。


  从这个意义上讲,可将堆栈看成一个数据临时寄存和交换的内存区。

Tips:关于嵌入式MCU软件开发中C语言堆栈的使用,请参考如下

分享 转发
TOP
发新话题 回复该主题