基于LCD的电子时钟系统嵌入式课程设计.docx
- 文档编号:8440769
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:24
- 大小:98.35KB
基于LCD的电子时钟系统嵌入式课程设计.docx
《基于LCD的电子时钟系统嵌入式课程设计.docx》由会员分享,可在线阅读,更多相关《基于LCD的电子时钟系统嵌入式课程设计.docx(24页珍藏版)》请在冰豆网上搜索。
基于LCD的电子时钟系统嵌入式课程设计
目录
一、需求分析1
二、概要设计2
2.1开发环境2
2.2系统结构2
三、详细设计3
3.1ARMLinux的建立3
3.1.1建立交叉编译环境3
3.1.2生成并配置根文件系统5
3.2BootLoader的移植6
3.3基于S3CC400的嵌入式Web服务器Boa移植7
3.3.1配置开发板网络7
四.编码8
五.调试分析11
六.测试结果及运行效果12
6.1Boa服务器和cgic库移植12
6.2Web静态网页制作13
6.3CGI程序login.c程序。
13
七.系统开发所用到的技术16
一、需求分析
随着计算机迅猛发展,WWW的技术也有了突破性的进展,它解决了远程信息服务中的文字显示、数据连接以及图像传递的问题,使得WWW成为Internet上最为流行的信息传播方式。
现在,Web服务器成为Internet上最大的计算机群,Web文档之多、链接的网络之广,令人难以想象。
可以说,Web为Internet的普及迈出了开创性的-步,是近年来Internet上取得的最激动人心的成就。
在嵌入式Linux系统中,常用的WebServer有Boa、httpd、thttpd和mini-httpd等。
其中Boa是-个运行在类Unix系统中的小型WebServer,适合嵌入式环境。
在Boa中若两个用户同时访问,则其中的-个必须等待,它产生独立进程来处理CGI(通用网关接口)程序,因此占用较少的资源,其体系结构如图1所示。
Boa的优点在于其快速可靠性。
它与其它服务器的区别:
没有为CGI程序设置REMOTE_HOST环境变量;没有Server-SideInclude(SSI)项,要产生动态网页只能通过CGI:
没有设置进入控制,而是根据Linux的文件系统的权限来决定服务的对象:
没有chroot选项,即不能改变根目录。
二、概要设计
2.1开发环境
1 、虚拟机下安装的 Redhat9.0 ;
2 、交叉编译工具:
arm-linux-gcc- 4.3.2;
3 、 miin2440 开发板;
4 、移植使用到的软件:
(1) boa 源文件 boa-0.94.13.tar.gz ,下载地址:
http:
//www.boa.org/ ;
(2)cgi库cgic205.tar.gz ,
下载地址:
。
2.2系统结构
嵌入式系统组成框图
实物连接图
USB
交叉串口线
网
线
三、详细设计
3.1ARMLinux的建立
ARMLinux的建立是基于U-Boot的实现,它的建立实际上是Linux内核在S3C2440上移植的过程,主要分为3个步骤:
建立交叉编译环境;编译内核;生成并配置根文件系统。
3.1.1建立交叉编译环境
交叉编译的主要特征是某-机器(目标机)中执行的程序代码不是本机编译生成,而是另-台机器(宿主机)编译生成。
-般采用的方法是首先在宿主机上编写程序,通过交叉编译生成目标平台上可运行的二进制代码,再下载到目标平台的特定位置上运行。
本次设计的通信使用的RS3232串口,在RedHat9.0里面建立-个能编译arm-linux环境。
(1)添加工作用户
[root@PC-LINUX~]#useradd–Groot–groot–d/home/arm1arm
[root@PC-LINUX~]#mkdir–p/home/arm1
[root@PC-LINUX~]#chown–Rarm/home/arm1
[root@PC-LINUX~]#chmod–R775/home/arm1
(2)建立工作目录
[arm@PC-LINUXarm1]$mkdirdev_home
[arm@PC-LINUXarm1]$cddev_home
[arm@PC-LINUXdev_home]$mkdirbtoolskernel
(3)设置环境变量,准备源码及相关补丁。
首先是设置环境变量:
[arm@PC-LINUXarml]$vi~/.bashrc
exportPREFIX=/usr/local/arm/3.3.2
exportTARGET=arm-1inux
exportSYSROOT=${PREFIX)/sysroot
exportCROSS_COMPILE=${TARGET)-
exportPATH=${PREFIX)/bin:
$PATH
exportSRC=/home/arml/dev_home/btools/tchain3.3.2
接下来准备各个源码包。
从网上下载以下源码包:
binutils-2.16.tar.gz、
gcc-3.3.2.tar.bz2、glibc-2.3.5.tar.gz、linux-2.6.13.tar.gz。
(4)编译GNUbinutils。
重新以arm用户身份登录,让新设置的环境变量
起作用。
[arm@PC-LINUXarml]$SUarm
[arm@PC-LINUXarml]$cd${SRC)
[arm@PC-LINUXtchain3.3.2]$tarzxvfbinutils-2.16.tar.gz
[arm@PC-LINUXtchain3.3.2J$mkdir-pBUILD/binutils-2.16
[arm@PC-LINUXtchain3.3.2]$cdBUILD/binutils-2.16
[arm@PC-LINUXbinutils-2.16]$../../binutils-2.16/configure\
--prefix=${PREFIX)--target=${TARGET)--with--sysroot=${SYSROOT)
[arm@PC-LINUXbinutils-2.16]$make
[arm@PC-LINUXbinutils-2.16]$SUroot
[arm@PC-LINUXbinutils-2.16]#makeinstal1
[arm@PC-LINUXbinutils-2.16]#exit
(5)使用当前平台的gcc编译内核头文件。
[arm@PC-LINUXtchain3.3.2]$cd${KERNEL)
[arm@PC-LINUXkernel]$tarzxvf1inux-2.6.14.1.tar.gz
[arm@PC-LINUXkernel]$cd1inux-2.6.14.1
[arm@PC-LINUXsince-2.6.14.1]$cparch/arm/configs/smdk2410_defconf\ig.config
[arm@PC-LINUXlinux-2.6.14.11$makeARCH:
armmenuconfig
[arm@PC-LINUXlinux-2.6.14.1]$makeinclude/1inux/version.H
3.1.2生成并配置根文件系统
生成并配置文件系统主要有以下的几个步骤完成:
安装busybox工具包;创建文件系统的映象文件:
配置文件系统。
-个完整的根文件系统包含以下几个目录:
/bin,应用程序存放目录。
几乎所有的应用程序都存放于此。
比如1s等,
包括功能强大的命令工具集busybox。
/sbin,系统管理员服务程序,其中最重要的就是供内核初始化之后执行
的/sbin/init进程。
/1ib,存放程序运行所需要的动态库。
/proc,系统状态文件目录。
这是用来显示系统状态且真正意义上的虚拟文件系统,目录下的所有文件其实就是“控制面板”才能看到的系统状态信息,可以使用cat命令来显示相应硬件配置及状态信息。
所以这是Linux的“控制面板”。
/dev,驱动程序存放目录。
在cramfs文件系统中这是-个空目录,在内核运行后由内核devfs作为安装目录,才产生所有项目,所以实际为空目录。
已经编译到内核中的设备驱动程序都将存放于该目录下,包括动态加载的模块驱动也存放于此。
/etc,系统配置文件及用户数据存放目录。
/mnt,用于设备安装的目录,通常包含etc子目录和为块设备安装保留目录。
其中,etc子目录中包含Linux内核启动时挂载到ramfs文件系统/etc下的所有内容。
/usr,用于存放用户程序和配置文件的目录,可以根据需要进行设置。
(1)cramfs文件系统的创建。
<1>建立-个目录:
#mkdirrootfs,作为放置根文件系统的目录,并根据cramfs文件系统结构分别建立目录结构,
#mkdirbinsbindevetcproclibusrmnt
<2>编译BusyBox。
BusyBox是-个著名的开源项目,它是许多嵌入式Linux系统的基石,它用-个极小型的应用程序来提供上述位于/bin和/sbin中的整个命令集的功能,
它还支持动态和静态方式链接glibc,允许根据需要修改缺省配置,选中或移除所包含的命令。
Busybox提供的配置界面与Linux菜单配置界面非常相似。
首先要到网站下载busybox源代码,busybox-1.0.0.tar.gz;并解压源文
件包:
#tarzxvfbusybox-I.0.0.tar.gz;建立-个符号链接并进入目录:
#In-sbusybox-1.0.0busybox
#cdbusybox
交叉编译器路径设为:
/opt/host/armv41/bin/armv4-unknown-1inux-,
移植平台为:
ARCH=arm。
保存退出。
交叉编译busybox:
#makea11
#makeinstall
将生成的命令拷贝到上面建立的相应目录中。
#cp-a/bin/*/rootfs/bin
#cp-a/sbin/*/rootfs/sbin
<3>复制应用程序运行时所需要的库至/1ib下,库文件可以从PC机上的交叉编辑工具安装目录下复制。
<4>在Linux中根据需要建立相应文件的快捷方式,如在rootfs下建立tmp和var快捷方式到/mnt/etc/tmp和/mnt/etc/var文件夹,这样就可以使
用/tmp和/var访问ramfs的空间。
3.2BootLoader的移植
BootLoader就是在操作系统内核运行之前运行的-段小程序。
通过这段小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到-个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
从操作系统的角度BootLoader的总目标就是正确地调用内核来执行。
在本Web服务器开发中使用的BootLoader是U-Boot(源代码可以在网上下载)。
3.3基于S3CC400的嵌入式Web服务器Boa移植
3.3.1配置开发板网络
在移植嵌入式Web服务器boa之前需要在根文件系统中配置网络,我的根文件系统目录是/opt/rootfs,这里设置我的IP地址为192.168.1.112
<1>rootfs/etc中添加resolv.conf文件
nameserver192.168.1.1
该文件存放在DNS信息
<2>rootfs/etc中添加net.conf文件
IPADDR=192.168.1.123
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
MAC=10:
23:
45:
67:
89:
ab
<3>在rootfs/etc/rc.d/init.d目录下添加httpd文件
#!
/bin/sh
base=boa
#Seehowwewerecalled.
case"$1"in
start) /usr/sbin/$bas ;;
stop)
pid=`/bin/pidof$base`
if[-n"$pid"];
then kill-9$pid
fi ;;
esac
exit0
使用命令chmod+xhttpd改变文件属性,该文件为boa服务器的代理。
<4>在根文件中sbin目录下添加文件net_set
#!
/bin/sh
echoTrytobringeth0interfaceup...>/dev/ttySAC0
if[-f/etc/net.conf];then
source/etc/net.conf
ifconfigeth0down
ifconfigeth0hwether$MAC
echoifconfigeth0hwether$MAC>/dev/ttySAC0
ifconfigeth0$IPADDRnetmask$NETMASKup
echoifconfigeth0$IPADDRnetmask$NETMASKup>/dev/ttySAC0
routeadddefaultgw$GATEWAY
echoadddefaultgw$GATEWAY>/dev/ttySAC0
else
ifconfigeth0hwether10:
23:
45:
67:
89:
ab
ifconfigeth0192.168.1.123netmask255.255.255.0up
routeadddefaultgw192.168.1.1
echoifconfigeth0hwether10:
23:
45:
67:
89:
ab>/dev/ttySAC0
echoifconfigeth0192.168.1.123netmask255.255.255.0up>/dev/ttySAC0
echorouteadddefaultgw192.168.1.1>/dev/ttySAC0
fi
echoDone>/dev/ttySAC0
通过命令chmod+xnet_set改变该文件属性具有可执行。
四.编码
在交叉编译内核之前,首先对编译选项的配置,linux内核配置命令:
makemenuconfig,然后再编译内核。
(1)修改makefile文件修改内核项层目录下的Makefile,指明目标平台及交叉编译器:
#viMakefile
找到ARCH和CROSS_COMPILE,修改:
ARCH?
=arm
CROSS-COMPILE?
=arm-linux-
(2)设置flash分区
主要是修改mtd分区,drivers/mtd/maps/cfi-flagadm.c文件是关于Nor
Flash分区的代码,针对本文使用的目标板的NorFlash分区情况,修改其中
关于NorFlash分区的那部分代码,修改后的那部分代码如下:
#defineFLASH-PHYS_ADDROx00000000/*第-块NorFlashAM29LVl60DB的
物理起始地址:
*/
#defineFLASH_SIZEOx00200000/*AM29LVl60DB的大小*/
#defineFLASH_PARTITIONO_ADDR0x00000000/*U-Boot的mtd分区*/
#defineFLASH_PARTITIONO_SIZE0x00020000
#defineFLASH_PARTITIONI_ADDROx00020000/*木内核参数的mtd分区*/
#defineFLASH_PARTITIONl_SIZEOx00010000
#defineFLASH_PARTITION2_ADDROx00030000/*内核的mtd分区*/
#defineFLASH_PARTITION2SIZEOx001D0000
structmap_infoflagadm_map={
.name=”FlagaDMflashdevice;AM29LVl60DB-PC_LIMNUX”,
.size=FLASH_SIZE。
.bankwidth=2,
);
structmtd_partitionflagadm_parts[]=(
{
.name“Bootloader”,
.offset=FLASH_PARTITIONO_ADDR,
.size=FLASH_PARTITIONO_SIZE
};
{
.name=”zhj-param”,
.offset:
FLASH_PARTITIONl_ADDR,
.size=FLASH_PARTITIONl_sIZE
);
{
.name=”zhj-kernel”,
.offset=FLASH-PARTITION2_ADDR,
.size=FLASH-PARTITION2-SIZE
}
};
同时修改该子目录下的Makefile文件里生成目标文件的条件:
把obj-$(CONFIG_MTD_CFI_FLAGADM)+=cfi_flagadm.O改为obj-y+=
Cfi_flagadm.o,即无条件生成目标文件,加进内核。
以上只是-块NorFlash(AM29LVl60DB)的mtd分区修改过程,由于移植过程要用到开发板的两块NorFlash,所以还需要探测另外-块StrataFlash(E28F128J3),首先模仿文件cfi_flagadm.c在drivers/mtd/maps/目录下建立cfi-flagint.C,然后修改Makefile,在obj-y+=cfi_flagadm.o下面加上obj-y+=cfi_flagint.o,即把它也无条件加进内核。
其中cfi_flagint.C的StrataFlash(E28F128J3)mtd分区部分代码如下:
#defineFLASH_PHYS_ADDROx08000000/*第二块NorFlashE28F128J3的物理起始地址*/
#defineFLASH_SIZEOxl000000/*E28F128J3的大小*/
#defineFLASH_PARTITION3_ADDROx00000000/*保留区*/
#defineFLASH_PARTITION3_SIZEOx00040000
#defineFLASH_PARTITION4_ADDROx00040000/*文件系统的mtd分区*/
#defineFLASHPARTITION4_SIZEOxOOFC0000
structmap_infoflagint_map={
.name=”strataflashdeviceE28F128J3”,
.size=FLASH_SIZE,
.bankwidth=2,
};
structmtd_partitionflagint_parts[]={
{
.name=”PC_LINUX-unused”,
.offset=FLASH_PARTITION3_ADDR,
.size=FLASHPARTITION3SIZE
};
{
.name=”PC_LINUX-rootfs”,
.offset=FLASH_PARTITION4_ADDR,
.size=FLASH_PARTITION4_SIZE
}
};
(3)配置内核
支持启动时挂载devfs。
为了使内核支持devfs以及在启动时并在/sbin/init运行之前能自动挂载/dev为devfs文件系统,修改fs/Kconfig文件。
在文件中找到menu”Pseudofilesystems”,添加如下语句:
configDEVFS_FS
bool”/devfilesystemsupport(OBSOLETE)’
defaultY
configDEVFS_MOUNT
bool”Automaticallymountatboot”
defaulty
dependsonDEVFS_FS
五.调试分析
<1>在board子目录中建立S3C2440,并且将smdk2410下的相关文件复制到S3C2410目录下。
具体命令如下:
#mkdirboard/S3C2440
#cp-rfboard/smdk2440board/S3C2440
#mvboard/S3C24400/S3C2440.Cboard/S3C2440/S3C2440.C
#cpinclude/configs/smdk2410.hinclude/configs/S3C2440.h
修改board/S3C2440/Makefile文件,将其中的smdk2440.o改为S3C2440.o。
<2>修改项层Makefile文件。
项层Makefile文件负责U-Boot整体配置编译。
每-种开发板在Makefile都需要有板子配置的定义。
例如smdk2440开发板的定义如下:
smdk2440_config:
unconfig
@./mkconfigs$(@:
_config=)armarm920tsmdk2440NULLs3c24xO
各项的意思如下:
arm:
CPU的架构(ARCH);
arm920t:
CPU的类型(CPU),其对应于cpu/arm920t子目录;
smdk2440:
开发板的型号(BoARD),对应于board/smdk2440目录;
NULL:
开发商或经销商(vender);
s3c24xO:
片上系统(SOC)。
模仿上述开发板的定义,对开发板s3c2440进行定义,在smdk2440_config的附近添加:
s3c2440-config:
unconfig
@./mkconfigs$(@:
_config=)armarm920ts3c2440NULLs3c24xO
这样,执行配置U-Boot的命令makes3c2440_config,通过./mkconfig\脚本生成include
/config.mk的配置文件。
文件内容正是根据Makefile对开发板的配置生成的。
ARCH=arm
CPU=arm920t
BOARD=s3c2440
SOC=s3c24xO
<3>修改common/cmd-boot.C。
如果内核不是uImage,则下载后,U-Boot没有传递参
数给内核,所以启动时会有
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 LCD 电子 时钟 系统 嵌入式 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)