加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

各变量在MCU中的存放位置ram or flash

发布时间:2020-12-15 17:24:16 所属栏目:百科 来源:网络整理
导读:闲来无事,研究了下变量在MCU中存储位置 ps:MCU中能存放数据的地方有三处:register、rom、ram 涉及标准C关键字:register:定义和申请一个register级变量 ? ?? ?? ?? ?? ?? ?? ?? ???auto::定义自动变量,缺省时为编译器默认 ? ?? ?? ?? ?? ?? ?? ?? ???

闲来无事,研究了下变量在MCU中存储位置
ps:MCU中能存放数据的地方有三处:register、rom、ram

涉及标准C关键字:register:定义和申请一个register级变量
? ?? ?? ?? ?? ?? ?? ?? ???auto::定义自动变量,缺省时为编译器默认
? ?? ?? ?? ?? ?? ?? ?? ???const:定义常量

涉及IAR预定义:? ?__no_init:说明变量不需初始化
? ?? ?? ?? ?? ?? ?? ?? ? section .text段:存放代码
? ?? ?? ?? ?? ?? ?? ?? ? section .rodata段:存放只读数据
? ?? ?? ?? ?? ?? ?? ?? ? section .noinit段:存放不需初始化数据
? ?? ?? ?? ?? ?? ?? ?? ? section .bss段:存放默认初始化数据
? ?? ?? ?? ?? ?? ?? ?? ? section .data段:存放已初始化数据
? ?? ?? ?? ?? ?? ?? ?? ? CSTACK段:栈
? ?? ?? ?? ?? ?? ?? ?? ? HEAP段:堆

//属性:宏变量
//位置:是在预编译期间被汇编进section .text段(一般放在rom里)
//操作:运行中已不存在
#define??ro_def? ?0x22222111UL

//属性:常量,只读变量
//位置:直接存在section .rodata段(一般放在rom里)
//操作:程序中访问时均是在section .rodata段中取(速度较慢)
const? ???uint32_t ro_var = 0x22222222;

//属性:未初始化全局变量
//位置:是存在section .noinit: DATA段(一般放在ram里)
//操作:程序中访问时均是在section .noinit: DATA段中存取(速度较快)
__no_init uint32_t ni_global_var;? ? ? ?? ?? ?? ???

//属性:默认0初始化全局变量
//位置:是存在section .bss段(一般放在ram里)
//操作:启动时将bss段清零;程序中访问时均是在section .bss段中存取(速度较快)
uint32_t zi_global_var;

//属性:已初始化全局变量
//位置:初始化值存在section .data_init段(一般放在rom里),变量本身是存在section .data段(一般放在ram里)
//操作:启动时将初值从.data_init段复制到.data段;程序中访问时均是在section .data段中存取(速度较快)
uint32_t i_global_var = 0x33333333;?

void test_variable(void)?
{
? ? //属性:已初始化寄存器变量
? ? //位置:其初始化值存在section .text段(一般放在rom里),变量本身存在cpu的register里
? ? //操作:如果申请成功,程序中访问时均是在cpu的register中存取(速度最快);如果申请失败,则是普通局部变量
? ?? register??uint32_t i_register_var = 0x44444444;
? ??
? ? //属性:已初始化局部变量
? ? //位置:其初始化值存在section .rodata段(一般放在rom里),变量本身存在CSTACK里(一般放在ram里)
? ? //操作:定义时将初值从.rodata段复制到CSTACK中;程序中访问时均是在CSTACK段中存取(速度较快),一说局部变量入栈只是简单的移动SP指针,空出局部变量的位置而已.寻址是用SP的偏移量作为相对地址
? ?? uint32_t i_local_iArray[4] = {0x55555555,0x66666666,0x77777777,0x88888888};

? ? //属性:动态内存申请
? ? //位置:赋值是存在section .text段,申请的内存区是存在HEAP里(一般放在ram里)
? ? //操作:程序中访问时均是在HEAP段中存取(速度较快)
? ? uint32_t *zi_local_p;
? ? p = (uint32_t *)malloc(4);

? ? ...
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读