1.常用的器件及特性
- 内存
- SRAM:静态内存 特点就是容量小、价格高,优点是不需要软件初始化直接上电就能用
- DRAM:动态内存 特点就是容量大、价格低,缺点就是上电后不能直接使用,需要软件初始化后才可以使用。
- 单片机中:内存需求量小,而且希望开发尽量简单,适合全部用SRAM
- 嵌入式系统:内存需求量大,而且没有NorFlash等可启动介质
- PC机: 内存需求量大,而且软件复杂,不在乎DRAM的初始化开销,适合全部用DRAM
- 外存
- NorFlash:特点是容量小,价格高,优点是可以和CPU直接总线式相连,CPU上电后可以直接读取,所以一般用作启动介质。
- NandFlash(跟硬盘一样):特点是容量大,价格低,缺点是不能总线式访问,也就是说不能上电CPU直接读取,需要CPU先运行一些初始化软件,然后通过时序接口读写。
2.各类计算机的启动方式
- PC:很小容量的BIOS(NorFlash)+ 很大容量的硬盘(类似于NandFlash)+ 大容量的DRAM
- 单片机: 很小容量的NorFlash + 很小容量的SRAM
- 嵌入式:因为NorFlash很贵,所以现在很多嵌入式系统倾向于不用NorFlash,直接使用外接的大容量Nand + 外接大容量DRAM + SoC内置SRAM
- S5PV210启动方式:外接的大容量Nand + 外接大容量DRAM + SoC内置SRAM+SoC内置iROM
3.S5PV210的启动步骤
在这张图中可以看出S5PV210的启动可大致分为五个步骤
- 1、iROM阶段(BL0)
- 2、BL1阶段
- 3、BL2阶段
- 4、拷贝OS到SDRAM
- 5、启动OS
samsung在S5PV210内部的IROM中固化了一段代码,用于初始化时钟,识别用户选择的启动模式,并从相应的地方拷贝boot-loader第一阶段代码到SRAM中运行。此外samsung在S5PV210内部也集成了96KB的内部SRAM,由于SRAM不需要初始化,上电就能使用,因此可当作DRAM初始化之前的代码运行空间。
4.iROM完成的工作
- 1、关闭看门狗;
- 2、初始化icache;
- 3、初始化栈;
- 4、初始化堆;
- 5、初始化块设备拷贝函数;
- 6、初始化PLL,设置系统时钟;
- 7、拷贝BL1到内部的SRAM区域;
- 8、检查BL1的校验和;
- 9、检查是否是安全启动模式;
- 10、跳转到BL1的起始代码处。
5.汇编启动代码
#define WTCON 0xE2700000 #define SVC_STACK 0xD0037D80 // 把_start链接属性改为外部,这样其他文件就可以看见_start了 .global _start _start: // 第1步:关看门狗(向WTCON的bit5写入0即可),不是所有的BL0都关看门狗 ldr r0, =WTCON ldr r1, =0x0 str r1, [r0] // 第2步:设置SVC栈 默认使用满减栈 ldr sp, =SVC_STACK // 第3步:开/关icache mrc p15,0,r0,c1,c0,0; // 读出cp15的c1到r0中 //bic r0, r0, #(1<<12) // bit12 置0 关icache orr r0, r0, #(1<<12) // bit12 置1 开icache mcr p15,0,r0,c1,c0,0; // 第4步:调用入口函数 bl entry
6.链接脚本
- 什么是链接地址
链接地址是由程序员预知的或希望的程序执行地址,在编译链接的过程中,通过Makefile中-Ttext xxx或者在链接脚本中指定的。 - 什么是运行地址
是程序执行,代码所处的实际位置地址。 - 链接脚本究竟要做什么?
链接脚本其实是个规则文件,他是程序员用来指挥链接器工作的。
链接器会参考链接脚本,并且使用其中规定的规则来处理.o文件中那些段,将其链接成一个可执行程序。
链接脚本的关键内容有2部分:段名 + 地址(作为链接地址的内存地址)
链接脚本的内容:- SECTIONS {} 是整个链接脚本的全部
- . 点号在链接脚本中代表当前位置。
- =等号代表赋值,要用分号结尾
link.lds
SECTIONS { . = 0xd0020010; .text : { start.o * (.text) } .data : { * (.data) } .bss : { * (.bss) } }
7.Makefile
NAME=led BIN=$(NAME).bin ELF=$(NAME).elf OBJ=start.o led.o CC=arm-linux-gcc LD=arm-linux-ld CFLAGS=-march=armv5te -nostdlib LDFLAGS=-nostartfiles -nostdlib OBJCOPY=arm-linux-objcopy bin:elf $(OBJCOPY) -O binary $(ELF) $(BIN) cp $(BIN) ~/shared/image/ elf:$(OBJ) $(LD) -T link.lds $(LDFLAGS) $(OBJ) -o $(ELF) %.o:%.c $(CC) $(CFLAGS) -c $< -o [email protected] clean: rm -f $(OBJ) $(ELF) $(BIN)
原文地址:https://www.cnblogs.com/xiehuan-blog/p/9712470.html
时间: 2024-11-08 00:18:56