STM32
直播中

孔妞妞

12年用户 481经验值
私信 关注
[问答]

STM32程序代码的分区各有哪些特点呢

STM32程序代码的分区有哪些呢?
STM32程序代码的分区各有哪些特点呢?

回帖(1)

张蕾

2021-12-1 13:54:07
对分区的了解

在一个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
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                         {
                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//µÈ´ý·¢ËͽáÊø
                        }
                        USART_RX_STA=0;
                        times++;
                        if(times%500==0)
                        {
              printf("Õ»Çø-±äÁ¿µØÖ·rn");
                                printf("              i=%prn", &i);
                                printf("              p=%prn", &p);
                                printf("             str=%prn", str);
        printf("n¶ÑÇø-¶¯Ì¬ÉêÇëµØÖ·rn");
        printf("                 %prn", p1);
        printf("                 %prn", p2);
        printf("rn.bss¶Î");
        printf("nÈ«¾ÖÍⲿÎÞ³õÖµ k2£º%prn", &k2);
        printf("¾²Ì¬ÍⲿÎÞ³õÖµ k4£º%prn", &k4);
        printf("¾²Ì¬ÄÚ²¿ÎÞ³õÖµ m2£º%prn", &m2);
        printf("rn.data¶Î");
        printf("nÈ«¾ÖÍⲿÓгõÖµ k1£º%prn", &k1);
        printf("¾²Ì¬ÍⲿÓгõÖµ k3£º%prn", &k3);
        printf("¾²Ì¬ÄÚ²¿ÓгõÖµ m1£º%prn", &m1);
        printf("rn³£Á¿Çøn");
        printf("ÎÄ×Ö³£Á¿µØÖ·     £º%prn",var1);
        printf("ÎÄ×Ö³£Á¿µØÖ·     £º%prn",var2);
        printf("rn´úÂëÇøn");
        printf("³ÌÐòÇøµØÖ·       £º%pn",&main);
                        }
                        delay_ms(10);   
                }
        }
效果展示

在调试助手上可以看到显示的信息


总结

在stm32下了解全局变量、局部变量、堆、栈等概念,可以清楚的看到地址的变化。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分