ARM地最小系统构架_第1页
ARM地最小系统构架_第2页
ARM地最小系统构架_第3页
ARM地最小系统构架_第4页
ARM地最小系统构架_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实用标准文案S3C44B0X 的最小系统构架一、前言ARM7TDMI 是世界上广泛使用的 32位嵌入式 RISC处理器,是目前用于低端的 ARM处理器核。它的高性能,低功耗,廉价和精简的程序代码一直是市场上的领先者。 ARM公司研发了针对 ARM图形化的编译器, 连接器和调试器, 这为整个嵌入式系统的开发调试提供了较好的环境。 SamsungS3C44B0 微处理器是三星公司提供的高性价比和高性能的微控制器解决方案,它使用 ARM7TDMI 核,从SamsungS3C4510B 停产后,SamsungS3C44B0X 更成为同类芯片的主流。现今许多嵌入式系统要实现复杂的功能都需要操作系统支持,有了操作系统的支持,编写特定的应用程序就比较容易了。本文以 uClinux 最新源代码包为基础,修改代码以适合S3C44B0X 的系统,包括启动程序 bootloader ,Linux内核源代码修改,根文件系统的定制。二、硬件架构一个最小的嵌入式系统包括以下几个部分: CPU、SDRAM、FLASH。但为了调试方便本文介绍的系统带了网口和串口,网口用于传输数据大批量数据,串口用于传输字符数据,这样就可以和主机通信了。硬件框图如图 1所示。精彩文档实用标准文案图1系统硬件框图系统实验板主要芯片 (CPU,UART,FLASH(ROM) ,ETHERNETSDRAM) ,管脚连接如图2所示。图2S3C44B0X与SDRAM,Flash,以太网口,串口的连接图三、软件架构基于uClinux 的嵌入式系统软件一般由三部分构成:启动程序 (bootloader) 、内核文件(kernel)、根文件系统(rootfs) 。uClinux 源代码包含程序库, Linux内核和根文件系统所需要的应用程序源代码,而启动程序要自己编写。启动程序先初始化 CPU,然后引导 uClinux 操作系统,操作系统引导起来后会加载根文精彩文档实用标准文案件系统,加载根文件系统有几种方式,这里采用 blockmemory 技术(可以避免在启动时传递内核rootfs 位置的参数)。根文件系统使用 romfs 文件系统,这种文件系统相对简单, 很适合嵌入式系统的应用。这三部分在 FLASH和内存的分配地址如图 3和图4所示。图3flash地址分配图4内存地址分配最难调试的部分应该是启动程序部分;对于以后的内核可以根据串口输出的错误信息来判断。笔者采用 ARM公司的调试工具 AXD来调试bootloader 。精彩文档实用标准文案1.启动程序(bootloader)bootloader 有两大功能:初始化CPU和引导Linux内核(采用将压缩内核拷贝到内存解压方法,这样可以加快启动速度 )。初始化CPU中断向量ARM要求中断向量表必须放置在从 0地址开始,连续 8×4字节的空间内。每当一个中断发生以后,ARM处理器便强制把 PC指针置为向量表中对应中断类型的地址值。因为每个中断只占据向量表中 1个字的存储空间, 只能放置一条 ARM指令,使程序跳转到存储器的其他地方,再执行中断处理。所以0地址开始的地方,分配为flash的空间,在0地址开始处放中断向量, 作为uClinux的启动代码,实现方式如下:b resetaddpc,pc,#0x0c000000addpc,pc,#0x0c000000addpc,pc,#0x0c000000addpc,pc,#0x0c000000addpc,pc,#0x0c000000addpc,pc,#0x0c000000addpc,pc,#0x0c0000000x0c000000 为内存起始地址, uClinux 将中断向量放入地址 0x0c000008 ,因为cpu发生中断时仍然会跳转到 0地址处的中断向量表中去,所以此处要修改中断向量表的地址,使程序能正确跳转到 uClinux 实现的中断向量处。 由于ARM系统的三级流水线技术, 当程精彩文档实用标准文案序执行到x地址处,pc指针的值其实等于 x+8。在uClinux 中相关代码如下:#ifdefCONFIG_ARCH_S3C44B0#undefvectors_base()#definevectors_base()(0x0c000008)#endifaddpc,pc,#0x0c000000 这条语句将会有 8的偏移量,当 pc等于0时,这条指令的执行结果为 pc=0x0c000008 。中断处理这段reset代码放在 flash中。这样系统每次复位后,会执行 flash上的reset代码。初始化存储器系统初始化堆栈在初始化堆栈时应该特别注意,堆栈指针地位置一定不能和其他程序的地址相冲突,否则程序很容易异常。初始化有特殊要求的端口,设备初始化用户程序执行环境改变处理器模式调用主应用程序引导Linux内核主应用程序里放操作系统引导程序的代码, 一般此处应该传递给 Linux内核启动参数 (如ramdisk 的位置等),但程序加载内核使用 blockmemory 技术,所以不用传递参数来加载精彩文档实用标准文案根文件系统 rootfs 。只要将Linux内核和rootfs 从flash(如图1)拷贝到内存中相应位置 (如图2)。拷贝完成后跳转到内核入口地址处执行。具体方法是用将压缩内核的地址转换成函数的指针,并传递处理器号ARCH_NUMBER。这在uClinux内核源代码的目录文件中定义:s3c44b0ARCH_S3C44B0S3C44B01782.uClinux 系统内核uClinux 的官方网站发布的最新 uClinux 移植包是uclinux-dist-20040408 ,它包含了三星S3C4510B 的源代码,可以将它移植到 S3C44B0平台下。具体内核源代码的改动如下 (其中出现的内存地址可以参考图 4)。(1)Linux 内核编译配置选项文件 中:#SystemTypeCONFIG_ARCH_MBA44B0=yCONFIG_NO_PGT_CACHE=yCONFIG_CPU_32=yCONFIG_CPU_ARM710=yCONFIG_CPU_WITH_CACHE=yCONFIG_SERIAL_44B0=yDRAM_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文件文件 中:ifeq($(CONFIG_ARCH_S3C44B0),y)TEXTADDR=0x0c008000MACHINE=s3c44bOendifTEXTADDR=0x0c008000# 表明未压缩的内核的位置 :ifeq($(CONFIG_ARCH_S3C44B0),y)ZRELADDR =0x0c008000ZTEXTADDR =0x0c300000endifZRELADDR=0x0c008000# 表明未压缩的内核的位置ZTEXTADDR=0x0c300000# 表明压缩内核的位置中断向量地址文件 中#ifdefCONFIG_ARCH_S3C44B0#undefvectors_base()精彩文档实用标准文案#definevectors_base()(0x0c000008)#endif内存地址为 0x0e000008 的原因在启动程序一处已经提到过。处理器基本参数和类型文件 中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) 表示内核参数的传递地址。文件 中:s3c44b0ARCH_S3C44B0S3C44B0178178是arch_number在跳转到内核时, r0=0,r1=arch_number网络驱动这里采用的芯片是 RTL8019AS,数据宽度用的是 8位,它和 ne2000 兼容,所以只要精彩文档实用标准文案修改ne2000 的源代码(I/O起始地址、中断向量号、数据宽度 )就可以实现网口的驱动了。文件 中: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 技术和blockmemory 。这里用blockmemory 技术指定 romfs 的地址。(makemenuconfig 时选定romfs 和romdisksupport)文件 中:arena[]={#ifdefCONFIG_ARCH_S3C44B0{0,0x0CC00000,-1},#endif这样只要将 mmfs 加载到相应的地址 0x0CC00000 ,内核就可以找到。修改完成后,编译内核(makemenconfig) 时要选择支持 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 时,就可以把这个程序放入根文件

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论