在看rt_thread官方教程第二节的时候讲到了动态内存分配,因为概念不清晰所以上网查了一下,现在做一个小结。
stack
栈,是编译器自动分配和释放的。
例如:
局部变量
int a;
char str[];
char *p;
这个a
和str[]
,指针p
都是在栈里面管理的
有个小例外
char *p = “12345”
这里的指针p
在栈里面,但是它指向的内容12345呢是在常量区的
链接: 什么是代码区、常量区、静态区(全局区)、堆区、栈区?.
heap
堆,是程序员自己分配的。
malloc和free
int main(void)
{
char *p ;
p = "1234aa5";
printf("%p: %s\n",p,p);
char*a=NULL;//声明一个指向a的char*类型的指针
a=(char*)malloc(100*sizeof(char));//使用malloc分配内存首地址,然后赋值给a
if(!a)//如果malloc失败,可以得到一些log
{
perror("malloc");
return-1;
}
sprintf(a,"%s","HelloWorld\n");//"HelloWorld\n"写入a指向的地址
printf("%s\n",a);//输出用户输入的数据
free(a);//释放掉使用的内存地址
return 0;
}
动态内存区
就是stack和heap放置的地方了
静态内存区
里面放的是一些全局变量和被static修饰的变量
常量区
就是写代码的时候写死的一些常量,不能改的。
图像里面直观看iROM和iRAM
ROM 和 RAM
IROM : internal ROM
IRAM : internal RAM
ROM : READ ONLY MEMORY ,只读的存储器
RAM:RANDOM ACCESS MEMORY 随机访问的存储器(可读写)
其实IROM和IRAM本质上还是ROM和RAM。
ROM可以理解为写好的程序就丢在这里,掉电不会消失的。
RAM理解为运行内存,开机的时候程序是把自己搬到内存里面去运行的。
SRAM和DRAM
SRAM是static的RAM,DRAM是dynamic的RAM,本质上两个都是RAM,都是掉电失去内容的。
RAM里面的0和1是晶体管跟电容去控制的
1.SRAM的0跟1要很多个晶体管和电容去控制,比较复杂,带来的好处是速度快,不用频繁去刷新电路就可以存取了,而且不用初始化就能用了。
2.DRAM比SRAM简单,0跟1只要一个晶体管或者电容就可以控制了,结构简单,容量大,但是用时候要先初始化。
3.DRAM往上升级就是SDRAM,这个S是synchronize的意思,反正比DRAM更快更强了
4.网上就是DDR SDRAM ,double data rate SDRAM ,还有DDR2 DDR3 DDR4,越来越强的。
Flash
Flash指的是非易失闪存,可以理解向硬盘一样,但是又不能把它当成跟ROM一样,如果一样为什么要起不同的名字呢?
怎么去理解Flash?
链接: ROM, FLASH和RAM的区别.
Flash特性:
-
可擦除可编程,跟EEPROM一样
-
断电不会丢失
-
可以快速读取数据
-
Flash跟EEPROM最大的区别是Flash按扇区操作,相对于EEPROM的改进就是擦除时不再以字节为单位,而是以块为单位
Flash有两种:
- NOR Flash
a. 用户可以直接运行装载在NOR Flash中的代码(主要是因为有XIP技术,片上执行,不像NAND flash得将代码复制到RAM中才可以执行),这样可以减少SRAM的容量从而节约了成本。
b. 地址线和数据线分开,可以实现RAM一样的随机寻址,可以读取任意一个字节
c. 但擦除还是要以块为单位
- NADN Flash
a. 数据线和地址线复用,不能利用地址线随机寻址。读取只能按页
总而言之,NOR flash和NAND flash比较,NOR可以支持随机访问,支持XIP,NAND不行;NOR容量小,读的比NAND快;NAND的容量较大,虽然读起来也快;NOR 写擦除都很慢,所以一般放代码段,而NAND写和擦除都很快,所以没有这个应用上的限制。