嵌入式基本概念

2019-07-13 03:51发布

1. Uboot 和 BootLoader
  BootLoader:引导程序,在嵌入式linux中,没有BIOS,而是直接从flash中运行,来装载内核。它可以初始化硬件设备,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统做好准备。 Uboot:是BootLoader中的一种 2. NorFlash、NandFlash和eMMC
  Nor:NOR地址线和数据线分开,来了地址和控制信号,数据就出来。所以NOR芯片可以像SRAM一样连在数据线上。(s3c2440)以Nor启动时,nor flash被映射到0x00000000地址(就是nGCS0,这里就不需要片内SRAM来辅助了,所以片内SRAM的起始地址还是0x40000000). 然后cpu从0x00000000开始执行(也就是在Norfalsh中执行)。 Nand:地址线和数据线在一起,需要用程序来控制,才能出数据。cpu会自动从NAND flash中读取前4KB的数据放置在片内SRAM里(s3c2440是soc),同时把这段片内SRAM映射到nGCS0片选的空间(即0x00000000)。cpu是从0x00000000开始执行,也就是NAND flash里的前4KB内容。因为NAND FLASH连地址线都没有,不能直接把NAND映射到0x00000000,只好使用片内SRAM做一个载体。通过这个载体把nandflash中大代码复制到RAM(一般是SDRAM)中去执行。 eMMC:eMMC 相当于 NandFlash+主控IC ,对外的接口协议与SD、TF卡一样,主要是针对手机或平板电脑等产品的内嵌式存储器标准规格。eMMC的一个明显优势是在封装中集成了一个控制器,它提供标准接口并管理闪存,使得手机厂商就能专注于产品开发的其它部分,并缩短向市场推出产品的时间。这些特点对于希望通过缩小光刻尺寸和降低成本的NAND供应商来说,同样的重要。 3. 启动地址
这里写图片描述 以2440为例,
总结:
  1. 以Nor启动时,cpu从norflash中读取指令,运行时的栈在片内RAM中,而此时norflash被映射到nGCS0片选的Bank0空间,其地址被映射为0x0000 0000;即启动地址为0x0000 0000;而片内4K RAM的地址被映射为0x4000 0000,栈底设置为0x4000 0000 + 4096;
  2. 以Nand启动时,0地址线会连接到起步石(stepping stone,即片内4K RAM)上面,同时CPU会通过内部的硬件将NAND FLASH开始的4K数据复制到起步石里面,启动地址还是0x00000000,栈底设置为0x0000 0000 + 4096;

     
    下面这段摘自:为什么nor启动要将sp设置为0x40000000+4096 ?
1.先解释0x40000000如何来?
用NOR启动时,片内的存储控制器的BANK0-BANK7这8个BANK都对应了其他用途,所以设计者在BANK7结束的地址0x40000000的地方作为
NOR FLASH的启动地址,而NAND FLASH启动的地址则是0x00000000。请看下图:
  1. 为什么要+4096?
    因为对于启动文件.S来说,4K的空间是足够存放,代码段、BSS…和堆栈段了,因为堆栈的SP是从高地址往低地址移动的,所以要将堆栈的起始地址放在堆栈段的高地址;
    你也可以不用设置成4096,但要保证堆栈的长度不能和下面其他段重叠,若重叠,就会出BUG,保险值是4096,因为SRAM就是4K设计的。
下面这段摘自:关于S3C2440存储器地址分配和启动流程分析
  1. 从NorFlash启动时,与nGCS0相连的NorFlash就被映射到nGCS0片选的Bank0空间,其地址被映射为0x0000 0000;
  2. 从NandFlash启动时,S3C2440芯片内部自带的一块容量为4K的被称为“Steppingstone”(起步石)的BootRAM被映射到nGCS0片选的Bank0空间,其地址被映射为0x0000 0000。当系统上电或复位时,程序会从0x0地址处开始执行,因此我们编写的启动代码要确保存储在0地址处。如果系统的所有程序在编译链接后的大小小于4K,那在系统的启动代码中无需考虑将程序从NandFlash搬运到SDRAM这个问题,因为所有的程序在启动时即全部由NandFlash拷贝至BootSRAM,程序在BootSRAM中运行即可;如果系统的所有程序在编译链接后的大小大于4K,那在系统的启动代码中就需要包含一段将系统的全部程序从NandFlash搬运到SDRAM的代码,因为系统启动时只将NandFlash的前4K拷贝到了BootSRAM中,还有部分程序在NandFlash中,而程序在NandFlash中是无法运行的,需要将所有程序拷贝至SDRAM并在其中运行,所以系统的启动代码中要包含这段有关程序拷贝的代码,并在所有程序拷贝完成后使程序跳转到SDRAM中运行。也就是说NandFlash启动时需要考虑到涉及的两次搬移,第一次搬运是S3C2440硬件机制自动实现的,无需干预,第二次搬运需要程序员来实现,搬运程序量大小是系统的所有程序。
下面这段摘自:S3C2440 存储器地址映射
ARM9作为32位的CPU,理论上可以使用的地址范围可以达到2的32次方等于4G,除去上述的1G地址空间,还有一部分是CPU内部寄存器的地址,剩下的地址空间没有使用。那么,0x4000 0000以后的地址是怎样映射的呢?

0x4000 0000——0x4000 0FFF 从NOR Flash启动时片内4KB SRAM映射在这个地址范围,而从NAND启动时片内4KB SRAM映射在0x0000 0000地址,则这个地址范围是保留的。
0x4000 0FFF——0x4800 0000 保留
0x4800 0000——0x6000 0000 特殊功能寄存器的地址
0x6000 0000——0xFFFF FFFF 未用
其中特殊功能寄存器的地址分布如下所示:
表2-14 S3C2440设备寄存器地址空间
外接设备 起始地址 结束地址 存储控制器 0x48000000 0x48000030 USB Host控制器 0x49000000 0x49000058 中断控制器 0x4A000000 0x4A00001C DMA 0x4B000000 0x4B0000E0 时钟和电源管理 0x4C000000 0x4C000014 LCD控制器 0x4D000000 0x4D000060 NAND FLASH控制器 0x4E000000 0x4E000014 摄像头接口 0x4F000000 0x4F0000A0 UART 0x50000000 0x50008028 脉宽调制计时器 0x51000000 0x51000040 USB设备 0x52000140 0x5200026F WATCHDOG计时器 0x53000000 0x53000008 IIC控制器 0x54000000 0x5400000C IIS控制器 0x55000000 0x55000012 I/O端口 0x56000000 0x560000B0 实时时钟RTC 0x57000040 0x5700008B A/D转换器 0x58000000 0x58000010 SPI 0x59000000 0x59000034 SD接口 0x5A000000 0x5A000040 AC97音频编码接口 0x5B000000 0x5B00001C
具体这些地址是如何映射的,可以参考《对S3C2440特殊功能寄存器地址的深入挖掘》
以上部分源自:http://www.linuxidc.com/Linux/2011-11/46479.htm
4. 程序下载一般流程
 1. 首先将u-boot程序烧写到NorFlash
 2. 开发板设置为nor启动,上电进入uboot
 3. 通过uboot接收并烧写bin文件到NandFlash
 4. 设置Nand启动