U20女足世界杯_世界杯足球先生 - fcghfw.com

单片机中那些数据位于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);

...

}

2025-07-17 22:30:29


多核与高频:CPU 性能解析及实际应用
​吨水等于多少立方米,一吨水等于多少立方米