stm32下了解全局变量、局部变量、堆、栈
对分区的了解
在一个STM32程序代码中,从内存高地址到内存低地址,依次分布着栈区、堆区、全局区(静态区)、常量区、代码区,其中全局区中高地址分布着.bss段,低地址分布着.data段,其分布图如下:
各区特点
一、栈区(stack)
临时创建的局部变量存放在栈区。
函数调用时,其入口参数存放在栈区。
函数返回时,其返回值存放在栈区。
const定义的局部变量存放在栈区。
2、堆区(heap)
堆区用于存放程序运行中被动态分布的内存段,可增可减。
可以有malloc等函数实现动态分布内存。
有malloc函数分布的内存,必须用free进行内存释放,否则会造成内存泄漏。
3、全局区(静态区)
全局区有.bss段和.data段组成,可读可写。
4、.bss段
未初始化的全局变量存放在.bss段。
初始化为0的全局变量和初始化为0的静态变量存放在.bss段。
.bss段不占用可执行文件空间,其内容有操作系统初始化。
5、.data段
已经初始化的全局变量存放在.data段。
静态变量存放在.data段。
.data段占用可执行文件空间,其内容有程序初始化。
const定义的全局变量存放在.rodata段。
6、常量区
字符串存放在常量区。
常量区的内容不可以被修改。
7、代码区
程序执行代码存放在代码区。
字符串常量也有可能存放在代码区。
stm32下实现对分区的了解
通过在keil中编程,在串口通信中借助调试助手查看输出
代码如下:
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include <stdlib.h>
int k1 = 1;
int k2;
static int k3 = 2;
static int k4;
int main(void)
{
static int m1=2, m2;
int i = 1;
char *p;
char str[10] = "hello";
char *var1 = "123456";
char *var2 = "abcdef";
int *p1=malloc(4);
int *p2=malloc(4);
u16 t;
u16 len;
u16 times=0;
free(p1);
free(p2);
delay_init(); //ÑÓʱº¯Êý³õʼ»¯
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //ÉèÖÃNVICÖжϷÖ×é2:2λÇÀÕ¼ÓÅÏȼ¶£¬2λÏìÓ¦ÓÅÏȼ¶
uart_init(115200); //´®¿Ú³õʼ»¯Îª115200
KEY_Init(); //³õʼ»¯Óë°´¼üÁ¬½ÓµÄÓ²¼þ½Ó¿Ú
while(1)
{
for(t=0;t<len;t++)
{
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//µÈ´ý·¢ËͽáÊø
}
USART_RX_STA=0;
times++;
if(times%500==0)
{
printf("Õ»Çø-±äÁ¿µØÖ·\r\n");
printf(" i=%p\r\n", &i);
printf(" p=%p\r\n", &p);
printf(" str=%p\r\n", str);
printf("\n¶ÑÇø-¶¯Ì¬ÉêÇëµØÖ·\r\n");
printf(" %p\r\n", p1);
printf(" %p\r\n", p2);
printf("\r\n.bss¶Î");
printf("\nÈ«¾ÖÍⲿÎÞ³õÖµ k2£º%p\r\n", &k2);
printf("¾²Ì¬ÍⲿÎÞ³õÖµ k4£º%p\r\n", &k4);
printf("¾²Ì¬ÄÚ²¿ÎÞ³õÖµ m2£º%p\r\n", &m2);
printf("\r\n.data¶Î");
printf("\nÈ«¾ÖÍⲿÓгõÖµ k1£º%p\r\n", &k1);
printf("¾²Ì¬ÍⲿÓгõÖµ k3£º%p\r\n", &k3);
printf("¾²Ì¬ÄÚ²¿ÓгõÖµ m1£º%p\r\n", &m1);
printf("\r\n³£Á¿Çø\n");
printf("ÎÄ×Ö³£Á¿µØÖ· £º%p\r\n",var1);
printf("ÎÄ×Ö³£Á¿µØÖ· £º%p\r\n",var2);
printf("\r\n´úÂëÇø\n");
printf("³ÌÐòÇøµØÖ· £º%p\n",&main);
}
delay_ms(10);
}
}
效果展示
在调试助手上可以看到显示的信息
总结
在stm32下了解全局变量、局部变量、堆、栈等概念,可以清楚的看到地址的变化。