《浅谈arm》由会员分享,可在线阅读,更多相关《浅谈arm(8页珍藏版)》请在金锄头文库上搜索。
1、精品文档2016 全新精品资料-全新公文范文 -全程指导写作 独家原创 1 / 8浅谈 ARM摘要:进行 UDP 协议通信时,发送端和接收端的状态是相对独立的,发送端不与接收端建立连接,而是不停向接收端发送,为了确保不丢失报文,上位机采取了按固定次数重发相同内容报文的机制。这种机制虽然可以有效确保报文不丢失,但大量冗余数据报被发送,络利用率不高。显然重发次数越多,冗余数据报越多,效率越低。要想有效保证数据报准确发送的同时又不产生过多冗余数据报,那么重复发送的次数的确定就成为问题的关键。以下给出一种确定上位机重发次数的方法。关键词:ARM;Linux;交叉编译环境;UDP 协议;重发机制;重发次
2、数 UDP 协议以其高效性和应用的简单,被广泛运用于嵌入式络开发中。由于 UDP 协议的应用简单,在嵌入式设备开发过程中,络的利用率并不高。以下将介绍一个 UDP 具体项目实验过程,描述 ARMLinux 环境的软硬件环境构建过程,并对 UDP 协议下一种重发模式中上位机的重发次数的确定提出一种可行的方法。1 研究背景随着嵌入式技术的快速发展,嵌入式设备已经在许多领域取代了传统的微型机设备。本文的选题主要来自于实习期间承接的一项改造项目:某院校特长生评分系统的改精品文档2016 全新精品资料-全新公文范文 -全程指导写作 独家原创 2 / 8造。项目改造目的有:1) 保留原上位机。2) 改用手
3、持式客户端进行显示及评分操作。3)保留原有络设备。针对要求,我们使用 S3C2440 作为硬件平台,移植 Linux 操作系统,并在 ARMLinux 环境下研究了 UDP 协议的通信过程,进行了上位机与嵌入式系统的 UDP 协议通信实验及分析,并给出一种重发机制中的发送次数求法。2 硬件平台介绍S3C2440 处理速度达到了 400MHZ,具有较高的性价比。为了提高开发效率,我们采用公司自行研制开发的ETS3C2440 开发板。2.1 ETS3C2440 开发板简介ETS3C2440 是公司自行开发的一款 ARM9 架构的实验开发板,其结构框图如图 1。核心板的主要器件有:32MB2 片 S
4、DRAM,64MB NORFLASH,512MB NANDFLASH。设计了启动方式可选,通过开关选择从 Nandflash 或 Norflash 启动。2.2 实验相关电路说明底板电路主要功能是输入输出以及络通讯功能。按键输入部分采用扫描方式获得输入,用一个单向地址锁存器和一个双向地址锁存器与地址总线相连,可以通过扫描地址来获得按键输入。LCD 采用三星的 3.5 寸 TFT 屏作为显示输出设备。卡芯片选用的是与原设备匹配的 10M 的精品文档2016 全新精品资料-全新公文范文 -全程指导写作 独家原创 3 / 8CS8900A,关于 CS8900A 与 S3C2440 的硬件连接,有众多
5、可供参考,本文不再赘述。3 系统软件平台的构建硬件平台搭建完毕后要将操作系统和应用程序在硬件平台上运行起来。以下是对嵌入式 Linux 操作系统移植的过程。3.1 交叉编译环境的构建Linux 2.6.29.1 版本的内核可以登录到下载。本文选择的是 armlinuxgcc4.3.2 工具链()在宿主机上进入 Linux 系统,切换当前目录到工具链所在目录,新建一个 arm 目录保存解压后的文件(mkdir /user/local/arm)并将 armlinuxgcc4.3.2 解压到这个目录中(tar jxvf armlinuxgcc4.3.2 C /user/local/arm)。然后将环
6、境变量 PATH 修改一下,让 PATH 中包含有armlinuxgcc 所在的目录(编辑/etc/profile 添加语句”export PATH=/user/local/arm/4.3.2/bin:PATH”),然后reboot 一下,这样交叉编译环境就构建好了。3.2 BOOTLOADER 的移植vivi 是一款相当成熟和相对简单的常用 bootloader,我们以 vivi 为移植原型,将 S3C2440 所有 IO 端口寄存器定义添加到头文件 2440add.inc,删除部分硬件平台使用不到的代码,最后将修改过的 vivi 制作成镜像烧录到 flash精品文档2016 全新精品资料-
7、全新公文范文 -全程指导写作 独家原创 4 / 8中。13.3 Linux 内核移植获取 Linux2.6.29.1 源代码并解压后,首先修改内核源代码所在目录中的 Makefile,将系统架构修改为Arm(ARCH ?=arm ),交叉编译工具修改为 armlinuxgcc (CROSS_COMPILE ?=armlinux),修改输入时钟(arch/arm/machs3c2440/machsmdk2440.c 中的函数 static void _init smdk2440_map_io 中,修改s3c24xx_init_clocks(12000000)此处所用晶振为 12M)。修改 mac
8、hine 名称(在arch/arm/machs3c2440/machsmdk2440.c 文件中的函数MACHINE_START( ),修改为 MACHINE_START(S3C2440, “自定义机器名”),修改 NANDflash 分区信息(arch/arm/plats3c24xx/commonsmdk.c 结构体 static struct mtd_partition smdk_default_nand_part中保存的是 nandflah 的分区信息,将其修改为当前使用的分区信息),然后修改 nandflash 的匹配时间(3c2410_platform_nand_smdk_nand_
9、info smdk_nand_info =)。上述内核源代码修改完成后,还需要对一些设备的驱动进行修改。本文使用的 NEC 3.5 寸 320240 液晶屏,硬件平台使用 GPG4 脚进行背光控制,需精品文档2016 全新精品资料-全新公文范文 -全程指导写作 独家原创 5 / 8要修改 LCD 背光(/arch/arm/machs3c2440/machsmdk2440.c中 static void _init smdk2440_machine_init(void),将函数中的 GPIO 口配置为 GPG4)。关于 CS8900A 卡的驱动移植,相关很丰富,本文也不再赘述。本实验中 nandf
10、lash 采用的是 yaffs2 文件系统,所以打 yaffs2 文件系统补丁,压缩包为 cvsroot.tar.gz。至此,Linux 的内核源代码修改工作完成了,下面还需要利用 Makefile,进行内核配置。在 Linux 2.6.29.1 内核目录下首先 make s3c2410_defconfig 使用 2410 的配置模板来配置 2440;然后 make menuconfig,这时我们可以在图形化界面中,空格键可改变各个配置选项的被选中状态,根据需要进行配置即可。配置完成后保存好配置,最后进行内核的编译(make dep 建立文件间依赖 make clean 清除编译残留文件 ma
11、ke zImage 生成内核压缩镜像文件)。编译过程完成后会在内核目录 arch/arm/boot/下生成zImage 内核映像文件,将这个镜像文件烧录到 flash 中,调试检验,经上述修改后的内核工作运行正常。3.4 根文件系统的制作根文件系统是使用 busybox1.13.3 来制作完成。下载busybox 并解压完成后,修改 Makefile 中的架构为 ARM 架构,编译工具为 armlinuxgcc( ARCH ?=arm; 精品文档2016 全新精品资料-全新公文范文 -全程指导写作 独家原创 6 / 8CROSS_COMPILE ?=armlinux),然后 Make menu
12、config,通过图形界面对 busybox 进行配置,然后对 busybox 进行编译(make CONFIG_PREFIX=/opt/studyarm/rootfs install),在目标目录下会生成目录 bin、sbin、usr 和文件 linuxrc的内容。基本目录结构生成后,应该在目标目录下建立一些未生成的必要的系统目录如 dev、etc、lib 等,并通过 chmod命令改变目录权限为可写。再将一些必要的动态链接库和静态库拷贝到 lib 下,然后在 dev 目录下创建设备节点,最后创建该嵌入式 Linux 系统的初始化配置文件(包括设备列表文件、口令、络分组组名、HOSTNAME
13、 主机名、etc/inittab 初始化表单、etc/profile 环境变量配置文件、用于系统初始化的.bash 脚本文件等)。由于本实验需对络编程,要求自动初始化 CS8900A 卡芯片的 IP 地址、关、子掩码等,所以在开机自启动脚本中加入 ifconfig 语句,使得开机时自动配置卡参数。根文件系统构建完成后,使用 yaffs2 文件系统制作工具 mkyaffs2image.tgz,通过命令 mkyaffs2image rootfs rootfs.img 生成根文件系统镜像,然后将镜像烧写入flash 中。4 ARMLinux 环境下的 UDP 协议通信实验经过上述硬件设计和操作系统移
14、植过程,本文所使用精品文档2016 全新精品资料-全新公文范文 -全程指导写作 独家原创 7 / 8到的实验环境已经构建完毕,经反复调试修改,嵌入式Linux 操作系统在平台下运行正常,于是进行 UDP 协议通信实验。4.1 UDP 协议套接字编程基础UDP 是一个面向数据报和无连接的简单传输层协议,它不像 TCP 那样通过握手过程建立服务器与客户端的连接才可以工作。在络通信质量较好的情况下,UDP 体现出高效率,这适合于传送少量报文的应用。 linux 系统是通过套接字结构来进行络编程的,应用程序通过对套接字的几个函数调用,会返回一个用于通信的套接字描述符,而 Linux 应用程序在进行任何
15、形式的 I/O 操作时,程序实际上是在读写一个文件描述符。因此 Linux 下的套接字编程,可以看成是对普通文件描述符的操作,这些操作与被使用的硬件平台无关,这是 linux 设备无关性的优点。UDP 协议的通信模型如图 3 所示。在上述流程中,客户端所收到的报文被存储在缓冲区中,recvfrom()函数返回了报文存储缓冲区的首地址,我们可以很方便地对这个首地址进行数组操作,从而实现对报文的解码。4.2 上位机报文结构及重发机制分析根据项目要求,上位机软件依然保留,我们使用协议嗅探工具对上位机发送的报文进行了嗅探,得到了上位机精品文档2016 全新精品资料-全新公文范文 -全程指导写作 独家原创 8 / 8报文的结构如表 1 所示。表 1 上位机报文结构上位机发出的每条报文由 32 个字节组成,第 0 位为版本信息