《嵌入式操作系统》实验报告文档格式.docx
《《嵌入式操作系统》实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《《嵌入式操作系统》实验报告文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
staticinthello_init(void)
{
printk(KERN_ALERT"
##############Hello,world############\n"
return0;
}
//驱动程序出口函数
staticvoidhello_exit(void)
###############Goodbye,world#########\n"
module_init(hello_init);
module_exit(hello_exit);
有关驱动程序的编写规,请参考课程教材,本实验只在编写简单的驱动(核)程序并加入到Linux核目录树中,使用户熟悉编译核的过程。
该驱动程序是向终端输出相关程序信息。
编写好helloworld.c后将其拷贝到核源码树的drivers/char/目录下。
[rootlocalhost/]#cphelloworld.c/UP-Magic210/SRC/kernel/linux-2.6.35.7/drivers/char/
(2)、进入实验核源码目录修改driver/char/目录下的Kconfig文件,按照Kconfig语法添加helloworld程序的菜单支持
[rootlocalhost/]#cdUP-Magic210/SRC/kernel/linux-2.6.35.7/
[rootlocalhostlinux-2.6.35.7]#vidrivers/char/Kconfig
例如:
在Kconfig文件中的source“driver/char/hw_random/Kconfig”下面添加如下:
source“driver/char/hw_random/Kconfig”
configHELLO_MODULE
bool"
HelloWorldTest"
dependsonCPU_S5PV210
help
ThisisademototestkernelexperimentOnUP-Magic210.
(3)、进入实验核源码目录修改driver/char/目录下的Makefile文件,按照核中Makefile语法添加helloworld程序的编译支持
[rootlocalhostlinux-2.6.35.7]#vidrivers/char/Makefile
在Makefile中(大约在91行)添加如下一行
obj-$(CONFIG_TOSHIBA)+=toshiba.o
obj-$(CONFIG_I8K)+=i8k.o
obj-$(CONFIG_DS1620)+=ds1620.o
obj-$(CONFIG_HW_RANDOM)+=hw_random/
obj-$(CONFIG_HELLO_MODULE)+=helloworld.o
obj-$(CONFIG_PPDEV)+=ppdev.o
(4)、运行makemenuconfig配置核对helloworld程序的支持:
[rootlocalhostlinux-2.6.35.7]#makedistclean
[rootlocalhostlinux-2.6.35.7]#makemenuconfig
先加载核配置单,如图:
然后进入到DeviceDrivers--->
菜单中如图:
进入到Characterdevices--->
如图:
进入该菜单会发现[]HelloWorldTest选项,按下空格将其静态编译进核
退出保存核配置
(5)、重新编译核
在核源码的顶层目录下编译核
[rootlocalhostlinux-2.6.35.7]#make
scripts/kconfig/conf-sarch/arm/Kconfig
CHKinclude/linux/version.h
CHKinclude/generated/utsrelease.h
make[1]:
“include/generated/mach-types.h”是最新的。
CALLscripts/checksyscalls.sh
CHKinclude/generated/compile.h
CCdrivers/char/helloworld.o
LDdrivers/char/built-in.o
LDdrivers/built-in.o
LDvmlinux.o
MODPOSTvmlinux.o
初次编译核源码,由核代码庞大,所需较长时间(大约几分钟至10几分钟不等)。
编译成功后会在核源码目录的arch/arm/boot/目录下生成核压缩文件zImage。
[rootlocalhostlinux-2.6.35.7]#lsarch/arm/boot/zImage
arch/arm/boot/zImage
[rootlocalhostlinux-2.6.35.7]#
(6)、将新生成的核镜像文件zImage烧写到UP-Magic210型设备中,这里不在赘述(烧写步骤可以参考文档“UP-Magic210出厂程序烧写手册(LINUX)V1.0.pdf”第23页)。
新核烧写成功后启动UP-Magic210型系统,可以在串口终端中查看到Linux核在启动过程中打印出来的如下信息:
S3C_LCDclockgotenabled:
:
133.000Mhz
Window[0]-FB1:
map_video_memory:
clearff600000:
00096000
FB1:
dma=57100000cpu=ff600000size=00096000
Console:
switchingtocolourframebufferdevice80x30
fb-1069494052:
framebufferdevice
lp:
driverloadedbutnodevicesfound
###################Hello,world###################
ppdev:
user-spaceparallelportdriver
s3c-uart.0:
ttySAC0atMMIO0x7f005000(irq=37)isaS3C
s3c-uart.1:
ttySAC1atMMIO0x7f005400(irq=38)isaS3C
s3c-uart.2:
ttySAC2atMMIO0x7f005800(irq=39)isaS3C
RAMDISKdriverinitialized:
16RAMdisksof4096Ksize1024blocksize
loop:
loaded(max8devices)
nbd:
registereddeviceatmajor43
dm9000EthernetDriver
eth0:
dm9000atc7866000,c7866002IRQ78MAC:
00:
22:
12:
34:
56:
90
S3CIrDAdriver,(c)2006SamsungElectronics
Linuxvideocaptureinterface:
v2.00
可以看到在终端上打印出###################Hello,world###################信息。
同样进入ARM系统后也可以通过dmesg命令查看核启动信息。
[rootUP-TECHyaffs]#dmesg
4.实验结果
思考:
如何能在Linux系统启动时,输出显示自定义的文本信息,请修改Linux核启动代码,完成此功能。
5.实验中遇到的问题及解决方法
在实验中遇到一些问题,例如在复制的时候我记得原来用cp
–a
/tmp/linux-2.4.18-br.tar.gz
就可以了,可这次不行必须要用cp
./到自己的目录下。
不过最后都顺利解决了问题,在编译复习了makemenuconfig的编译配置。
实验二根文件系统实验
✧了解UP-Magic210魔法师实验套件Linux系统下根文件系统结构
✧掌握根文件系统的搭建过程
✧掌握busybox、mkcramfs等工具的使用方法
✧使用busybox生成文件系统中的命令部分,使用mkcramfs工具制作CRAMFS格式的根文件系统。
✧分析根文件系统etc目录下重要配置文件的格式及语法,熟悉根文件系统的启动过程
3.实验步骤
/UP-Magic210/SRC/rootfs/
一、在核中添加文件系统类型支持
(1)、进入宿主机中UP-Magic210型光盘核目录:
[rootlocalhost~]#cd/UP-Magic210/SRC/kernel/linux-2.6.35.7/
(2)、运行makemenuconfig命令配置核文件系统相关支持
添加对CRAMFS根文件以及YAFFS2文件系统系统支持
进入Filesystems--->
菜单
进入Miscellaneousfilesystems--->
选择<
*>
CompressedROMfilesystemsupport(cramfs)支持,如图:
YAFFS2filesystemsupport支持,配置如下图
退出保存核配置
运行make编译核,重新烧写核。
二、根文件系统的实现
(1)、制作BUSYBOX工具集
进入本次实验目录
[rootlocalhostrootfs]#cd/UP-Magic210/SRC/rootfs/
[rootlocalhostrootfs]#ls
bash-4.0.tar.bz2busybox-1.19.3.tar.bz2rootfs
解压busybox-1.19.3.tar.bz2压缩包
[rootlocalhostrootfs]#tarxjvfbusybox-1.19.3.tar.bz2
产生busybox-1.19.3目录
bash-4.0.tar.bz2busybox-1.19.3busybox-1.19.3.tar.bz2rootfs
进入busybox-1.19.3目录进行busybox的修改及配置
修改此目录的Makefile文件,更改ARCH?
和CROSS_COMPILE?
=宏定义,如下:
CROSS_COMPILE?
=arm-none-linux-gnueabi-
ARCH?
=arm
退出保存。
运行makemenuconfig对工具集进行定制
[rootlocalhostbusybox-1.19.3]#makemenuconfig
进入BusyboxSettings--->
选项
进入BusyboxLibraryTuning--->
选中[*]Fancyshellprompts支持
进入MiscellaneousUtilities--->
去除[]inotifyd选项
接下来的配置可以根据具体情况来设置或裁剪相关工具。
退出保存设置。
编译busybox
[rootlocalhostbusybox-1.19.3]#make
安装busybox
[rootlocalhostbusybox-1.19.3]#makeinstall
成功后会在当前目录下生成_install目录,编译的工具也都集成在该安装目录下。
[rootlocalhostbusybox-1.19.3]#cd_install/
[rootlocalhost_install]#ls
binlinuxrcsbinusr
[rootlocalhost_install]#
可以看到_install目录下生成了根文件系统常用的命令及工具,接下来的工作,用户可以根据需要将_install目录下生成的命令拷贝到根文件系统相应目录下。
将从busybox生成的which命令拷贝到根文件系统目录的usr/bin目录下,这样,我们的根文件系统就支持which命令了。
(2)、制作CRAMFS根文件系统镜像
实验中已经提供了mkcramfs制作工具以及mkrootfs.sh脚本文件,用户只需执行mkrootfs.sh脚本文件来使用mkcramfs制作根文件系统镜像即可。
当然也可以手动的执行命令:
./mkcramfsrootfs_up210rootfs_up210.cramfs
[rootlocalhostrootfs]#./mkrootfs.sh
此时在当前目录下生成根文件系统镜像文件rootfs_up210.cramfs
mkcramfsmkrootfs.shrootfs_up210rootfs_up210.cramfs
三、烧写根文件系统
将新生成的根文件系统镜像文件rootfs_up210.cramfs烧写到UP-Magic210型设备中进行测试,这里不在赘述(烧写步骤可以参考文档“UP-Magic210出厂程序烧写手册(LINUX)V1.0.pdf”第24页)。
如果用户新添加了相关命令或工具(例如which命令)启动系统后可以验证用户添加入的新命令或工具。
make编译有错误,进行源代码的修改。
之后再makemenuconfig中将这个宏对应的东西配置成没有就好了,如果没有这个宏,那么就直接用出错的那个文件的名字找就行了,找到后给它去掉,将来make的时候就不会编译这个文件了,在次进行make编译后,编译出来了busybox这个东西,就在证明编译通过了。
实验三模块方式驱动实验
✧学习在LINUX下进行驱动设计的原理
✧掌握使用模块方式进行驱动开发调试的过程
✧在PC机上编写简单的虚拟硬件驱动程序并进行调试,实验驱动的各个接口函数的实现,分析并理解驱动与应用程序的交互过程。
✧在ARM设备上创建设备驱动节点,编写用户空间应用程序,对驱动程序进行测试。
(1)、编译驱动程序/UP-Magic210/SRC/exp/driver/01_demo/demo.c,手工加载驱动程序,通过设备号建立驱动设备节点,执行应用程序测试该驱动及设备,分析驱动程序demo.c。
进入实验目录编译源程序
[rootlocalhost/]#cd/UP-Magic210/SRC/exp/driver/01_demo/
清除中间代码,重新编译
[rootlocalhost01_demo]#makeclean
[rootlocalhost01_demo]#make
当前目录下生成驱动程序demo.ko和应用测试程序test_demo。
启动UP-Magic210实验系统,连好网线、串口线。
通过串口终端挂载宿主机实验目录(注意:
虚拟机IP地址需要设置为:
192.168.12.157)。
[rootUP-TECHyaffs]#mount-tnfs-onolock192.168.12.157:
/UP-Magic210/mnt/nfs
进入串口终端的NFS共享实验目录
[rootUP-TECHyaffs]#cd/mnt/nfs/SRC/exp/driver/01_demo/
手动加载驱动程序demo.ko
[rootUP-TECH01_demo]#insmoddemo.ko
通过设备号建立驱动设备节点
[rootUP_21001_demo]#mknod/dev/democ2510
执行应用程序测试该驱动及设备,分析应用程序测试结果。
[rootUP-TECH01_demo]#./test_demo
(2)、请参考驱动程序demo.c,编写一个虚拟字符设备驱动程序并进行调试,该虚拟字符设备驱动程序完成如下功能:
◆在核模块初始化函数中,实现动态申请设备号并注册该设备,动态建立设备文件节点;
◆在核模块的退出函数中,实现设备注销,删除该设备文件节点;
◆实现file_operations设备驱动文件结构体中的open、read、write、ioctl和release函数功能,其中:
Ø
open函数:
设置一个计数器count,每调用一次open函数,计数器count加1。
read函数:
读取用户写入的字符串数据的排列结果。
write函数:
实现将用户写入的字符串数据,按照每个字符的ASCII值逆序或升序排序(根据开关值asc排序:
asc=0,逆序排序;
asc=1,升序排序;
)。
ioctl函数:
设置排序方式开关值asc。
release函数:
每调用一次release函数,计数器count减1。
5.实验中遇到的问题及解决方法。
没有修改makefile文件直接进行编译导致出错。
实验前没有认真阅读实验原理,看懂实验代码,所以在使用make命令以后无法实现。
最后在同学的帮助下找到了原因。
忽略了自己使用的是gcc编译而不是交叉编译,因而没有设置节点。
尝试了很多次以后才发现了问题,期间以为是test_demo文件的问题,但是导入导出很多次都没有解决,问了同学才找到了问题。
实验四LED驱动及控制实验
✧了解ARM设备外围电路结构与接口原理
✧熟悉Linux系统下硬件驱动编程
✧编程实现对嵌入式设备上LED灯的控制
✧阅读UP-Magic210平台硬件文档,熟悉ARM处理硬件外围接口电路
✧编程实现UP-Magic210平台设备上LED驱动及应用测试程序
编写UP-Magic210平台设备上LED驱动及应用测试程序并进行调试,该LED驱动程序完成如下功能:
◆实现file_operations设备驱动文件结构体中的ioctl函数,完成如下功能:
一次调用控制所有的LED亮或灭;
控制单个LED亮或灭;
实现流水灯显示,流水灯显示效果自行定义,流水灯循环显示次数由用户应用程序传入。
程序:
驱动程序分析:
linux/kernel.h>
linux/fs.h>
linux/miscdevice.h>
linux/delay.h>
asm/irq.h>
asm/arch/regs-gpio.h>
asm/hardware.h>
GPL"
#defineDEVICE_NAME"
leds"
//驱动名称
#defineDEVICE_MAJOR231//驱动主设备号
#defineDEVICE_MINOR0//驱动次设备号
//声明字符设备类结构
structc