MCU运行时内存分区

参考阅读:
   MCU存储区分
   Keil 编译内存信息:Program size

通过上面的阅读,我们知道下载到MCU上的程序代码已开始堵在Flash(Rom)上,上电运行后,变量会被搬运到SRAM(RAM)上,然后由CPU运行(const 修饰的变量除外)。

1. 内存分配

内存分配(这里说的是 RAM 上)的方式有四种,对应的也就有四个区域:

  1. 常量区分配 。内存在程序编译的时候就已经分配好,在程序结束释放。
  2. 静态(Static)区分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在,程序结束释放。 如全局变量、static变量。
  3. 栈(HEAP)上创建。在执行函数时,函数内局部变量就在栈上创建,函数执行结束时这些存储单元伴随着栈帧的弹出自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
  4. 堆(STACK)上分配,亦称动态内存分配。程序在运行的时候用malloc/calloc申请的内存,需要手动使用free释放内存,否则容易造成内存泄漏,优点是申请内存灵活。

全局变量和static修饰的变量都会被保存到 静态数据区 。静态数据区又分 RW-dataZI-data 两块。其中有被初始化的变量放在RW-data中(如 static int a = 10;),未被初始化的变量放在ZI-data中(如 static int a;)。

1.1 样例

#include <stdio.h>
#include <stdlib.h>

char buff[50]; // 静态区 -> ZI-data
int count = 1; // 静态区 -> RW-data 

int main()
{
    int a = 10; // 栈区
    int b;  // 栈区
    static int c = 1; // 静态区 -> RW-data 
    char *p1 = "abcd"; // abcd\0 存放在常量区,p1在栈上
    char *p2 = "abcd"; 
    int *p3; // p3在栈上

    printf("p1 指向地址=%p\n", p1);
    printf("p1 自身地址=%p\n", &p1);

    printf("p2 指向地址=%p\n", p2);
    printf("p2 自身地址=%p\n", &p2);

    p3 = (int *)malloc(2 * sizeof(int)); // p3指向的int数组地址,在堆区
    printf("p3 指向地址=%p\n", p3);
    printf("p3 自身地址=%p\n", &p3);
    free(p3);

    return 0;
}

输出===
p1 指向地址=0x10552af36
p1 自身地址=0x7ffeea6d8508
p2 指向地址=0x10552af36
p2 自身地址=0x7ffeea6d8500
p3 指向地址=0x7fefa3405940
p3 自身地址=0x7ffeea6d84f8

因为是在64位系统运行,p1、p2、p3自身地址是连续的,并且相差8个字节。
p1、p2指向的"abcd"是同一个地址,说明"abcd"在常量区。

2. 实例

2.1 51单片机

以8位的8051单片机(STC12C5A60S2)数据存储器(SRAM)为例。

2.1.1 内部RAM

内部RAM共256字节,分为三部分:

  • 低128字节(与传统8051兼容)。可直接寻址,可间接寻址。
  • 高128字节(与8052兼容)。只能间接寻址。
  • 特殊功能寄存器(SFRs)。与高128共用地址映射,物理上独立,通过不同汇编指令区分。
内部RAM结构.png

低128字节可分为三个区:

  • 工作寄存器组区:00H~1FH,共32字节,分4个寄存器组,每组编号R0~R7。程序状态PSW寄存器中的RS1、RS0决定当前使用那个寄存器组。
  • 可位寻址区:20H~2FH,共16个字节,128个位,这些位对应的地址是00H~7FH,低128字节RAM寻址和这128个位寻址是使用不同指令区分。
  • 用户RAM区/堆栈区:30H~7FH,共80个字节,用户RAM区和堆栈区共用同一段地址,堆栈指针SP用于指向堆栈区的栈顶(建议初始化后,设置SP从80H开始)。

2.1.2 内部扩展RAM

内部扩展RAM共1024字节(0000H~03FFH),C语言中使用xdata声明存储类型。如 unsigned char xdata i = 0;

外部RAM结构.png

data: 指定数据存储在内部低128字节数据存储器区(00H~7FH),在定义变量时不指定存储区域,则默认为data类型。这部分存储区可片内直接寻址,速度最快。由于空间较小,所以只有频繁用到或对访问速度要求很高的变量才可放在data区,比如for循环中的计数值。栈内变量一般也可放到这里。
idata: 指定数据存储在内部低256字节数据存储器区(00H~FFH)。
pdata: 指定数据存储在内部/外部扩展RAM中(00H~FFH,最大256字节),使用 MOVX @Ri指令访问 @Ri 只能访问00H-FFH单元
xdata: 指定数据存储在内部/外部扩展RAM中(0000H~FFFFH,最大64KB),可用 MOVX @DPTR访问。对于不会被频繁访问或者对访问速度要求不高的变量可放在此区域中。
code: 指定数据存储在代码存储区,数据是在编译后跟代码一起写入代码区,运行过程中不可更改。


参考:

  1. https://blog.csdn.net/sinat_31039061/article/details/90183504
  2. https://www.stcmcudata.com/datasheet/stc/STC-AD-PDF/STC12C5A60S2.pdf
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,924评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,781评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,813评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,264评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,273评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,383评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,800评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,482评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,673评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,497评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,545评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,240评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,802评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,866评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,101评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,673评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,245评论 2 341

推荐阅读更多精彩内容