stm32的堆、栈、全局变量的分配地址编程显示
在一个STM32程序代码中,从内存高地址到内存低地址,依次分布着栈区、堆区、全局区(静态区)、常量区、代码区,其中全局区中高地址分布着.bss段,低地址分布着data段。
1、寄存器与固件库的差异:
固件库就是函数的集合。
当我们写代码的时候可以直接对寄存器进行操作,但是如果使用的寄存器较多我们就需要掌握每一个寄存器的操作方法,对于我们而言十分的不容易,因此便有了固件库的出现。它将每个寄存器的操作封装在一个函数中,在使用的时候我们直接调用这个函数就可以了,函数固件库函数的作用是向下负责与寄存器直接打交道。向上提供用户函数调用的接口(API)。我们就不用再细究这个寄存器具体是怎么操作的。
2、C语言程序中内存分配详解
分析上图
1)、栈区(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)、代码区
程序执行代码存放在代码区。
字符串常量也有可能存放在代码区
3、函数的栈帧
函数调用时所建立的栈帧包含下面的信息:
1)函数的返回地址。返回地址是存放在主调函数的栈帧还是被调用函数的栈帧里,取决于不同系统的实现;
2)主调函数的栈帧信息, 即栈顶和栈底;
3)为函数的局部变量分配的栈空间;
4)为被调用函数的参数分配的空间取决于不同系统的实现。
C程序代码各种类型变量的地址空间
在ubantu中编写代码如下:
#include <stdio.h>
#include <stdlib.h>
int k1 = 1;
int k2;
static int k3 = 2;
static int k4;
int main( )
{
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