单片机中那些数据位于flash中,哪些数据位于ram中??

单片机中那些数据位于flash中,哪些数据位于ram中??

注:这篇文章来自CSDN的上一个大哥,初学者很感谢!!在此欢迎各位来评论。
看这篇文章之前有一下几个问题:
1,全局区(静态区)和FLASH,ram的关系??
2,栈和FLASH,ram的关系??
我的总结:回答以上问题:
1,未初始化全局变量—在RAM中。默认0初始化全局变量—在RAM中。已初始化全局变量—初始化值在FLASH中,变量本身在ram里。启动时将初值从.data_init段复制到.data段;程序中访问时均是在section .data段中存取(速度较快)
2,已初始化局部变量—在RAM中。
栈的数据都在RAM中,RAM的数据不一定都在栈中,因为还有全局变量。
/************************************************************************/
我的总结:
首先,所有的学习变得有据可依,要在map文件中看这些个变量。要能看得懂map文件的细节。
收获:
1,首先,看后缀, .text后缀的是放代码的,就是我们平时说的代码段。.bss段,是存放未初始化的全局变量。 .data段:存放已初始化数据
2,常量,只读变量—在FLASH中。
/************************************************************************/

首先,看正文的时候,我是以前做过面试题的,面试题是这个题类似的题。重温一下。
19、程序的内存分配
答:一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。
4、文字常量区—常量字符串就是放在这里的。程序结束后由系统释放。
5、程序代码区—存放函数体的二进制代码

例子程序
这是一个前辈写的,非常详细
//main.cpp
int a=0; //全局初始化区
char *p1; //全局未初始化区
main()
{
intb;栈
char s[]=“abc”; //栈
char p2; //栈
char p3=“123456”; //123456\0在常量区,p3在栈上。
static int c=0; //全局(静态)初始化区
p1 = (char
)malloc(10);
p2 = (char
)malloc(20); //分配得来得10和20字节的区域就在堆区。
strcpy(p1,“123456”); //123456\0放在常量区,编译器可能会将它与p3所向"123456"优化成一个地方。
}

/*********************************************************************************************************
以下是作者原文
*******************************************************************************************************/
STM32MCU中能存放数据的地方有三处:register、rom、ram
斜体样式

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

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

//属性:常量,只读变量
//位置:直接存在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);
...

}

  • 10
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值