没志青年
发布于 2025-07-28 / 18 阅读
0

Cortex-M MCU - 内存组织

STM32 内存布局验证:

#include "main.h"
#include <string.h> //用于字符串处理
#include <stdio.h>	//用于printf打印
#include <stdlib.h> //用于分配堆区---调用malloc和free

#include "delay.h"
#include "uart3.h"
#include "led.h"

//全局区
		int 	q1;		//未初始化全局变量
static 	int 	q2;		//未初始化静态变量	
const  	int   	q3;		//未初始化只读变量		

		int   m1=1;		//已初始化全局变量
static  int   m2=2;		//已初始化静态变量

//常量区
const   int   m3=3;		//已初始化只读变量
				
int main(void)
{
	SystemCoreClockUpdate(); //设置系统时钟为72M
	LED_GPIO_Config();
	Uart3_init();
	
	while(1)
	{
		//栈区	
		int 	 mq1;			//未初始化局部变量
		int  	*mq2;			//未初始化局部指针变量
			
		int   	mq3=3;		//已初始化局部变量	
		char 	qq[10] = "hello"; //已初始化局部数组
		
		const  	int   mq4;			//未初始化局部只读变量
		const   int   mq5=3;		//已初始化局部只读变量
				
		//堆区
		int *p1 = malloc(4);    //已初始化局部指针变量p1
		int *p2 = malloc(4);    //已初始化局部指针变量p2		
				
		//全局区
		static 	int 	mp1;			//未初始化局部静态变量	
		static  int   mp2=2;		//已初始化局部静态变量
	
		//常量区
		char *vv = "I LOVE YOU";//已初始化局部指针变量
		char *mq = "5201314";
	
		printf("\n栈区-变量地址\n");
		printf("未初始化局部变量 		:0x%p\r\n",&mq1);
		printf("未初始化局部指针变量		:0x%p\r\n",&mq2);
		printf("已初始化局部变量			:0x%p\r\n",&mq3);
		printf("已初始化局部数组			:0x%p\r\n", qq );
		
		printf("未初始化局部只读变量 		:0x%p\r\n",&mq4);
		printf("已初始化局部只读变量		:0x%p\r\n",&mq5);
		
		printf("\n堆区-动态申请地址\r\n");
		printf("已初始化局部int型指针变量p1   :0x%p\r\n", p1);
		printf("已初始化局部int型指针变量p2   :0x%p\r\n", p2);

		printf("\n全局区-变量地址\n");
		printf("未初始化全局变量 	:0x%p\r\n",&q1);
		printf("未初始化静态变量		:0x%p\r\n",&q2);
		printf("未初始化只读变量		:0x%p\r\n",&q3);
		
		printf("已初始化全局变量 	:0x%p\r\n",&m1);
		printf("已初始化静态变量		:0x%p\r\n",&m2);

		printf("未初始化局部静态变量	 :0x%p\r\n",&mp1);
		printf("已初始化局部静态变量	 :0x%p\r\n",&mp2);			
		
		printf("\n常量区地址\n");
		printf("已初始化只读变量		  :0x%p\r\n",&m3);
		printf("已初始化局部指针变量	  :0x%p\r\n",vv );
		printf("已初始化局部指针变量	  :0x%p\r\n",mq );
		
		printf("\n代码区地址\n");
		printf("程序代码区main函数入口地址	:0x%p\n", main);

		led485_flicker();
		delay_ms(1000);
		
		free(p1);
		free(p2);        
	}
}