《《嵌入式操作系统》实验报告.pdf》由会员分享,可在线阅读,更多相关《《嵌入式操作系统》实验报告.pdf(32页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、嵌入式操作系统实验报告班级计算机学号姓名指导教师庄旭菲工 业 大 学 信 息 工 程 学 院 计 算 机 系2018 年 6 月实验一 Linux核移植与编译实验1.实验目的了解Linux 核相关知识与核结构了解Linux 核在ARM 设备上移植的基本步骤和方法掌握Linux 核裁剪与定制的基本方法2.实验容分析Linux 核的基本结构,了解Linux 核在ARM 设备上移植的一些基本步骤及常识。学习Linux 核裁剪定制的基本配置方法,利用UP-Magic210 型设备配套Linux 核进行自定义功能(如 helloworld 显示)的添加,并重新编译核源码,生成核压缩文件zImage,下载
2、到UP-Magic210 型设备中测试。3.实验步骤实验目录:/UP-Magic210/SRC/kernel/linux-2.6.35.7/编译核:在宿主机端为UP-Magic210 设备的 Linux 2.6.35.7 核编写简单的测试驱动(核)程序 helloworld.c 并修改核目录中相关文件,添加对测试驱动程序的支持。(1)、使用vim 编辑器手动编写实验代码helloworld.c helloworld.c 如如下:#include#include MODULE_LICENSE(Dual BSD/GPL);/驱动程序入口函数static int hello_init(void)pr
3、intk(KERN_ALERT#Hello,world#n);return 0;/驱动程序出口函数static void hello_exit(void)printk(KERN_ALERT#Goodbye,world#n);module_init(hello_init);module_exit(hello_exit);有关驱动程序的编写规,请参考课程教材,本实验只在编写简单的驱动(核)程序并加入到 Linux 核目录树中,使用户熟悉编译核的过程。该驱动程序是向终端输出相关程序信息。编写好helloworld.c 后将其拷贝到核源码树的drivers/char/目录下。rootlocalhost
4、/#cp helloworld.c/UP-Magic210/SRC/kernel/linux-2.6.35.7/drivers/char/(2)、进入实验核源码目录修改driver/char/目录下的Kconfig 文件,按照Kconfig 语法添加helloworld 程序的菜单支持rootlocalhost/#cd UP-Magic210/SRC/kernel/linux-2.6.35.7/rootlocalhost linux-2.6.35.7#vi drivers/char/Kconfig 例如:在Kconfig 文件中的source“driver/char/hw_random/Kco
5、nfig”下面添加如下:source“driver/char/hw_random/Kconfig”config HELLO_MODULE bool Hello World Test depends on CPU_S5PV210 help This is a demo to test kernel experiment On UP-Magic210.(3)、进入实验核源码目录修改driver/char/目录下的Makefile 文件,按照核中Makefile 语法添加helloworld 程序的编译支持rootlocalhost linux-2.6.35.7#vi drivers/char/Ma
6、kefile 在 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)、运行make menuconfig 配置核对helloworld 程序的支持:rootlocalhost linux-2.6.35.7#m
7、ake distclean rootlocalhost linux-2.6.35.7#make menuconfig 先加载核配置单,如图:然后进入到Device Drivers-菜单中如图:进入到Character devices-如图:进入该菜单会发现 Hello World Test 选项,按下空格将其静态编译进核退出保存核配置(5)、重新编译核在核源码的顶层目录下编译核rootlocalhost linux-2.6.35.7#make scripts/kconfig/conf-s arch/arm/Kconfig CHK include/linux/version.h CHK incl
8、ude/generated/utsrelease.h make1:“include/generated/mach-types.h”是最新的。CALL scripts/checksyscalls.sh CHK include/generated/compile.h CC drivers/char/helloworld.o LD drivers/char/built-in.o LD drivers/built-in.o LD vmlinux.o MODPOST vmlinux.o 初次编译核源码,由核代码庞大,所需较长时间(大约几分钟至10 几分钟不等)。编译成功后会在核源码目录的arch/arm
9、/boot/目录下生成核压缩文件zImage。rootlocalhost linux-2.6.35.7#ls arch/arm/boot/zImage arch/arm/boot/zImage rootlocalhost linux-2.6.35.7#(6)、将新生成的核镜像文件zImage 烧写到UP-Magic210 型设备中,这里不在赘述(烧写步骤可以参考文档“UP-Magic210 出厂程序烧写手册(LINUX)V1.0.pdf”第 23 页)。新核烧写成功后启动UP-Magic210 型系统,可以在串口终端中查看到Linux 核在启动过程中打印出来的如下信息:S3C_LCD cloc
10、k got enabled:133.000 Mhz Window0-FB1:map_video_memory:clear ff600000:00096000 FB1:map_video_memory:dma=57100000 cpu=ff600000 size=00096000 Console:switching to colour frame buffer device 80 x30 fb-1069494052:frame buffer device lp:driver loaded but no devices found#Hello,world#ppdev:user-space para
11、llel port driver s3c-uart.0:ttySAC0 at MMIO 0 x7f005000(irq=37)is a S3C s3c-uart.1:ttySAC1 at MMIO 0 x7f005400(irq=38)is a S3C s3c-uart.2:ttySAC2 at MMIO 0 x7f005800(irq=39)is a S3C RAMDISK driver initialized:16 RAM disks of 4096K size 1024 blocksize loop:loaded(max 8 devices)nbd:registered device a
12、t major 43 dm9000 Ethernet Driver eth0:dm9000 at c7866000,c7866002 IRQ 78 MAC:00:22:12:34:56:90 S3C IrDA driver,(c)2006 Samsung Electronics Linux video capture interface:v2.00 可以看到在终端上打印出#Hello,world#信息。同样进入ARM 系统后也可以通过dmesg 命令查看核启动信息。rootUP-TECH yaffs#dmesg S3C_LCD clock got enabled:133.000 Mhz Win
13、dow0-FB1:map_video_memory:clear ff600000:00096000 FB1:map_video_memory:dma=57100000 cpu=ff600000 size=00096000 Console:switching to colour frame buffer device 80 x30 fb-1069494052:frame buffer device lp:driver loaded but no devices found#Hello,world#ppdev:user-space parallel port driver s3c-uart.0:t
14、tySAC0 at MMIO 0 x7f005000(irq=37)is a S3C s3c-uart.1:ttySAC1 at MMIO 0 x7f005400(irq=38)is a S3C s3c-uart.2:ttySAC2 at MMIO 0 x7f005800(irq=39)is a S3C RAMDISK driver initialized:16 RAM disks of 4096K size 1024 blocksize 4.实验结果思考:如何能在 Linux 系统启动时,输出显示自定义的文本信息,请修改 Linux 核启动代码,完成此功能。5.实验中遇到的问题及解决方法在
15、实 验 中 遇 到 一 些 问 题,例 如 在 复 制 的 时 候 我 记 得 原 来 用cp a /tmp/linux-2.4.18-br.tar.gz 就可以了,可这次不行必须要用cp a /tmp/linux-2.4.18-br.tar.gz ./到自己的目录下。不过最后都顺利解决了问题,在编译复习了make menuconfig 的编译配置。实验二根文件系统实验1.实验目的了解UP-Magic210 魔法师实验套件Linux 系统下根文件系统结构掌握根文件系统的搭建过程掌握busybox、mkcramfs 等工具的使用方法2.实验容使用busybox 生成文件系统中的命令部分,使用 m
16、kcramfs 工具制作CRAMFS 格式的根文件系统。分析根文件系统etc 目录下重要配置文件的格式及语法,熟悉根文件系统的启动过程3实验步骤实验目录:/UP-Magic210/SRC/kernel/linux-2.6.35.7/UP-Magic210/SRC/rootfs/一、在核中添加文件系统类型支持(1)、进入宿主机中UP-Magic210 型光盘核目录:rootlocalhost#cd/UP-Magic210/SRC/kernel/linux-2.6.35.7/(2)、运行make menuconfig 命令配置核文件系统相关支持添加对CRAMFS 根文件以及YAFFS2 文件系统系
17、统支持进入 File systems-菜单进入Miscellaneous filesystems-菜单选择 Compressed ROM file system support(cramfs)支持,如图:选择 YAFFS2 file system support 支持,配置如下图退出保存核配置运行 make 编译核,重新烧写核。二、根文件系统的实现(1)、制作BUSYBOX 工具集进入本次实验目录rootlocalhost rootfs#cd/UP-Magic210/SRC/rootfs/rootlocalhost rootfs#ls bash-4.0.tar.bz2 busybox-1.19
18、.3.tar.bz2 rootfs 解压busybox-1.19.3.tar.bz2 压缩包rootlocalhost rootfs#tar xjvf busybox-1.19.3.tar.bz2 产生busybox-1.19.3 目录rootlocalhost rootfs#ls bash-4.0.tar.bz2 busybox-1.19.3 busybox-1.19.3.tar.bz2 rootfs 进入busybox-1.19.3 目录进行busybox 的修改及配置修改此目录的Makefile 文件,更改ARCH?和 CROSS_COMPILE?=宏定义,如下:CROSS_COMPIL
19、E?=arm-none-linux-gnueabi-ARCH?=arm 退出保存。运行make menuconfig 对工具集进行定制rootlocalhost busybox-1.19.3#make menuconfig 进入 Busybox Settings-选项进入 Busybox Library Tuning-选项选中*Fancy shell prompts 支持进入Miscellaneous Utilities-选项去除 inotifyd 选项接下来的配置可以根据具体情况来设置或裁剪相关工具。退出保存设置。编译busybox rootlocalhost busybox-1.19.3#
20、make 安装busybox rootlocalhost busybox-1.19.3#make install 成功后会在当前目录下生成_install 目录,编译的工具也都集成在该安装目录下。rootlocalhost busybox-1.19.3#cd _install/rootlocalhost _install#ls bin linuxrc sbin usr rootlocalhost _install#可以看到 _install 目录下生成了根文件系统常用的命令及工具,接下来的工作,用户可以根据需要将 _install 目录下生成的命令拷贝到根文件系统相应目录下。例如:将从busy
21、box 生成的which 命令拷贝到根文件系统目录的usr/bin 目录下,这样,我们的根文件系统就支持which 命令了。(2)、制作CRAMFS 根文件系统镜像实验中已经提供了mkcramfs 制作工具以及mkrootfs.sh 脚本文件,用户只需执行mkrootfs.sh 脚本文件来使用mkcramfs 制作根文件系统镜像即可。当然也可以手动的执行命令:./mkcramfs rootfs_up210 rootfs_up210.cramfs rootlocalhost rootfs#./mkrootfs.sh 此时在当前目录下生成根文件系统镜像文件rootfs_up210.cramfs r
22、ootlocalhost rootfs#ls mkcramfs mkrootfs.sh rootfs_up210 rootfs_up210.cramfs 三、烧写根文件系统将新生成的根文件系统镜像文件rootfs_up210.cramfs烧写到UP-Magic210 型设备中进行 测 试,这 里 不 在 赘 述(烧 写 步 骤 可 以 参 考 文 档“UP-Magic210出 厂 程 序 烧 写 手 册(LINUX)V1.0.pdf”第 24 页)。如果用户新添加了相关命令或工具(例如which 命令)启动系统后可以验证用户添加入的新命令或工具。4.实验结果5.实验中遇到的问题及解决方法mak
23、e 编译有错误,进行源代码的修改。之后再make menuconfig中将这个宏对应的东西配置成没有就好了,如果没有这个宏,那么就直接用出错的那个文件的名字找就行了,找到后给它去掉,将来make 的时候就不会编译这个文件了,在次进行make 编译后,编译出来了busybox 这个东西,就在证明编译通过了。实验三模块方式驱动实验1.实验目的学习在LINUX 下进行驱动设计的原理掌握使用模块方式进行驱动开发调试的过程2.实验容在 PC 机上编写简单的虚拟硬件驱动程序并进行调试,实验驱动的各个接口函数的实现,分析并理解驱动与应用程序的交互过程。在 ARM 设备上创建设备驱动节点,编写用户空间应用程序
24、,对驱动程序进行测试。3.实验步骤(1)、编译驱动程序/UP-Magic210/SRC/exp/driver/01_demo/demo.c,手工加载驱动程序,通过设备号建立驱动设备节点,执行应用程序测试该驱动及设备,分析驱动程序demo.c。进入实验目录编译源程序rootlocalhost/#cd/UP-Magic210/SRC/exp/driver/01_demo/清除中间代码,重新编译rootlocalhost 01_demo#make clean rootlocalhost 01_demo#make 当前目录下生成驱动程序demo.ko 和应用测试程序test_demo。启动UP-Mag
25、ic210 实验系统,连好网线、串口线。通过串口终端挂载宿主机实验目录(注意:虚拟机IP地址需要设置为:192.168.12.157)。rootUP-TECH yaffs#mount-t nfs-o nolock 192.168.12.157:/UP-Magic210/mnt/nfs 进入串口终端的NFS 共享实验目录rootUP-TECH yaffs#cd/mnt/nfs/SRC/exp/driver/01_demo/手动加载驱动程序demo.ko rootUP-TECH 01_demo#insmod demo.ko 通过设备号建立驱动设备节点rootUP_210 01_demo#mknod
26、/dev/demo c 251 0 执行应用程序测试该驱动及设备,分析应用程序测试结果。rootUP-TECH 01_demo#./test_demo(2)、请参考驱动程序demo.c,编写一个虚拟字符设备驱动程序并进行调试,该虚拟字符设备驱动程序完成如下功能:在核模块初始化函数中,实现动态申请设备号并注册该设备,动态建立设备文件节点;在核模块的退出函数中,实现设备注销,删除该设备文件节点;实现 file_operations 设备驱动文件结构体中的open、read、write、ioctl 和 release函数功能,其中:?open 函数:设置一个计数器count,每调用一次open 函数
27、,计数器 count 加 1。?read 函数:读取用户写入的字符串数据的排列结果。?write 函数:实现将用户写入的字符串数据,按照每个字符的ASCII值逆序或升序排序(根据开关值asc排序:asc=0,逆序排序;asc=1,升序排序;)。?ioctl 函数:设置排序方式开关值asc。?release 函数:每调用一次release 函数,计数器count 减 1。4.实验结果5.实验中遇到的问题及解决方法。没有修改 makefile 文件直接进行编译导致出错。实验前没有认真阅读实验原理,看懂实验代码,所以在使用make 命令以后无法实现。最后在同学的帮助下找到了原因。忽略了自己使用的是g
28、cc 编译而不是交叉编译,因而没有设置节点。尝试了很多次以后才发现了问题,期间以为是test_demo 文件的问题,但是导入导出很多次都没有解决,问了同学才找到了问题。实验四 LED 驱动及控制实验1.实验目的了解 ARM 设备外围电路结构与接口原理熟悉Linux 系统下硬件驱动编程编程实现对嵌入式设备上LED 灯的控制2.实验容阅读UP-Magic210 平台硬件文档,熟悉ARM 处理硬件外围接口电路编程实现UP-Magic210 平台设备上LED 驱动及应用测试程序3.实验步骤编写 UP-Magic210 平台设备上LED 驱动及应用测试程序并进行调试,该 LED驱动程序完成如下功能:在核
29、模块初始化函数中,实现动态申请设备号并注册该设备,动态建立设备文件节点;在核模块的退出函数中,实现设备注销,删除该设备文件节点;实现 file_operations 设备驱动文件结构体中的ioctl 函数,完成如下功能:?一次调用控制所有的LED亮或灭;?控制单个LED亮或灭;?实现流水灯显示,流水灯显示效果自行定义,流水灯循环显示次数由用户应用程序传入。程序:驱动程序分析:#include#include#include#include#include#include#include#include#include MODULE_LICENSE(GPL);#define DEVICE_NAM
30、E leds/驱动名称#define DEVICE_MAJOR 231/驱动主设备号#define DEVICE_MINOR 0/驱动次设备号/声明字符设备类结构struct cdev*mycdev;struct class*myclass;dev_t devno;/LED GPIO 列表static unsigned long led_table =S3C_GPQ2,S3C_GPQ3,S3C_GPQ4,S3C_GPQ5,S3C_GPQ6,;/LED GPIO 输出类型配置列表static unsigned int led_cfg_table =S3C_GPQ2_OUTP,S3C_GPQ3_O
31、UTP,S3C_GPQ4_OUTP,S3C_GPQ5_OUTP,S3C_GPQ6_OUTP,;/LED IOCTRL 处理函数,主要完成从用户空间传递数据进行 GPIO 引脚设置功能static int uptech_leds_ioctl(struct inode*inode,struct file*file,unsigned int cmd,unsigned long arg)switch(cmd)case 0:case 1:if(arg 6)return-EINVAL;/LED GPIO 设置函数接口s3c_gpio_setpin(led_tablearg,!cmd);return 0;d
32、efault:return-EINVAL;/驱动层 file_operations 接口函数初始化static struct file_operations uptech_leds_fops=.owner=THIS_MODULE,.ioctl=uptech_leds_ioctl,;/驱动程序入口初始化函数,设置 LED GPIO、向核注册设备。static int _init uptech_leds_init(void)int ret;int i;/注册 LED 设备devno=MKDEV(DEVICE_MAJOR,DEVICE_MINOR);/获取设备号mycdev=cdev_alloc()
33、;cdev_init(mycdev,&uptech_leds_fops);/初始化字符设备err=cdev_add(mycdev,devno,1);/向系统添加 LED 设备if(err!=0)printk(s3c leds device register failed!n);myclass=class_create(THIS_MODULE,leds);if(IS_ERR(myclass)printk(Err:failed in creating class.n);return-1;/建立 LED 设备节点class_device_create(myclass,NULL,MKDEV(DEVIC
34、E_MAJOR,DEVICE_MINOR),NULL,DEVICE_NAME,DEVICE_MINOR);/LED GPIO 配置初始化for(i=0;i 5;i+)s3c_gpio_cfgpin(led_tablei,led_cfg_tablei);s3c_gpio_setpin(led_tablei,1);printk(DEVICE_NAME initializedn);return 0;/驱动卸载函数static void _exit uptech_leds_exit(void)/注销 LED 驱动设备unregister_chrdev(LED_MAJOR,DEVICE_NAME);/声
35、明驱动程序入口函数module_init(uptech_leds_init);/声明驱动程序出口函数module_exit(uptech_leds_exit);?应用程序分析:#include#include#include#include int main(int argc,char*argv)int i;int on;int led_number;int fd;/*根据命令行参数容,进行控制。将命令行参数 1 设置成 LED number,参数 2 设置成 LED 点亮熄灭状态 on*/if(argc!=3|sscanf(argv1,%d,&led_number)!=1|sscanf(ar
36、gv2,%d,&on)!=1|on 1|led_number 5)fprintf(stderr,Usage:n);fprintf(stderr,t./led led_number on|offn);fprintf(stderr,Options:n);fprintf(stderr,t led_number from 0 to 4n);fprintf(stderr,t on:1 off:0n);exit(1);/打开 LED 设备节点fd=open(/dev/leds,0);if(fd 0)perror(open device/dev/leds);exit(1);/调用驱动层 ioctrl 接口,
37、实现对 LED 控制ioctl(fd,on,led_number);for(i=0;itm_gmtoff 为:#define TIMEZONE_OFFSET(foo)foo-tm_gmtoff 修改 boa.c:修改:if(setuid(0)!=-1)DIE(icky Linux kernel bug!);为:/if(setuid(0)!=-1)/DIE(icky Linux kernel bug!);/修改 defines.h:修改:#ifndef SERVER_ROOT#define SERVER_ROOT/etc/boa#endif 为:#ifndef SERVER_ROOT#defin
38、e SERVER_ROOT/mnt/yaffs#endif(5)、修改完源码文件后输入命令开始编译源码rootlocalhost src#makerootlocalhost src#arm-none-linux-gnueabi-strip boa(6)、修改boa 配置文件/UP-Magic210/boa/boa-0.94.13/boa.conf 修改:User nobody Group nogroup 为:User root Group root 修改:#ServerName.your.org.here 为:ServerName.csta.修改:DocumentRoot 为:Document
39、Root/mnt/yaffs/修改:ScriptAlias/cgi-bin/usr/lib/cgi-bin/为:ScriptAlias/cgi-bin/mnt/yaffs/cgi-bin/修改:MimeTypes/etc/mime.types 为:MimeTypes/mnt/yaffs/mime.types(7)、编译 CGI 程序/UP-Magic210/boa/cgi-bin/sa.c rootlocalhost cgi-bin#arm-none-linux-gnueabi-gcc /UP-Magic210/boa/cgi-bin/sa.c-o sa.cgi-lm(8)、将温湿度传感器连接
40、到开发板的P5端口,启动 UP-Magic210 实验系统,连好网线、串口线。通过串口终端挂载宿主机实验目录(注意:虚拟机IP地址需要设置为:192.168.12.157),在超级终端中拷贝boa 可执行程序、boa 配置文件和网页文件到UP-Magic210 中。(以下命令在超级终端中执行)rootUP-TECH yaffs#mount-t nfs-o nolock 192.168.12.157:/UP-Magic210/mnt/nfs rootUP-TECH yaffs#cd/mnt/nfs/boa/rootUP-TECH boa#ls boa-0.94.13 boa-0.94.13.ta
41、r.gz rootUP-TECH boa#cp-av /mnt/yaffs/rootUP-TECH boa#cp boa-0.94.13/boa.conf/mnt/yaffs/rootUP-TECH boa#cp boa-0.94.13/src/boa/mnt/yaffs/rootUP-TECH boa#cp mime.types/mnt/yaffs/rootUP-TECH boa#cd/mnt/yaffs/rootUP-TECH boa#mkdir-p/var/log/boa(9)、加载驱动,运行boa,打开浏览器测试boa rootUP-TECH yaffs#cd/mnt/yaffs/cgi-bin/rootUP-TECH cgi-bin#./install.sh rootUP-TECH cgi-bin#/mnt/yaffs/boa 4.实验结果5.实验中遇到的问题及解决方法修改 Makefile文件后未保存,然后运行make进行编译。