网站导航: 首页 > 设计参考 > 正文 文章搜索
S3C44B0X的最小系统构架[图]
 
文章编号:
081211163926
文章分类: 单片机 ARM
点 击:
...
关 键 词: S3C44B0X,最小系统
文章来源:
网络,作者:赵云 郭莉莉
摘 要:
一个最小的嵌入式系统包括以下几个部分:CPU、SDRAM、FLASH。但为了调试方便本文介绍的系统带了网口和串口...

1.启动程序(bootloader)
    bootloader有两大功能:初始化CPU和引导Linux内核(采用将压缩内核拷贝到内存解压方法,这样可以加快启动速度)。
(1)初始化CPU
    1)中断向量
    ARM要求中断向量表必须放置在从0地址开始,连续8×4字节的空间内。每当一个中断发生以后,ARM处理器便强制把PC指针置为向量表中对应中断类型的地址值。因为每个中断只占据向量表中1个字的存储空间,只能放置一条ARM指令,使程序跳转到存储器的其他地方,再执行中断处理。
    所以0地址开始的地方,分配为flash的空间,在0地址开始处放中断向量,作为uClinux的启动代码,实现方式如下:
b  reset
add pc,pc,#0x0c000000
add pc,pc,#0x0c000000
add pc,pc,#0x0c000000
add pc,pc,#0x0c000000
add pc,pc,#0x0c000000
add pc,pc,#0x0c000000
add pc,pc,#0x0c000000
  0x0c000000为内存起始地址,uClinux将中断向量放入地址0x0c000008,因为cpu发生中断时仍然会跳转到0地址处的中断向量表中去,所以此处要修改中断向量表的地址,使程序能正确跳转到uClinux实现的中断向量处。由于ARM系统的三级流水线技术,当程序执行到x地址处,pc指针的值其实等于x+8。
  在uClinux中相关代码如下:
#ifdef CONFIG_ARCH_S3C44B0
#undef vectors_base()
#define vectors_base() (0x0c000008)
#endif
  add pc,pc,#0x0c000000这条语句将会有8的偏移量,当pc等于0时,这条指令的执行结果为pc=0x0c000008。
    2)中断处理
    这段reset代码放在flash中。这样系统每次复位后,会执行flash上的reset代码。

  1. 初始化存储器系统
  2. 初始化堆栈
      在初始化堆栈时应该特别注意,堆栈指针地位置一定不能和其他程序的地址相冲突,否则程序很容易异常。
  3. 初始化有特殊要求的端口,设备
  4. 初始化用户程序执行环境
  5. 改变处理器模式
  6. 调用主应用程序

(2)引导Linux内核
    主应用程序里放操作系统引导程序的代码,一般此处应该传递给Linux内核启动参数(如ramdisk的位置等),但程序加载内核使用blockmemory技术,所以不用传递参数来加载根文件系统rootfs。只要将Linux内核和rootfs从flash(如图1)拷贝到内存中相应位置(如图2)。拷贝完成后跳转到内核入口地址处执行。具体方法是用将压缩内核的地址转换成函数的指针,并传递处理器号ARCH_NUMBER。这在uClinux内核源代码的目录文件uClinux-dsit/linux2.4.x uClinux-dsit/linux2.4.x/arch/armnommu/tools/Match-types中定义:
s3c44b0 ARCH_S3C44B0 S3C44B0 178

2.uClinux系统内核
  uClinux的官方网站发布的最新uClinux移植包是uclinux-dist-20040408,它包含了三星S3C4510B的源代码,可以将它移植到S3C44B0平台下。具体内核源代码的改动如下(其中出现的内存地址可以参考图4)。
    (1)Linux内核编译配置选项
    文件uClinux-distvendorsSamsungS3C44B0config.linux-2.4.x中:
    #System Type
    CONFIG_ARCH_MBA44B0=y
    CONFIG_NO_PGT_CACHE=y
    CONFIG_CPU_32=y
    CONFIG_CPU_ARM710=y
    CONFIG_CPU_WITH_CACHE=y
    CONFIG_SERIAL_44B0=y
    DRAM_BASE=0x0c000000#SDRAM起始地址
    DRAM_SIZE=Ox01000000#SDRAM大小16M
    FLASH_MEM_BASE=0x00000000#FLASH起始地址
    FLASH_SIZE=0x00200000  #FLASH大小2M
    以后的make都以CONFIG_ARCH_S3C44B0=y这选项来解决是编译和$3C4480相关的其他选项。
    (2)处理器MAKEFILE文件
    文件uClinux-dsit/linux2.4.x/arch/armnommu/Makefie中:
  ifeq($(CONFIG_ARCH_S3C44B0),y)
 TEXTADDR=0x0c008000
 MACHINE=s3c44bO
 endif
 TEXTADDR=0x0c008000#表明未压缩的内核的位置
uClinux-dsit/linux2.4.x/arch/armnommu/boot/Makefie:
  ifeq($(CONFIG_ARCH_S3C44B0),y)
  ZRELADDR  =0x0c008000
  ZTEXTADDR  =0x0c300000
  endif   
ZRELADDR=0x0c008000#表明未压缩的内核的位置
ZTEXTADDR=0x0c300000#表明压缩内核的位置
    (3)中断向量地址
    文件uClinux-dsit/linux2.4.x/include/asm-armnommu/proc-armv/system.h中
  #ifdef CONFIG_ARCH_S3C44B0
  #undef vectors_base()
  #define vectors_base()(0x0c000008)
  #endif
    内存地址为0x0e000008的原因在启动程序一处已经提到过。
    (4)处理器基本参数和类型
    文件uClinux-dsit/linux2.4.x/arch/armnommu/machs3c44b0/arch.c中
    MACHINE_START(MBA44B0,"S3C4480")
    MAINTAINER("MacWang")
    BOOT_MEM(0x0c000000,0x01c00000,0x01c00000)
    BOOT_PARAMS(0x0c000100)
    INITIRQ(genarch_init_irq)
    MACHINE_END
  其中MACHINE_START(MBA44B0,"S3C44B0")的"MBA4480"是在asm/mach-types.h里定义的平台类型
BOOT_MEM(0x0c000000,0x01c00000,0x01c00000)指定了启动的RAM地址0x0c000000,特殊功能寄存器地址0x01c00000,BOOT_PARAMS(0x0c000100)表示内核参数的传递地址。
    文件uClinux-dsit/linux2.4.x/arch/armnommu/tools/Match-types中:
    s3c44b0 ARCH_S3C44B0 S3C44B0 178
    178是arch_number
    在跳转到内核时,r0=0,r1=arch_number
    (5)网络驱动
    这里采用的芯片是RTL8019AS,数据宽度用的是8位,它和ne2000兼容,所以只要修改ne2000的源代码(I/O起始地址、中断向量号、数据宽度)就可以实现网口的驱动了。
    文件uClinux-dsit/linux2.4.x/driver/net/ne.e中:
dev->base_addr=base_addr=NE2000_ADDR;
dev->irq=NE2000_IRQ_VECTOR;
  NE2000_ADDR和NE2000IRQ_VECTOR分别是RTL8019AS的I/O起始地址和中断向量号,根据硬件连接改成相应的值。ne_probel函数中wordlength=2代表数据宽度为16位,改为wordlength=1代表数据宽度为8位。
    (6)用blockmemory指定地址
    对rootfs的加载一般有两种方式,用initrd技术和block memory。这里用blockmemory技术指定romfs的地址。(makemenuconfig时选定romfs和romdisksupport)
    文件uClinux-dsit/linux2.4.x/driver/block/Blkmem.c中:
  arena[]={
  #ifdef CONFIG_ARCH_S3C44B0
  {0,0x0CC00000,-1},
  #endif
    这样只要将mmfs加载到相应的地址0x0CC00000,内核就可以找到。
    修改完成后,编译内核(make menconfig)时要选择支持ramdisk和blkmem。ne2000网卡驱动,romfs和ramfs文件系统,TCP/IP协议的项。

3.根文件系统(rootfs)
    uClinux源代码包里有直接生成rootfs的工具,它所采用的是romfs格式的文件系统。
    定制romfs时选择一些基本的shell命令,包括文件系统的一些命令,用户可根据需要选择自己需要的命令。笔者选择了telnet服务器程序(有利于从远程主机登录到系统上),ftp服务器和客户端命令等网络程序。
    最后要结合自己的应用来编写一个uClinux操作系统下的应用程序。有了uClinux操作系统的支持,应用程序的编写就比较容易了。嵌入式uClinux系统下的应用程序和PC机上Linux系统下的编程相似,区别只是调用的库函数不一样。PC机上调试程序比较容易,可以先在PC机上调试代码,再从X86机移植程序到ARM处理器。在移植过程种应注意内存奇地址问题,在X86机上将4字节长的数据存放在一个内存奇地址上一般不会有问题,但在ARM处理器执行时就会产生异常。在Linux下有各种开源的代码,它们功能都比较完善,只要移植到uClinux下就可以了。这大大地增加了嵌入式系统地开发效率。
    在uClinux-dist源代码包的usr目录下增加自己的程序文件夹,该文件夹内存放所需的程序和MAKEFILE文件。因为上一级目录的MAKEFILE会对子文件夹内的每个文件夹调用MAKE,所以在上层目录编译romfs时,就可以把这个程序放入根文件系统中。
    最后把以上三个步骤生成的二进制文件用烧写FLASH工具分别烧写在如图3所示的flash地址处,就可以在嵌入式系统上运行一个带网络功能的uClinux操作系统了。

四、结语
    本文根据笔者所用的嵌入式实验板为平台构建uClinux软件平台,在不同的S3C44B0X嵌入式系统中,根据硬件和应用的不同,可以更改相应的地方,以适合自己系统的需要。把移植过程中最关键的地方列出,其他细节(例如uClinux的编译)限于篇幅不再赘述,可以作为移植S3C44B0X嵌入式uClinux系统的参考。

 
相关文章:

上一页 12
 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 




 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4