1.数据存储是以“字节”(byte)为单位,数据传输大多是以“位”(bit,又名“比特”)为单位,一个位就代表一个0或1(即二进制),每8个位(bit,简写为b)组成一个字节(Byte,简写为B),是最小一级的信息单位
1字节(Byte)=8位(bit)
1KB( Kilobyte,千字节)=1024B
1MB( Megabyte,兆字节)=1024KB
1GB( Gigabyte,吉字节,千兆)=1024MB
1TB( Trillionbyte,万亿字节,太字节)=1024GB
1PB( Petabyte,千万亿字节,拍字节)=1024TB
2.32位操作系统的地址空间为32位,地址总数为2^32。每个地址对应1Byte内存空间,32位操作系统管理的最大内存空间限制为4GB。
1.KEIL编译后显示Program Size详解:
data=23.3代表程序生成的代码所占用单片机的内部RAM空间是23.3个字节;xdata是片外RAM空间,xdata=45表示没有使用片外RAM空间数据;
code=282代表生成的代码大小(即ROM空间,这里一般指flash)是282字节。
2、什么是哈弗结构和冯*诺伊曼结构?
哈佛结构是一种将程序指令存储和数据存储分开的存储器结构,中央处理器首先到程序指令存储器中读取程序指令内容,解码后得到数据地址,再到相应的数据存储器中读取数据,并进行下一步的操作(通常是执行)。程序指令存储和数据存储分开,可以使指令和数据有不同的数据宽度。
冯.诺伊曼结构(von Neumann architecture),也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的电脑设计概念结构。
3、什么是ROM和RAM?
ROM:只读内存,其中flash可以理解为ROM。保存在ROM中的数据不会因断电而丢失,用于保存用户程序和在程序执行中保持不变的常数。
RAM: 随机读/写内存,其中Sram 、DRAM可以理解为RAM。保存在RAM中的数据断电后也随之丢失,主要用于存储程序中的变量。
4、什么是栈和堆?
栈(stack):用来存储每个函数创建的局部变量和形参等,栈是先进后出原则的结构体。在函数中每次声明一个局部变量就存在栈中,函数退出则定义的局部变量也就会被释放。局部变量创建和释放都是自动,因此不需要管理栈内存。
堆(heap):堆是一种经过排序的树形数据结构,每个节点都有一个值。堆的存取是随意的,如同我们在图书馆书架上取书一样。通过malloc()在堆上创建内存,使用free()或者由os释放。
5、单片机内存模型?
5.1对于栈生长方向向下的单片机,其内存一般模型是:
5.2代码中标注存储位置
5.3 单片机运行时所占用的内存,可以分为如下几个部分:
1、栈区(stack):由编译器自动分配释放,存放函数地形参,局部变量的值等。
2、堆区(heap):由程序员分配释放,或程序结束时由OS释放。
3、全局变量、静态变量:初始化的全局变量和静态变量放在一块区域,未初始化的全局变量和和未初始化的静态变量在相邻的的另一块区域。程序结束后由系统自动释放。
4、文字常量:常量字符串就是存放在这里的,程序结束后由系统释放。
5、程序代码:存放函数体的二进制代码。
MCU从FLASH启动文件分析:
- 定义.section .isr_vector ,“a”中断向量表(sp,复位 256占0x400);
- 定义.section .FlashConfig ,“a” 定义flash段;
- .text .thumb 表示text段使用thunb指令;
- Reset_Handler 开始复位(关机中断,清除通用寄存器,);
- 初始化RAM、初始化堆栈_stacktop_;
- SystemInit系统相关的初始化;
- Init_data_bss函数
- 定义一些变量来连接脚本;
- 把初始化了的数据从Flash搬移到RAM;
- 定义没有初始化.Bss段的变量大小;
- 有一些会把中断向量表拷贝到RAM;
- 打开中断,跳转到main();
5、Keil编译 Program Size含义?
keil 显示:Program Size:Code=xx RO-data=xx RW-data=xx ZI-data=xx
Flash存储 code(代码存储区)和RO-data(只读数据存储区)。
Sram存储 RW-data(读写数据存储区)和ZI-data(零初始化数据区)。