• Keil 中的Code, RO-data , RW-data, ZI-data


    Code为程序代码部分
    RO-data 表示 程序定义的常量const temp;
    RW-data 表示 已初始化的全局变量
    ZI-data 表示 未初始化的全局变量

    Code, RO-data,RW-data ............flash
    RW-data, ZIdata...................RAM

    初始化时RW-data从flash拷贝到RAM

    生成的map文件位于list文件夹下 (KEIL)

    Total RO  Size (Code + RO Data)            

    Total RW  Size (RW Data + ZI Data)             

    Total ROM Size (Code + RO Data + RW Data)  

    堆栈的认知

    1.     STM32中的堆栈。

      单片机是一种集成电路芯片,集成CPU、RAM、ROM、多种I/O口和中断系统、定时器/计数器等功能。CPU中包括了各种总线电路,计算电路,逻辑电路,还有各种寄存器。Stm32有通用寄存器R0‐R15 以及一些特殊功能寄存器,其中包括了堆栈指针寄存器。当stm32正常运行程序的时候,来了一个中断,CPU就需要将寄存器中的值压栈到RAM里,然后将数据所在的地址存放在堆栈寄存器中。等中断处理完成退出时,再将数据出栈到之前的寄存器中,这个在C语言里是自动完成的。

    2.     编程中的堆栈。

    在编程中很多时候会提到堆栈这个东西,准确的说这个就是RAM中的一个区域。我们先来了解几个说明:

    (1) 程序中的所有内容最终只会出现在flash,ram里(不外扩)。

    (2) 段的划分,是将类似数据种类存储在一个区域里,方便管理,但正如上面所说,不管什么段的数据,都是最终在flash和ram里面。

    C语言上分为栈、堆、bss、data、code段。具体每个段具体是存储什么数据的,直接百度吧。重点分析一下STM32以及在MDK里面段的划分。

    MDK下Code,RO-data,RW-data,ZI-data这几个段:

    Code是存储程序代码的。

    ​RO-data是存储const常量和指令。

    ​RW-data是存储初始化值不为0的全局变量。

    ​ZI-data是存储未初始化的全局变量或初始化值为0的全局变量。

    Flash=Code + RO Data + RW Data;

    RAM= RW-data+ZI-data;

    这个是MDK编译之后能够得到的每个段的大小,也就能得到占用相应的FLASH和RAM的大小,但是还有两个数据段也会占用RAM,但是是在程序运行的时候,才会占用,那就是堆和栈。在stm32的启动文件.s文件里面,就有堆栈的设置,其实这个堆栈的内存占用就是在上面RAM分配给RW-data+ZI-data之后的地址开始分配的。

    堆:是编译器调用动态内存分配的内存区域。

    栈:是程序运行的时候局部变量的地方,所以局部变量用数组太大了都有可能造成栈溢出。

    堆栈的大小在编译器编译之后是不知道的,只有运行的时候才知道。

    3.     OS中的堆栈及其内存管理。

    嵌入式系统的堆栈,不管是用什么方法来得到内存,感觉他的方式都和编程中的堆差不多。目前我知道两种获得内存情况:

    (1)用庞大的全局变量数组来圈住一块内存,然后将这个内存拿来进行内存管理和分配。这种情况下,堆栈占用的内存就是上面说的:如果没有初始化数组,或者数组的初始化值为0,堆栈就是占用的RAM的ZI-data部分;如果数组初始化值不为0,堆栈就占用的RAM的RW-data部分。这种方式的好处是容易从逻辑上知道数据的来由和去向。

    (2)​就是把编译器没有用掉的RAM部分拿来做内存分配,也就是除掉RW-data+ZI-data+编译器堆+编译器栈后剩下的RAM内存中的一部分或者全部进行内存管理和分配。这样的情况下就只需要知道内存剩下部分的首地址和内存的尾地址,然后要用多少内存,就用首地址开始挖,做一个链表,把内存获取和释放相关信息链接起来,就能及时的对内存进行管理了。内存管理的算法多种多样,不详说,这样的情况下:OS的内存分配和自身局部变量或者全局变量不冲突,之前我就在这上面纠结了很久,以为函数里面的变量也是从系统的动态内存中得来的。这种方式感觉更加能够明白自己地址的开始和结束。

  • 相关阅读:
    团队作业(9)
    团队作业(8)
    团队作业(7)
    团队作业(6)
    团队作业(5)
    团队作业(4)
    团队作业(3)
    05数据爬去
    02周总结
    04结对开发
  • 原文地址:https://www.cnblogs.com/poonpan/p/7231201.html
Copyright © 2020-2023  润新知