




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
嵌入式操作系统实验指导书实验1 Linux编程基础实验序号:1 实验名称:Linux编程基础适用专业:计算机科学与技术、通信工程 学 时 数:4学时一、实验目的1、熟悉Vim的工作模式,熟练使用vim中的常见操作。2、熟练掌握gcc编译命令及gdb的调试命令,通过对有问题程序的跟踪调试,进一步提高发现问题和解决问题的能力。3、熟悉多文件的makefile的编写,熟悉各种形式的makefile,并且进一步加深对makefile中用户自定义变量、自动变量的理解。4、使用autotools生成多文件的makefile,进一步掌握autotools的使用方法。二、实验内容1、vim使用练习(1)在“/root”目录下建一个名为“vim”的目录。(2)进入“vim”目录。(3)将文件“/etc/inittab”复制到“vim”目录下。(4)使用vim打开“vim”目录下的inittab.(5)设定行号,指出设定initdefault(类似于“id:5:initdefault”)的所在行号。(6)将光标移到该行。(7)复制该行内容。(8)将光标移到最后一行行首。(9)粘贴复制行的内容。(10)撤销第9步的动作。(11)将光标移动到最后一行的行尾。(12)粘贴复制行的内容。(13)光标移到“si:sysinit:/etc/rc.d/rc.sysinit”。(14)删除该行。(15)存盘但不退出。(16)将光标移到首行。(17)插入模式下输入“Hello,this is vi world!”.(18)返回命令行模式。(19)向下查找字符串“0:wait”。(20)再向上查找字符串“halt”。(21)强制退出vim,不存盘。2、用gdb调试程序的bug(1)使用vi编辑器,将以下代码输入到名为greet.c的文件中。此代码的原意为输出倒序main函数中定义的字符串,但结果显示没有输出,代码如下所示。#includeint display1(char *string);int display2(char *string);int main()char string=”Embedded Linux”;display1(string);display2(string);int display1(char *string)printf(“The original string is %s n”,string);int display2(char *string1)char *string2;int size,i;size=strlen(string1);string2=(char *)malloc(size+1);for (i=0,isize;i+)string2size-i=stringi;string2size+1= ;printf(“The string afterward is %sn”,string2);(2)使用gcc编译这段代码,注意要加上“-g”选项以方便之后的调试。(3)运行生成的可执行文件,观察运行结果。(4)使用gdb调试程序,通过设置断点、单步跟踪,一步步找出错误所在。(5)纠正错误,更改源程序并得到正确的结果。3、编写包含多文件的makefile(1)用vi在同一目录下编辑两个简单的hello程序,如下所示。#hello.c#include“hello.h”int main()printf(“Hello everyone!n”);#hello.h#include(2)仍在同一目录下用vim编辑makefile,且不使用变量替换,用一个目标体实现(即直接将hello.c和hello.h编译成hello目标体)。然后用make验证所写的makefile是否正确。(3)将上述makefile使用变量替换实现。同样用make验证所编写的makefile是否正确。(4)编辑另一个makefile,取名为makefile1,不使用变量替换,但用两个目标体实现(也就是首先将hello.c和hello.h编译为hello.o,再将hello.o编译为hello),再用make的“-f”选项验证这个makefile1的正确性。(5)将上述makefile1使用变量替换实现。4、使用autotools生成包含多文件的makefile(1)在/root下新建文件夹auto。(2)将上例的两个代码文件“hello.c”和“hello.h”复制到该目录下。(3)使用autoscan生成configure.scan.(4)编辑configure.scan,修改相关内容,并将其重命名为configure.in。(5)使用aclocal生成aclocal.m4。(6)使用autoconf生成configure。(7)使用autoheader生成config.h.in。(8)编辑makefile.am。(9)使用automake生成makefile.in。(10)使用configure生成makefile。(11)使用make生成hello可执行文件,并在当前目录下运行hello查看结果。(12)使用make install将hello安装到系统目录下,并运行,查看结果。(13)使用make dist生成hello压缩包。(14)解压hello压缩包。(15)进入解压目录。(16)在该目录下安装hello软件。三、实验步骤根据实验内容要求完成实验。13实验2 进程管理实验实验序号:2 实验名称:进程管理实验适用专业:计算机科学与技术、通信工程 学 时 数:4学时一、实验目的1、通过编写多进程程序,使读者熟练掌握fork()、exec()、wait()和waitpid()等函数的使用,进一步理解在Linux中多进程编程的步骤。2、通过编写经典的“生产者消费者”问题的实验,进一步熟悉Linux中的多线程编程,掌握用信号量处理线程间的同步和互斥问题。二、实验内容1、编写多进程程序该实验有3个进程,其中一个为父进程,其余两个是该父进程创建的子进程,其中一个子进程运行“ls -l”指令,另一个子进程在暂停5s之后异常退出,父进程先用阻塞方式等待第一个子进程的结束,然后用非阻塞方式等待另一个子进程的退出,等待收集到第二个子进程结束的信息,父进程就返回。参考流程图如图1所示。图1 多进程实验流程图2、多线程实验编写“生产者消费者”问题的实验,熟悉Linux中的多线程编程。“生产者消费者”问题描述如下。有一个有限缓冲区和两个线程:生产者和消费者。他们分别不停地把产品放入缓 冲区和从缓冲区中拿走产品。一个生产者在缓冲区满的时候必须等待,一个消费者在 缓冲区空的时候也必须等待。另外,因为缓冲区是临界资源,所以生产者和消费者之间必须互斥执行。要求使用有名管道来模拟有限缓冲区,并且使用信号量来解决“生产者消费者”问题中的同步和互斥问题。使用3 个信号量,其中两个信号量 avail 和 full 分别用于解决生产者和消费者线程 之间的同步问题,mutex 是用于这两个线程之间的互斥问题。其中 avail 表示有界缓冲区中 的空单元数,初始值为 N;full 表示有界缓冲区中非空单元数,初始值为 0;mutex是互斥 信号量,初始值为 1。参考流程图如图2所示。图2 多线程实验流程图三、实验步骤1、根据参考流程图编写程序;2、编译和运行程序代码,并观察运行结果。实验3 模块编程实验实验序号:3 实验名称:模块编程实验适用专业:计算机科学与技术、通信工程 学 时 数:4学时一、实验目的1、熟悉模块添加和删除的方法。2、熟悉字符设备驱动的编写流程。二、实验内容要求实现到虚拟设备(一段内存)的打开、关闭、读写的操作,并通过编写测试程序来测试虚拟设备及其驱动运行是否正常。三、实验步骤(1)编写代码。这个简单的驱动程序的源代码如下所示:/*test_drv.c*/#include#include#include#include#incldue#include#include#include#include#define TEST_DEVICE_NAME “test_dev”#define BUFF_SZ 1024/*全局变量*/static struct cdev test_dev;unsigned int major=250;static char *data=NULL;/*读函数*/static ssize_t test_read(struct file *file,char *buf,size_t count, loff_t *f_pos)int len;if (countcount)?count:len;if (copy_to_user(buf,data,count)/*将内核缓冲的数据复制到用户空间*/return EFAULT;return count;/*写函数*/static ssize_t test_write(struct file *file,const char *buffer,size_t count,loff_t *f_pos)if(countcount)?count:BUFF_SZ;if(copy_from_user(data,buffer,count)/*将用户缓冲的数据复制到内核空间*/return EFAULT;return count;/*打开函数*/static int test_open(struct inode *inode,struct file *file)printk(“This is open operationn”);/*分配并初始化缓冲区*/data= (char*)kmalloc(sizeof(char)* BUFF_SZ,GFP_KERNEL);if(!data)return ENOMEM;memset(data,0,BUFF_SZ);return 0;/*关闭函数*/static int test_release(struct inode *inode,struct file *file)printk(“This is release operationn”);if(data)kfree(data);/*释放缓冲区*/data=NULL;/*防止出现野指针*/return 0;/* 创建、初始化字符设备,并且注册到系统*/static void test_setup_cdev(struct cdev *dev, int minor,struct file_operations *fops)int err, devno = MKDEV(major, minor);cdev_init(dev, fops);dev-owner = THIS_MODULE;dev-ops = fops;err = cdev_add (dev, devno, 1);if (err)printk (KERN_NOTICE Error %d adding test %d, err, minor);/* 虚拟设备的 file_operations 结构 */static struct file_operations test_fops =.owner= THIS_MODULE,.read= test_read,.write= test_write,.open= test_open,.release = test_release,;/*模块注册入口*/int init_module(void)int result;dev_t dev = MKDEV(major, 0);if (major)/* 静态注册一个设备,设备号先前指定好,并设定设备名,用 cat /proc/devices 来查看*/result=register_chrdev_region(dev,1,TEST_DEVICE_NAME);elseresult=alloc_chrdev_region(&dev,0,1,TEST_DEVICE_NAME);if(result0)printk(KERN_WARNINGTest device:unable to get major %dn,major);return result;test_setup_cdev(&test_dev, 0, &test_fops);printk(The major of the test device is %dn, major);return 0;/*卸载模块*/void cleanup_module(void)cdev_del(&test_dev);unregister_chrdev_region(MKDEV(major, 0), 1);printk(Test device uninstalledn);(2)编译代码。虚拟设备的驱动程序的 Makefile 如下所示:ifeq ($(KERNELRELEASE),) KERNELDIR ?= /lib/modules/$(shell uname -r)/build /*内核代码编译路径*/PWD := $(shell pwd)modules:$(MAKE) -C $(KERNELDIR) M=$(PWD) modulesmodules_install:$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_installclean:rm -rf *.o * core .depend .*.cmd *.ko *.mod.c .tmp_versions.PHONY: modules modules_install cleanelseobj-m := test_drv.o/* 将生成的模块为 test_drv.ko*/endif(3)加载和卸载模块。 通过下面两个脚本代码分别实现驱动模块的加载和卸载。 加载脚本 test_drv_load 如下所示:#!/bin/sh# 驱动模块名称module=test_drv# 设备名称。在/proc/devices 中出现device=test_dev# 设备文件的属性mode=664group=root# 删除已存在的设备节点rm -f /dev/$device# 加载驱动模块/sbin/insmod -f ./$module.ko $* | exit 1# 查到创建设备的主设备号major=cat /proc/devices | awk $2=$device print $1# 创建设备文件节点mknod /dev/$device c $major 0# 设置设备文件属性chgrp $group /dev/$devicechmod $mode /dev/$device卸载脚本 test_drv_unload 如下所示:#!/bin/shmodule=test_drvdevice=test_dev# 卸载驱动模块/sbin/rmmod $module $* | exit 1# 删除设备文件rm -f /dev/$deviceexit 0(4)编写测试代码。最后一步是编写测试代码,也就是用户空间的程序,该程序调用设备驱动来测试驱动的运行是否正常。以下实例只实现了简单的读写功能,测试代码如下所示:/* test.c */#include #include #include #include #include #include #include #define TEST_DEVICE_FILENAME /dev/test_dev /* 设备文件名*/#define BUFF_SZ 1024 /* 缓冲大小*/int main()int fd, nwrite, nread;char buffBUFF_SZ;/*缓冲区*/* 打开设备文件 */fd = open(TEST_DEVICE_FILENAME, O_RDWR);if (fd 0)perror(open);exit(1);doprintf(Input some words to kernel(enter quit to exit):);memset(buff, 0, BUFF_SZ);if (fgets(buff, BUFF_SZ, stdin) = NULL)perror(fgets);break;buffstrlen(buff) - 1 = 0;if (write(fd, buff, strlen(buff) 0) /* 向设备写入数据 */perror(write);break;if (read(fd, buff, BUFF_SZ) 0)/* 从设备读取数据 */perror(read);break;elseprintf(Th
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 拖拉机整机装试工入职考核试卷及答案
- 劳务派遣管理员突发故障应对考核试卷及答案
- 2025年垃圾焚烧发电与新能源协同处理技术路线研究
- 集成电路无线传感技术进展报告
- 沼气物管员异常处理考核试卷及答案
- 海洋工程仿真效果评估报告
- 棉花加工工职业技能考核试卷及答案
- 2025年海岛能源结构优化与海洋能发电潜力研究报告
- 2025年分布式能源在智慧能源岛建设中的应用挑战与机遇研究报告
- 2025年东北农业大学人才招聘(58人)模拟试卷含答案详解
- 军事心理战试题及答案
- 2025年北京市第一次普通高中学业水平合格性考试历史试题(含答案)
- 二年级上册数学《观察物体》教学设计
- 检验科消防安全知识培训
- 心肾综合征诊疗实践指南解读
- 中国古代数学家求数列和的方法课件-高二上学期数学人教A版选择性
- 二氧化碳驱油机理及其在石油工业的应用
- 护理三基试题汇编1000题(含答案)
- 跨国企业战略协同-深度研究
- 申请银行承兑汇票申请书
- 第15课 探寻新航路 课件(18张)
评论
0/150
提交评论