




免费预览已结束,剩余20页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
精选文库嵌入式操作系统实验报告班级 计算机 学号 姓名 指导教师 庄旭菲 内蒙古工业大学信息工程学院计算机系2018年6月 实验一 Linux内核移植与编译实验1. 实验目的 了解 Linux 内核相关知识与内核结构 了解 Linux 内核在 ARM 设备上移植的基本步骤和方法 掌握 Linux 内核裁剪与定制的基本方法2. 实验内容 分析 Linux 内核的基本结构,了解 Linux 内核在 ARM 设备上移植的一些基本步骤及常识。 学习 Linux 内核裁剪定制的基本配置方法,利用 UP-Magic210 型设备配套 Linux 内核进行自定义功能(如helloworld 显示)的添加,并重新编译内核源码,生成内核压缩文件 zImage,下载到 UP-Magic210 型设备中测试。3. 实验步骤实验目录:/UP-Magic210/SRC/kernel/linux-2.6.35.7/编译内核:在宿主机端为UP-Magic210 设备的Linux 2.6.35.7 内核编写简单的测试驱动(内核)程序 helloworld.c 并修改内核目录中相关文件,添加对测试驱动程序的支持。(1)、使用 vim 编辑器手动编写实验代码 helloworld.chelloworld.c 内如如下:#include #include MODULE_LICENSE(Dual BSD/GPL);/驱动程序入口函数static int hello_init(void)printk(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 /# 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/Kconfig”下面添加如下:source“driver/char/hw_random/Kconfig”config HELLO_MODULEbool Hello World Testdepends on CPU_S5PV210helpThis 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/Makefile在 Makefile 中(大约在 91 行)添加如下一行obj-$(CONFIG_TOSHIBA)+=toshiba.oobj-$(CONFIG_I8K)+=i8k.oobj-$(CONFIG_DS1620)+=ds1620.oobj-$(CONFIG_HW_RANDOM)+=hw_random/obj-$(CONFIG_HELLO_MODULE)+=helloworld.oobj-$(CONFIG_PPDEV)+=ppdev.o(4)、运行 make menuconfig 配置内核对 helloworld 程序的支持:rootlocalhost linux-2.6.35.7# make distcleanrootlocalhost linux-2.6.35.7# make menuconfig先加载内核配置单,如图:然后进入到 Device Drivers -菜单中如图:进入到 Character devices-如图:进入该菜单会发现 Hello World Test 选项,按下空格将其静态编译进内核退出保存内核配置(5)、重新编译内核在内核源码的顶层目录下编译内核rootlocalhost linux-2.6.35.7# makescripts/kconfig/conf -s arch/arm/KconfigCHK include/linux/version.hCHK include/generated/utsrelease.hmake1:“include/generated/mach-types.h”是最新的。CALL scripts/checksyscalls.shCHK include/generated/compile.hCC drivers/char/helloworld.oLD drivers/char/built-in.oLD drivers/built-in.oLD vmlinux.oMODPOST vmlinux.o初次编译内核源码,由内核代码庞大,所需较长时间(大约几分钟至 10 几分钟不等)。编译成功后会在内核源码目录的 arch/arm/boot/目录下生成内核压缩文件 zImage。rootlocalhost linux-2.6.35.7# ls arch/arm/boot/zImagearch/arm/boot/zImagerootlocalhost linux-2.6.35.7#(6)、将新生成的内核镜像文件 zImage 烧写到 UP-Magic210 型设备中,这里不在赘述(烧写步骤可以参考文档“UP-Magic210出厂程序烧写手册(LINUX)V1.0.pdf”第23页)。新内核烧写成功后启动 UP-Magic210 型系统,可以在串口终端中查看到 Linux 内核在启动过程中打印出来的如下信息:S3C_LCD clock got enabled : 133.000 MhzWindow0- FB1 : map_video_memory: clear ff600000:00096000FB1 : map_video_memory: dma=57100000 cpu=ff600000 size=00096000Console: switching to colour frame buffer device 80x30fb-1069494052: frame buffer devicelp: driver loaded but no devices found#Hello, world#ppdev: user-space parallel port drivers3c-uart.0: ttySAC0 at MMIO 0x7f005000 (irq = 37) is a S3Cs3c-uart.1: ttySAC1 at MMIO 0x7f005400 (irq = 38) is a S3Cs3c-uart.2: ttySAC2 at MMIO 0x7f005800 (irq = 39) is a S3CRAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksizeloop: loaded (max 8 devices)nbd: registered device at major 43dm9000 Ethernet Drivereth0: dm9000 at c7866000,c7866002 IRQ 78 MAC: 00:22:12:34:56:90S3C IrDA driver, (c) 2006 Samsung ElectronicsLinux video capture interface: v2.00可以看到在终端上打印出#Hello, world#信息。同样进入 ARM 系统后也可以通过 dmesg 命令查看内核启动信息。rootUP-TECH yaffs# dmesgS3C_LCD clock got enabled : 133.000 MhzWindow0- FB1 : map_video_memory: clear ff600000:00096000FB1 : map_video_memory: dma=57100000 cpu=ff600000 size=00096000Console: switching to colour frame buffer device 80x30fb-1069494052: frame buffer devicelp: driver loaded but no devices found#Hello, world#ppdev: user-space parallel port drivers3c-uart.0: ttySAC0 at MMIO 0x7f005000 (irq = 37) is a S3Cs3c-uart.1: ttySAC1 at MMIO 0x7f005400 (irq = 38) is a S3Cs3c-uart.2: ttySAC2 at MMIO 0x7f005800 (irq = 39) is a S3CRAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize4.实验结果思考:如何能在Linux系统启动时,输出显示自定义的文本信息,请修改Linux内核启动代码,完成此功能。5. 实验中遇到的问题及解决方法在实验中遇到一些问题,例如在复制的时候我记得原来用cpa/tmp/linux-2.4.18-br.tar.gz就可以了,可这次不行必须要用cpa/tmp/linux-2.4.18-br.tar.gz./到自己的目录下。不过最后都顺利解决了问题,在编译复习了make menuconfig的编译配置。实验二 根文件系统实验1. 实验目的 了解 UP-Magic210 魔法师实验套件 Linux 系统下根文件系统结构 掌握根文件系统的搭建过程 掌握 busybox、mkcramfs 等工具的使用方法2. 实验内容 使用 busybox 生成文件系统中的命令部分,使用 mkcramfs 工具制作 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 文件系统系统支持进入 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# lsbash-4.0.tar.bz2 busybox-1.19.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# lsbash-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_COMPILE ?= 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 选项接下来的配置可以根据具体情况来设置或裁剪相关工具。退出保存设置。编译 busyboxrootlocalhost busybox-1.19.3# make安装 busyboxrootlocalhost busybox-1.19.3# make install成功后会在当前目录下生成 _install 目录,编译的工具也都集成在该安装目录下。rootlocalhost busybox-1.19.3# cd _install/rootlocalhost _install# lsbin linuxrc sbin usrrootlocalhost _install#可以看到_install 目录下生成了根文件系统常用的命令及工具,接下来的工作,用户可以根据需要将_install目录下生成的命令拷贝到根文件系统相应目录下。例如:将从 busybox 生成的 which 命令拷贝到根文件系统目录的 usr/bin 目录下,这样,我们的根文件系统就支持 which 命令了。(2)、制作 CRAMFS 根文件系统镜像实验中已经提供了 mkcramfs 制作工具以及 mkrootfs.sh 脚本文件,用户只需执行 mkrootfs.sh 脚本文件来使用mkcramfs 制作根文件系统镜像即可。当然也可以手动的执行命令:./mkcramfs rootfs_up210 rootfs_up210.cramfsrootlocalhost rootfs# ./mkrootfs.sh此时在当前目录下生成根文件系统镜像文件 rootfs_up210.cramfsrootlocalhost rootfs# lsmkcramfs mkrootfs.sh rootfs_up210 rootfs_up210.cramfs三、烧写根文件系统将新生成的根文件系统镜像文件rootfs_up210.cramfs烧写到UP-Magic210 型设备中进行测试,这里不在赘述(烧写步骤可以参考文档“UP-Magic210出厂程序烧写手册(LINUX)V1.0.pdf”第24页)。如果用户新添加了相关命令或工具(例如 which 命令)启动系统后可以验证用户添加入的新命令或工具。4.实验结果5. 实验中遇到的问题及解决方法make 编译有错误,进行源代码的修改。之后再make menuconfig中将这个宏对应的东西配置成没有就好了,如果没有这个宏,那么就直接用出错的那个文件的名字找就行了,找到后给它去掉,将来make的时候就不会编译这个文件了,在次进行make 编译后,编译出来了busybox这个东西,就在证明编译通过了。实验三 模块方式驱动实验1. 实验目的 学习在 LINUX 下进行驱动设计的原理 掌握使用模块方式进行驱动开发调试的过程2. 实验内容 在 PC 机上编写简单的虚拟硬件驱动程序并进行调试,实验驱动的各个接口函数的实现,分析并理解驱动与应用程序的交互过程。 在 ARM 设备上创建设备驱动节点,编写用户空间应用程序,对驱动程序进行测试。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-Magic210 实验系统,连好网线、串口线。通过串口终端挂载宿主机实验目录(注意:虚拟机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.korootUP-TECH 01_demo# insmod demo.ko通过设备号建立驱动设备节点 rootUP_210 01_demo# mknod /dev/demo c 251 0执行应用程序测试该驱动及设备,分析应用程序测试结果。rootUP-TECH 01_demo# ./test_demo(2)、请参考驱动程序demo.c,编写一个虚拟字符设备驱动程序并进行调试,该虚拟字符设备驱动程序完成如下功能:u 在内核模块初始化函数中,实现动态申请设备号并注册该设备,动态建立设备文件节点;u 在内核模块的退出函数中,实现设备注销,删除该设备文件节点;u 实现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。4.实验结果5. 实验中遇到的问题及解决方法。没有修改makefile文件直接进行编译导致出错。实验前没有认真阅读实验原理,看懂实验代码,所以在使用make命令以后无法实现。最后在同学的帮助下找到了原因。忽略了自己使用的是gcc编译而不是交叉编译,因而没有设置节点。尝试了很多次以后才发现了问题,期间以为是test_demo文件的问题,但是导入导出很多次都没有解决,问了同学才找到了问题。实验四 LED 驱动及控制实验1. 实验目的 了解 ARM 设备外围电路结构与接口原理 熟悉 Linux 系统下硬件驱动编程 编程实现对嵌入式设备上 LED 灯的控制2. 实验内容 阅读 UP-Magic210 平台硬件文档,熟悉 ARM 处理硬件外围接口电路 编程实现 UP-Magic210 平台设备上 LED 驱动及应用测试程序3. 实验步骤编写UP-Magic210 平台设备上 LED 驱动及应用测试程序并进行调试,该LED驱动程序完成如下功能:u 在内核模块初始化函数中,实现动态申请设备号并注册该设备,动态建立设备文件节点;u 在内核模块的退出函数中,实现设备注销,删除该设备文件节点;u 实现file_operations设备驱动文件结构体中的ioctl函数,完成如下功能: 一次调用控制所有的LED亮或灭; 控制单个LED亮或灭; 实现流水灯显示,流水灯显示效果自行定义,流水灯循环显示次数由用户应用程序传入。程序:驱动程序分析:#include #include #include #include #include #include #include #include #include MODULE_LICENSE(GPL);#define DEVICE_NAME 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_OUTP,S3C_GPQ4_OUTP,S3C_GPQ5_OUTP,S3C_GPQ6_OUTP,;/ LED IOCTRL 处理函数,主要完成从用户空间传递数据进行 GPIO 引脚设置功能static int uptech_leds_ioctl(struct inode *inode,struct file *file,unsigned intcmd,unsigned long arg)switch(cmd) case 0:case 1:if (arg 6) return -EINVAL;/ LED GPIO 设置函数接口s3c_gpio_setpin(led_tablearg, !cmd);return 0;default: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();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(DEVICE_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);/ 声明驱动程序入口函数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(argv2,%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 接口,实现对 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#define SERVER_ROOT /mnt/yaffs#endif(5)、修改完源码文件后输入命令开始编译源码rootlocalhost src# makerootlocalhost src# arm-none-linux-gnuea
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高校预算执行管理的现状与优化路径
- 电力装备制造产业基地项目可行性研究报告
- 网课自律课件
- 病原菌分子标记-洞察及研究
- 肾上腺疾病与糖尿病代谢紊乱-洞察及研究
- 户外灯行业知识培训课件
- 户外工作知识培训总结课件
- 户外基础抢救知识培训课件
- 一年级数学(上)计算题专项练习集锦
- 第一节 压强教学设计-2025-2026学年初中物理八年级下册(2024)北师大版(2024·郭玉英)
- 苏教版分式章起始课-展示课件
- 《茶文化与茶健康》第一讲
- OBE理念下的小学音乐教学设计反向思路初探
- GB 24541-2022手部防护机械危害防护手套
- 《PLC与变频器控制》课件 1.PLC概述
- 智慧产业园综合管理平台解决方案
- 国王的恩赐-传奇-任务全书
- 资产负债表(个体工商户)
- 手枪射击技巧
- 水浒人物介绍-鲁智深
- 呼吸系统疾病患儿的护理课件
评论
0/150
提交评论