华科操作系统实验

合集下载

华科操作系统实验

华科操作系统实验

华科操作系统实验 Corporation standardization office #QS8QHH-HHGX8Q8-GNHHJ8课程实验报告课程名称:操作系统课程设计专业班级:学号:姓名:指导教师:报告日期:计算机科学与技术学院目录实验1:进程并发实验1.1 实验概述通过本次进程并发实验,让同学更加熟悉和理解Linux编程环境。

1.2 实验内容本次实验的内容主要分为两个任务:1.编写一个C程序,用read、write等系统调用实现文件拷贝功能。

命令形式:copy <源文件名> <目标文件名>2. 编写一个C程序,使用图形编程库 (QT/GTK)分窗口显示三个并发进程的运行(一个窗口实时显示当前系统时间,一个窗口循环显示0到9,一个窗口做1到1000的累加求和,刷新周期均为1秒)。

1.3 实验设计任务1:实验1的第一个阶段需要实现一个简单的C语言程序,首先需要有一个复制的源文件,同时需要创建一个存放复制内容的复制文件,文件复制传输的中间站可以设置一个缓冲数组,此次试验设计了一个大小为10个字节的数组。

打开复制源文件,返回一个INT标识,使用readbuf()函数,每次读取10个字节的内容,将内容存放到缓冲区数组,使用writebuf()函数将缓冲区的10个字节写到复制文件中,重复上述过程直到将整个复制过程完成。

任务2:实验的第二个阶段是实现进程的同步,实现的工具是QT。

主要实现3个进程的同步,3个进程分别为:实时显示系统时间、循环显示0-9、显示1-1000的累加和。

以上程序的刷新时间设置为1秒钟。

使用的是c++编程语言。

为了实现3个进程。

需要为这3个进程分别创建3个不同的类,这3个不用的类具有不同的成员函数,使用成员函数来实现进程的所代表的具体细节。

为了实现进程的结果能实时更新,需要调用connect()函数,该函数的功能是每当其中的timer每次发生变化时,就回调用该类的成员函数,也就是进程的具体实现,从而实时显示进程的细节内容。

操作系统实验报告--华科

操作系统实验报告--华科

实验一哲学家就餐问题一、实验目的1、熟练使用VC++6.0编译环境,调试并正确运行程序。

2、理解哲学家就餐问题中出现的问题,进而掌握死锁的必要条件。

3、理解源程序中产生和防止死锁的算法,及相关窗口操作。

4、熟悉哲学家就餐问题流程。

5、在VC++6.0环境下编译哲学家就餐问题演示程序,考虑其他解决死锁方法.二、实验原理1、问题描述有五个哲学家围坐在一圆桌旁,桌中央有一盘通心粉,每人面前有一只空盘子,每两人之间放一只筷子。

每个哲学家的行为是思考,感到饥饿,然后吃通心粉。

为了吃通心粉,每个哲学家必须拿到两只筷子,并且每个人只能直接从自己的左边或右边去取筷子。

2、分配方式方式一(不会进入死锁)仅当一个哲学家左右两边的筷子都可用时,才允许他拿筷子。

这样要么一次占有两只筷子(所有线程需要的资源)进行下一步的吃通心粉,然后释放所有的资源;要么不占用资源,这样就不可能产生死锁了。

方式二(会进入死锁)当筷子(资源)可用时,先分配左边的筷子,等待一会后再分配右边的筷子,由于这个过程中,左边的筷子一直没有释放,就有可能产生死锁了。

3、程序运行说明程序运行过程中会弹出一个MessageBox提示操作者操作:1)第一个对话框用于选择运行模式a.选择yes 表示采用的是运行的防止死锁的方式,这样的话整个程序可以一直运行下去,不会产生死锁。

b.选择no 表示运行产生死锁的方式会弹出第二个对话框。

2)第二个对话框用于选择运行时,线程运行的时间a. 选择res 线程时间比较短,很快就可以死锁b.选择no 线程时间跟选择yes 时候的时间差不多,产生死锁的时间稍微长一点。

三、实验过程及分析1、伪代码:1) 不发生死锁的方式(要么一下占用两支筷子,要么不占用)var mutexleftchopstick,mutexrightchopstick;beging:resting;waiting;p(mutexleftchopstick); //先改变左手筷子信号量p(mutexrightchopstick); //马上改变右手筷子信号量GetResource(leftchopstick,rightchopstick);eating;v(mutexleftchopstick);v(mutexrightchopstick);end2) 发生死锁的方式(一旦可以占用筷子,就马上占用)var mutexleftchopstick,mutexrightchopstick;beging:resting;waiting;p(mutexleftchopstick); //改变左手筷子信号量GetResource(leftchopstick); //获取左手筷子p(mutexrightchopstick); //改变右手筷子信号量GetResource(rightchopstick); //获取右手筷子eating;v(mutexleftchopstick);v(mutexrightchopstick);end2、代码分析:1)不发生死锁的方式:先确定两只筷子均没被占用才获取筷子,这样就打破了死锁的必要条件。

华科操作系统实验

华科操作系统实验

课程实验报告课程名称:操作系统课程设计专业班级:学号:姓名:指导教师:报告日期:计算机科学与技术学院目录实验1:进程并发实验 (1)实验概述 (1)实验内容 (1)实验设计 (1)实验过程 (2)实验结果 (6)实验小结 (7)实验2:添加系统功能调用 (8)实验概述 (8)实验内容 (8)阶段1 添加源代码 (8)阶段2 连接新的系统功能调用 (9)阶段3 重建内核 (10)阶段4 修改grub文件 (13)实验小结 (14)实验3:添加设备驱动程序 (15)实验概述 (15)实验内容 (15)阶段1 编写设备驱动程序 (15)阶段2 编译设备驱动模块 (16)阶段3 加载设备驱动模块 (17)阶段4 生成设备文件 (18)阶段5 编写应用程序测试 (18)实验小结 (19)实验总结 (20)实验1:进程并发实验实验概述通过本次进程并发实验,让同学更加熟悉和理解Linux编程环境。

实验内容本次实验的内容主要分为两个任务:1.编写一个C程序,用read、write等系统调用实现文件拷贝功能。

命令形式:copy <源文件名> <目标文件名>2.编写一个C程序,使用图形编程库 (QT/GTK)分窗口显示三个并发进程的运行(一个窗口实时显示当前系统时间,一个窗口循环显示0到9,一个窗口做1到1000的累加求和,刷新周期均为1秒)。

实验设计任务1:实验1的第一个阶段需要实现一个简单的C语言程序,首先需要有一个复制的源文件,同时需要创建一个存放复制内容的复制文件,文件复制传输的中间站可以设置一个缓冲数组,此次试验设计了一个大小为10个字节的数组。

打开复制源文件,返回一个INT标识,使用readbuf()函数,每次读取10个字节的内容,将内容存放到缓冲区数组,使用writebuf()函数将缓冲区的10个字节写到复制文件中,重复上述过程直到将整个复制过程完成。

任务2:实验的第二个阶段是实现进程的同步,实现的工具是QT。

华科_计算机系统实验报告

华科_计算机系统实验报告

课程实验报告课程名称:计算机系统基础专业班级:学号:姓名:指导教师:报告日期:年月日计算机科学与技术学院目录实验1: (1)实验2: (7)实验3: (24)实验总结 (34)实验1:数据表示1.1 实验概述实验目的:更好地熟悉和掌握计算机中整数和浮点数的二进制编码表示。

实验目标:加深对数据二进制编码表示的了解。

实验要求:使用有限类型和数量的运算操作实现一组给定功能的函数。

实验语言:c。

实验环境:linux1.2 实验内容需要完成bits.c中下列函数功能,具体分为三大类:位操作、补码运算和浮点数操作。

1)位操作表1列出了bits.c中一组操作和测试位组的函数。

其中,“级别”栏指出各函数的难度等级(对应于该函数的实验分值),“功能”栏给出函数应实现的输出(即功能),“约束条件”栏指出你的函数实现必须满足的编码规则(具体请查看bits.c中相应函数注释),“最多操作符数量”指出你的函数实现中允许使用的操作符的最大数量。

你也可参考tests.c中对应的测试函数来了解所需实现的功能,但是注意这些测试函数并不满足目标函数必须遵循的编码约束条件,只能用做关于目标函数正确行为的参考。

表1 位操作题目列表2)补码运算表2列出了bits.c中一组使用整数的补码表示的函数。

可参考bits.c中注释说明和tests.c中对应的测试函数了解其更多具体信息。

表2 补码运算题目列表3)浮点数操作表3列出了bits.c中一组浮点数二进制表示的操作函数。

可参考bits.c中注释说明和tests.c中对应的测试函数了解其更多具体信息。

注意float_abs的输入参数和返回结果(以及float_f2i函数的输入参数)均为unsigned int类型,但应作为单精度浮点数解释其32 bit二进制表示对应的值。

表3 浮点数操作题目列表表示,当输入参数是NaN 时,返回NaN 号整型操作,包括||,&&以及if,while控制结构4 float_f2i 返回浮点数‘f’的强制整型转换“(int)f”表示仅能使用任何整型/无符号整型操作,包括||,&&以及if,while控制结构301.3 实验设计根据题目要求,选择合适的操作符来编写代码。

华科计算机并行实验报告

华科计算机并行实验报告

课程设计报告题目:并行实验报告课程名称:并行编程原理与实践专业班级:学号:姓名:指导教师:报告日期:计算机科学与技术学院目录1,实验一 (1)1 实验目的与要求 (1)1.1实验目的 (1)1.2实验要求 (1)2 实验内容 (1)2.1.1熟悉pthread编程 (1)2.1.2简单的thread编程 (2)2.2.1熟悉openMP编程 (3)2.3.1熟悉MPI编程 (4)2,实验2~5 (7)1 实验目的与要求 (7)2 算法描述 (7)3.实验方案 (8)4实验结果与分析 (8)3 心得体会 (10)附录: (10)3 蒙特.卡罗算法求π的并行优化 (19)1.蒙特.卡罗算法基本思想 (19)2.工作过程 (20)3.算法描述 (20)4 设计与实现 (21)5 结果比较与分析 (23)6 思考与总结 (24)1,实验一1 实验目的与要求1.1实验目的1)熟悉并行开发环境,能进行简单程序的并行开发,在Linux下熟练操作。

2)熟悉一些并行工具,如pthread,OpenMP,MPI等进行并行编程3)培养并行编程的意识1.2实验要求1)利用pthread、OpenMP、MPI等工具,在Linux下进行简单的并行编程,并且掌握其编译、运行的方法。

2)理解并行计算的基础,理解pthread、OpenMP、MPI等并行方法。

2 实验内容2.1.1熟悉pthread编程Linux系统下的多线程遵循POSIX线程接口,称为 pthread。

编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a。

下面是pthread编程的几个常用函数:1,int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr, void *(*start_rtn)(void),void *restrict arg);返回值:若是成功建立线程返回0,否则返回错误的编号形式参数:pthread_t *restrict tidp 要创建的线程的线程id指针const pthread_attr_t *restrict attr 创建线程时的线程属性void* (start_rtn)(void) 返回值是void类型的指针函数void *restrict arg start_rtn的行参2 , int pthread_join( pthread_t thread, void **retval );thread表示线程ID,与线程中的pid概念类似;retval用于存储等待线程的返回值连接函数pthread_join()是一种在线程间完成同步的方法。

华科操作系统实验报告

华科操作系统实验报告

华科操作系统实验报告一、实验目的操作系统是计算机系统的核心组成部分,对于理解计算机的工作原理和提高计算机应用能力具有重要意义。

本次华科操作系统实验的主要目的是通过实际操作和实践,深入理解操作系统的基本概念、原理和功能,掌握操作系统的核心技术和应用方法,提高我们的实践能力和问题解决能力。

二、实验环境本次实验使用的操作系统为Windows 10 和Linux(Ubuntu 2004),开发工具包括 Visual Studio Code、GCC 编译器等。

实验硬件环境为个人计算机,配置为英特尔酷睿 i7 处理器、16GB 内存、512GB 固态硬盘。

三、实验内容1、进程管理进程创建与销毁进程调度算法模拟进程同步与互斥2、内存管理内存分配与回收算法实现虚拟内存管理3、文件系统文件操作与管理文件系统的实现与优化4、设备管理设备驱动程序编写设备分配与回收四、实验步骤及结果1、进程管理实验进程创建与销毁首先,使用 C 语言编写程序,通过系统调用创建新的进程。

在程序中,使用 fork()函数创建子进程,并在子进程和父进程中分别输出不同的信息,以验证进程的创建和执行。

实验结果表明,子进程和父进程能够独立运行,并输出相应的信息。

进程调度算法模拟实现了先来先服务(FCFS)、短作业优先(SJF)和时间片轮转(RR)三种进程调度算法。

通过模拟多个进程的到达时间、服务时间和优先级等参数,计算不同调度算法下的平均周转时间和平均等待时间。

实验结果显示,SJF 算法在平均周转时间和平均等待时间方面表现较好,而 RR 算法能够提供较好的响应时间和公平性。

进程同步与互斥使用信号量和互斥锁实现了进程的同步与互斥。

编写了生产者消费者问题的程序,通过信号量控制生产者和消费者对缓冲区的访问,避免了数据竞争和不一致的情况。

实验结果表明,信号量和互斥锁能够有效地实现进程间的同步与互斥,保证程序的正确性。

2、内存管理实验内存分配与回收算法实现实现了首次适应(First Fit)、最佳适应(Best Fit)和最坏适应(Worst Fit)三种内存分配算法。

华科_HUST_微机原理_并行IO接口实验_独立式开关输入_实验报告

华科_HUST_微机原理_并行IO接口实验_独立式开关输入_实验报告

微机原理实验报告学号姓名专业通信1301指导教师罗杰院(系、所)电信学院并行I/O接口实验一、实验目的1、掌握GPIO IP核的工作原理和使用方法。

2、掌握IO接口程序控制方法1)查询方式2)中断方式3)延时方式3、掌握中断控制方式的IO接口设计原理4、掌握中断程序设计方法二、实验任务使用查询、中断两个方式做独立式开关输入,将开关状态显示到console。

三、硬件电路框图四、硬件平台建立1 创建XPS工程创建basesystem文件夹,建立最小系统。

启动XPS,打开system.xmp工程文件。

2 添加和配置GPIO IP核在XPS主界面左边窗口选择IP Cataiong标签,点击General Purpose I/O展开。

添加AXI Genaral Purpose I/O。

配置开关与led灯分别有16个,将其分别设置为16在ucf文件中添加相应代码3、添加和配置中断控制器IP核在XPS主界面左边窗口选择Clock, Reset and Interrupt标签,点击AXI InterruptController展开。

将INTERRUPT引脚选择axi_intc.c_INTERRUPT。

设置中断输入4、产生外部GPIO链接SW为开关输入,从GPIO_IO接口接入,LED灯输出,从GPIO2_IO接口接入展开External Ports项可看到SW与LED的外部接口五、软件平台建立1.查询源代码#include"stdio.h"#include"xil_io.h"#include"xil_types.h"#define gpio_ctrl 0x40000004 //定义通道1地址#define gpio_data 0x40000000 //定义数据1地址#define gpio1_ctrl 0x4000000c //定义通道2地址#define gpio1_data 0x40000008 //定义数据2地址int main(void){u16 SW,psw; //定义两个输入,psw作比较信号Xil_Out16(gpio_ctrl,0xffff); //输入Xil_Out16(gpio1_ctrl,0x0); //输出psw=SW=0x00; //赋初值0给两个输入信号while(1){SW=Xil_In16(gpio1_data);Xil_Out16(gpio1_data,SW);if(psw!=SW) //判断SW与PSW是否相等{psw=SW;SW=Xil_In16(gpio1_data);xil_printf("the Switch state is 0x%X\n\r",SW);//显示开关状态}}return 0;}状态显示:实验流程图:2 中断源代码:#include"xgpio.h"#include"xparameters.h" #include"xintc.h"#include"stdio.h"#include"xil_io.h"XGpio swled;XIntc intc;//实例化intcint swstate;int pshdip;void Initialize();void GPIOHandler(void * CallBackRef);int main(){Initialize();while(1){if(pshdip){xil_printf("the Switch state is 0x %x\n\r",swstate);pshdip=0;}}return 0;}void Initialize(){XGpio_Initialize(&swled, XPAR_AXI_GPIO_0_DEVICE_ID);XGpio_SetDataDirection(&swled, 1, 0xffff);XGpio_SetDataDirection(&swled, 2, 0x0);XGpio_InterruptEnable(&swled, 1);XGpio_InterruptGlobalEnable(&swled);//XGpio_InterruptClear(&swled,1);XIntc_Initialize(&intc,XPAR_AXI_INTC_0_DEVICE_ID );XIntc_Connect(&intc, XPAR_AXI_INTC_0_AXI_GPIO_0_IP2INTC_IRPT_INTR, (XInterruptHandler)GPIOHandler, (void *)&swled);XIntc_Enable(&intc, XPAR_AXI_INTC_0_AXI_GPIO_0_IP2INTC_IRPT_INTR);microblaze_enable_interrupts();microblaze_register_handler((XInterruptHandler)XIntc_InterruptHandler,( void *)&intc);XIntc_Start(&intc, XIN_REAL_MODE);void GPIOHandler(void * CallBackRef){swstate= XGpio_DiscreteRead(&swled, 1); pshdip=1;XGpio_DiscreteWrite(&swled, 2, swstate);XGpio_InterruptClear(&swled, 1);状态显示:}实验流程图:六、实验小结在这个实验的过程中,令我觉得最困难的不是硬件部分的理解和搭建,而是软件部分代码的理解,由于代码中利用到了中断,所以对中断状态的理解和使用上面遇到了一些问题。

嵌入式系统实验报告(华中科技大学)

嵌入式系统实验报告(华中科技大学)

课程实验报告实验名称:嵌入式系统实验专业班级:计算机科学与技术x班学号:Ux姓名:x合作者:x实验时间:xxxx年xx月xx日计算机科学与技术学院试验一:bootloader (ads、引导)一、实验任务1、熟悉ADS 1.2开发工具创建、编译、下载、调试工程2、串口通讯串口控制器初始化、收/发数据3、配置主机端的nfs服务器配置主机端的nfs服务器,以连接linux核心4、下载并运行linux核心使用自己的串口程序下载并运行linux核心二、实验内容编写串口接收数据函数编写串口发送数据函数学习ads、jtag调试、flash烧写打印菜单,等待用户输入下载并运行linux核心配置主机的nfs服务器,与linux核心连接三、实验步骤1.编写串口接收数据函数编写串口发送数据函数修改bootloader:菜单、串口收发、命令行;接收串口数据并做相应处理:while(1){打印菜单并等待用户输入;switch(ch) //根据用户输入做相应处理{case '1':imgsize=xmodem_receive((char *)KERNEL_BASE, MAX_KERNEL_SIZE);if(imgsize==0) //下载出错;else //下载成功;break;case '3':nand_read((unsigned char *)KERNEL_BASE, 0x00030000, 4*1024*1024);case '2':BootKernel(); //这里是不会返回的,否则出错;break;default:break;}}Bootloader的main()函数打印菜单:int main(void){ARMTargetInit(); //目标板初始化;//接收用户命令,传递linux核心;Uart_puts("Menu:\n\r");Uart_puts("1.Load kernel via Xmodem;\n\r");Uart_puts("2.Boot linux; \n\r");Uart_puts("3.Load kernel from flash and boot; \n\r");Uart_puts("Make your choice.\n\r");do{ch=Uart_getc();}while(ch!='1' && ch!='2' && ch!='3');return 0;}串口读写:void Uart_putc(char c){while(!SERIAL_WRITE_READY());((UTXH0) = (c));}unsigned char Uart_getc( ){while(!SERIAL_CHAR_READY());return URXH0;}2.使用ads1.2编译bootloader;3.使用uarmjtag下载、调试bootloader;4.使用axd查看变量、内存,单步跟踪;5.配置超级终端,与bootloader通讯;6.配置nfs;编辑/etc/export文件:/home/arm_os/filesystem/rootfs 目标板ip(rw,sync)/home/arm_os/filesystem/rootfs 主机ip(rw,sync)启动nfs服务器:/etc/init.d/nfs restart测试nfs服务器是否正常运行:mount 主机ip:/home/arm_os/filesystem/rootfs /mnt7.以root用户启动cutecom,将cutecom配置改为115200 bps,8位,1位停止位,无校验,xmodem,no line end;8.使用bootloader重新下载Linux核心映像,启动核心运行后,察看是否成功加载nfs上的root文件系统;9.启动Linux核心运行,察看结果;10.linux核心能够运行到加载root步骤,说明bootloader正常运行;11.将bootloader烧写到flash中,重启目标板电源,察看bootloader是否烧写正常,下载核心测试;目标板linux系统正常运行到命令行模式下,能够正常输入linux命令,说明实验成功。

嵌入式操作系统实验报告华中科技大学

嵌入式操作系统实验报告华中科技大学

本科实验报告课程名称:嵌入式操作系统实验报告姓名:学院:计算机科学与技术专业:计算机科学与技术年级:学号:指导教师:2007年12月2日试验一ADS、中断、串口通讯一实验目的1、熟悉ADS 1.2开发工具--创建、编译、下载、调试工程2、中断--中断响应、分发、处理3、串口通讯--串口控制器初始化、收/发数据二实验内容1 修改uC/OS-II的main函数2编写串口消息接受任务函数3编写串口中断处理函数三参考代码int main(void){ARMTargetInit(); //硬件初始化OSInit(); //操作系统初始化LCD_Init(); //LCD初始化LCD_Refresh();clearscreen(); //清屏OSTaskCreate(Task1, (void *)0,(OS_STK *)&task1_Stack[STACKSIZE-1], Task1_Prio);//创建串口数据接收进程message=OSMboxCreate((void*)NULL); //创建消息队列OSAddTask_Init(0); //创建idle进程,设置时钟中断OSStart(); //操作系统开始运行,开始调度return 0;}//mainvoid Task1(void *Id){U8 *c1, err;U16 timeout=0;InitUart(); //串口初始化;while(1) //循环接收串口数据并打印到LCD{c1 = OSMboxPend(message, timeout,&err); //等待串口数据,进入等待状态if(*c1=='\r') {WrUTXH0(‘\r’); WrUTXH0(‘\n’);//如果是换行符,打印换行给串口}else { //否则回传数据给串口并在LCD上显示数据WrUTXH0(*c1); WrUTXH0('\r'); WrUTXH0('\n');drawchar(*c1,0x7e0); drawstring("\n",0xffe0);} //if} //while} //Task1void irq_RevUart(int vector, int ndev){*c=RdURXH0(); // 从串口读数据OSMboxPost(message,&c); // 发消息给接收进程}四. 附件说明关于ADS工具的使用,每次必须关闭再重新开,这个软件bug应该说相当严重,希望以后的版本中可以修正.试验二进程通讯一实验目的1、中断处理与进程之间的同步--消息、信号灯、共享内存2、进程通讯--消息,信号灯二实验内容1修改uC/OS-II的main函数2创建两个任务函数3创建消息队列和信号灯4实现两个任务的同步三参考代码int main(void){ARMTargetInit(); //硬件初始化OSInit(); //操作系统初始化LCD_Init();LCD_Refresh();clearscreen(); //清屏OSTaskCreate(Task1, (void *)0, //创建串口数据接收进程(OS_STK *)&task1_Stack[STACKSIZE-1], Task1_Prio); OSTaskCreate(Task2, (void *)0, //创建串口数据显示进程(OS_STK *)&task2_Stack[STACKSIZE-1], Task2_Prio); message=OSMboxCreate((void*)NULL); //创建消息队列point=OSSemCreate(0); //创建信号灯,初值为0OSAddTask_Init(0); //创建idle进程,设置时钟中断OSStart(); //操作系统开始运行,开始调度return 0;}//mainvoid Task1(void *Id){U8 *c1, err;U16 timeout=0;InitUart(); //串口初始化;while(1) //循环接收串口数据并打印到LCD{ printf(“run task1”);drawStrong(waiting message from task2);OSMboxPend(message, timeout,&err); //等待串口数据,进入等待状态c1 = message->OSEventPtr; //串口收到数据,被唤醒,取得数据的指针if(*c1=='\r') {WrUTXH0(‘\r’); WrUTXH0(‘\n’);//如果是换行符,打印换行给串口}else { //否则回传数据给串口并在LCD上显示数据WrUTXH0(*c1); WrUTXH0('\r'); WrUTXH0('\n');UartChar = *c1; //将全局量UartChar赋值OSSemPost(point); //信号灯V()操作,通知显示进程} //if} //while} //Task1void Task2(void *Id){U8 err;for(;;){printf(“run task2”);drawStrong(waiting message from task1);OSSemPend(point,timeouts,&error); //信号灯P()drawstring("the char from uart is:\n",0x7ff);if(c1=‘\r’)//显示串口数据{drawchar(UartChar,0xffff);drawstring("\n",0xffe0);}elsedrawstring("\n",0xffe0);} //for} //Task2试验三LCD驱动、图形系统入门一实验目的1、LCD驱动--LCD初始化,FrameBuffer显示控制2、图形系统入门--点、线,简单几何形状二实验内容1 .初始化GPIO(通用输入/输出):rGPCUP=0xffffffff;rGPCCON=0xaaaaaaaa;rGPDUP=0xffffffff;rGPDCON=0xaaaaaaaa2.初始化LCD控制寄存器:rLCDCON1=0x00000178; //配置成为16位颜色,TFT(真彩)模式;rLCDCON2= 0x2077c241; //行数为480;rLCDCON3=0x017A7F0F; //行宽为640;3.设置LCD在内存中的起始地址:rLCDADDR1=0x1904b000; //FrameBuffer的首地址;rLCDADDR2=0x00096000; // FrameBuffer的尾地址;rLCDADDR3= 0x00000300; //虚屏行宽为640;rLCDCON1 += 1; //使能LCD,开始显示;4.绘画函数a. 画像素函数void drawpixel(int x, int y, unsigned short color_mask){unsigned int bits =(SCREEN_WIDTH*y+x)*BITS_PER_PIXEL;unsigned short *tmp;tmp = (unsigned short *)LCD_MEM_BASE+bits/16;//计算像素在内存中的地址;*tmp = color_mask; //给象素填充颜色;return ;}b.画线函数void drawline(int x, int y, int length,int flag, unsigned short color_mask){int i;if (flag==0)//画横线;for (i=0;i<length;i++)drawpixel(x+i,y,color_mask);if (flag==1)//画竖线;for (i=0;i<length;i++)drawpixel(x,y+i,color_mask);}c.画字符函数void draw_char(int x,int y, //字符在屏幕上的坐标unsigned char c, //字符值unsigned short color_mask) //字符的颜色5.绘制的效果图试验四触摸屏驱动一实验目的1、触摸屏驱动--初始化,坐标值的生成2、触摸屏、图形系统协调工作--触摸屏校准,拨号键盘二实验内容int main(void){drawgra();ARMTargetInit();OSInit();LCD_Init(); clearscreen();draw_keyboard();TchScr_init1(); //初始化触摸屏,非中断模式;;//校准触摸屏,在每次启动触摸屏时都运行该程序;OSTaskCreate(Task1,(void *)0,(OS_STK *)&task1_Stack[STACKSIZE-1],Task1_Prio);pevent=OSMboxCreate((void*)NULL);OSAddTask_Init(1);OSStart();return 0;}//main三. 附加说明可能是实验仪器的原因,屏幕矫正这一块总是很难做到,哪怕是你很仔细地去按键,两次得到的结果可能差别很大.这给后来的按键带来不少麻烦.我们按照说明做了,但是还是无法矫正,不知道这个该怎么处理.试验五、六GPRS综合试验一实验目的1、GPRS模块控制试验--串口控制GPRS模块,AT命令集2、综合试验--电话拨号,短消息发送二实验内容寄存器定义:#define OSULCON2 (*(volatile unsigned char *)0x)#define OSUCON2 (*(volatile unsigned char *)0x)#define OSUFCON2 (*(volatile unsigned char *)0x)#define OSUMCON2 (*(volatile unsigned char *)0x5000800C)#define OSUBRDIV2 (*(volatile unsigned short *)0x)初始化:OSULCON0=0x03; //设置串口数据长度、停止位、奇偶校验OSUCON0=0x85; //设置串口时钟频率、中断类型等OSUFCON0=0x01; //设置串口FIFO工作模式OSUMCON0=0x00; //设置流量控制等OSUBRDIV0=0x149; //设置串口波特率为9600bps寄存器定义:#define RdURXH2() (*(volatile unsigned char *)0x)#define RdUTRSTAT2() (*(volatile unsigned char *)0x)void irq_RevUart2(int vector, int ndev){int flag;flag = RdUTRSTA T2(); //读状态寄存器的值;while (flag&0x1) //判断FIFO里是否有接收到的数据;{ //有数据;c=RdURXH2(); // read the char from Uart2;flag = RdUTRSTA T2(); //读状态寄存器的值;draw_charline(c,0x7e0);//将读到的字符在LCD上最后一行显示出来;}}心得体会及建议觉得这几次实验,还是有点收获,起码对嵌入式操作系统有了一定认识,同时也会了一些基本的操作,比如熟悉了软件环境和编程环境,对于linux和arm9也了解了大概.特别是最后实现了打电话和发短信,感受到了嵌入式操作系统的独特魅力.但是总是觉得这几次的实验多多少少还是基本在抄袭已有的代码然后稍加修改就完成了,有时候时间紧根本就没看懂代码直接提交了.我觉得以后的实验要加强独立书写代码的能力,只有这样才能真正锻炼一个人的能力,也才能深刻理解并学习到东西.。

华科路由实验实验报告

华科路由实验实验报告

【实验报告二】 实验2路由实验1 实验目的熟悉Cisco Packet Tracer 仿真软件的基本使用。

掌握基本的路由器配置命令,包括配置端口IP 地址、配置静态路由等。

2 实验环境 2.1 仿真环境Cisco Packet Tracer 网络仿真模拟器。

思科(Cisco)公司是全球网络互联设备的领先供应商,Cisco 公司针对其网络设备产品,开发了一款用于网络设计、配置和故障排除的模拟软件Packet Tracer 。

使用者可以自己选择设备,包括路由器、交换机、集线器、无线AP 、无线宽带路由器、各种线缆、计算机和服务器等,然后完成设备的配置,并能进行测试,感觉和真实场景几乎没有差别。

2.2 网络拓扑结构图1 路由实验网络拓扑图2.3 实验设备路由器:Cisco 1841带WIC-2T 扩展模块,2台。

终端设备:PC 机1台,服务器1台。

线缆:交叉双绞线2根、串行线1根。

3 实验内容 3.1 IP 地址规划客户端局域网,采用10.0.0.0/24地址块。

广域网,使用串行背靠背线缆来模拟,其中Router1的Serial0/0/0端作为DCE ,提供同步时钟速率,Router2的Serial0/0/0端作为DTE,接受对端的时钟速率。

广域网网段采用客户端局域广域网服务器端局域PRouterRouterServeFa0/0 Fa0/0Se0/0/0Se0/0/020.0.0.0/24地址块。

服务器端局域网,采用30.0.0.0/24地址块。

表1 网络地址规划设备名称网络接口IP地址子网掩码备注PC FastEthernet 10.0.0.2 255.255.255.0Router1 Fa0/0110.0.0.1 255.255.255.0Se0/0/0 20.0.0.1 255.255.255.0 DCERouter2 Se0/0/0 20.0.0.2 255.255.255.0 DTE Fa0/0 30.0.0.1 255.255.255.0Server FastEthernet 30.0.0.2 255.255.255.03.2搭建网络拓扑添加路由器打开Cisco Packet Tracer程序,主界面下排第一块区域为“设备类型区域”,在其中选中Router。

华科操作系统实验报告

华科操作系统实验报告

课程实验报告课程名称:操作系统原理专业班级:学号:姓名:指导教师:报告日期:计算机科学与技术学院目录目录 (2)实验一:线程的同步 (3)一、实验目的 (3)二、实验内容 (3)三、实验心得 (6)实验二:誊抄实验的进程实现 (7)一、实验目的 (7)二、实验内容 (7)三、实验心得 (10)实验三:Linux文件目录操作 (12)一、实验目的 (12)二、实验内容 (12)三、实验心得 (14)实验一:线程的同步一、实验目的1、掌握Linux系统用户界面中键盘命令的使用。

2、学会一种Linux下的编程环境。

3、掌握Linux下进(线)程的概念。

4、了解Linux进程同步与通信的主要机制,并通过信号灯操作实现进程间的同步与互斥。

二、实验内容1、程序要求两个线程,共享公共变量a线程1负责计算(+1)线程2负责打印2、运行环境软件配置(含操作系统版本):ubuntu - 14.10硬件:PC3、源程序源程序:#include <stdio.h>#include <stdlib.h>#include <pthread.h>#include <sys/types.h>#include <sys/sem.h>#include <sys/ipc.h>int semid;int a=0;typedef union senum{int val;struct semid_ds *buf;unsigned short *array;struct seminfo *_buf;}SEM_CTL_UN;void P(int semid,int index){struct sembuf sem; sem.sem_num = index; sem.sem_op = -1;//P sem.sem_flg = 0;//biaoji semop(semid,&sem,1); }void V(int semid,int index) {struct sembuf sem; sem.sem_num = index; sem.sem_op = 1; sem.sem_flg = 0; semop(semid,&sem,1); }void* thread1(void *arg) {int i=0;for(i;i<8;i++){P(semid,0);printf("add:\n");a=a+1;printf("a=%d\n",a);V(semid,1);}}void* thread2(void *arg) {int i=0;for(i;i<8;i++){P(semid,1);printf("print:\n");printf("a=%d\n",a);V(semid,0);}}int main(){pthread_t id1,id2;int ret1,ret2;key_t key;SEM_CTL_UN semctlarg1;SEM_CTL_UN semctlarg2;key=1;semid=semget(key,2,IPC_CREAT|0666);//创建semctlarg1.val=1;semctlarg2.val=0;semctl(semid,0,SETV AL,semctlarg1);//初始化semctl(semid,1,SETV AL,semctlarg2);ret1=pthread_create(&id1,NULL,thread1,NULL);ret2=pthread_create(&id2,NULL,thread2,NULL);pthread_join(id1,NULL);pthread_join(id2,NULL);}4、实验结果实验结果截图如下:图1-1 线程同步三、实验心得通过本次实验,我掌握了Linux系统用户界面中键盘命令的使用,熟悉了Linux下的编程环境,进一步理解并掌握了线程的概念,了解了线程同步与通信的主要机制,并能通过信号灯操作实现线程间的同步和互斥。

华中科技大学操作系统实验报告

华中科技大学操作系统实验报告

华中科技大学电信学院操作系统实验报告电子信息与通信学院班级:电信1202班姓名:XX学号:U2012133XX时间:2014年11月5日实验一哲学家就餐问题一.实验目的1.熟悉哲学家就餐问题流程,编译程序,了解程序运行过程。

2.理解利用设置信号量及P、V操作解决进程间的互斥这一方法,并了解其代码实现的相关方法,提炼出代码的思想(用伪代码表示)。

3.对哲学家就餐问题提出新的解决方式,并简述其实现过程。

二.实验原理1、问题描述有五个哲学家围坐在一圆桌旁,桌中央有一盘通心粉,每人面前有一只空盘子,每两人之间放一只筷子。

每个哲学家的行为是思考,感到饥饿,然后吃通心粉。

为了吃通心粉,每个哲学家必须拿到两只筷子,并且每个人只能直接从自己的左边或右边去取筷子。

2、分配方式方式一(不会进入死锁)仅当一个哲学家左右两边的筷子都可用时,才允许他拿筷子。

这样要么一次占有两只筷子(所有线程需要的资源)进行下一步的吃通心粉,然后释放所有的资源;要么不占用资源,这样就不可能产生死锁了。

方式二(会进入死锁)当筷子(资源)可用时,先分配左边的筷子,等待一会后再分配右边的筷子,由于这个过程中,左边的筷子一直没有释放,就有可能产生死锁了。

3、程序运行说明程序运行过程中会弹出一个MessageBox提示操作者操作:1)第一个对话框用于选择运行模式a.选择yes 表示采用的是运行的防止死锁的方式,这样的话整个程序可以一直运行下去,不会产生死锁。

b.选择no 表示运行产生死锁的方式会弹出第二个对话框。

2)第二个对话框用于选择运行时,线程运行的时间a. 选择 res 线程时间比较短,很快就可以死锁b.选择no 线程时间跟选择yes 时候的时间差不多,产生死锁的时间稍微长一点。

三.实验程序流程及分析1、PhilosopherThread函数源代码DWORD WINAPI PhilosopherThread(LPVOID pVoid){HANDLE myChopsticks[2];int iPhilosopher = (int) pVoid;int iLeftChopstick = iPhilosopher;int iRightChopstick = iLeftChopstick + 1;DWORD result;if (iRightChopstick > PHILOSOPHERS-1)码分析:1)在本代码中,为了防止死锁,先确定两只筷子均没被占用才获取筷子,这样就打破了死锁的必要条件中的循环等待条件。

计算机网络实验(华科)

计算机网络实验(华科)
ห้องสมุดไป่ตู้
实验内容:

ARP:
显示和修改 IP 地址与物理地址之间的转换表 指令:arp -a >>g:\显示当前的 ARP 信息.txt 接口: 222.20.69.237 --- 0xd Internet 地址 物理地址 类型 222.20.69.254 00-1a-a9-15-6c-8f 动态 222.20.69.255 ff-ff-ff-ff-ff-ff 静态 224.0.0.2 01-00-5e-00-00-02 静态 224.0.0.22 01-00-5e-00-00-16 静态 224.0.0.100 01-00-5e-00-00-64 静态 224.0.0.251 01-00-5e-00-00-fb 静态 224.0.0.252 01-00-5e-00-00-fc 静态 224.0.0.253 01-00-5e-00-00-fd 静态 224.0.1.242 01-00-5e-00-01-f2 静态 238.184.9.123 01-00-5e-38-09-7b 静态 239.192.152.143 01-00-5e-40-98-8f 静态 239.255.255.239 01-00-5e-7f-ff-ef 静态 指令:arp -a 222.20.69.254 >>g:\显示指定网络地址的 ARP 信息.txt 接口: 222.20.69.237 --- 0xd Internet 地址 物理地址 类型 222.20.69.254 00-1a-a9-15-6c-8f 动态
计算机网络课程 实验报告
实验 1 : 常用网络命令
姓名 实验地点 实验课表现 实验目的: 张京林 院系 南六楼 出勤、表现得分 操作结果得分 自动化学院 实验时间 实验报告 得分 学号 U201013680 4 月 21 日 实验总分

华科电气微机原理上机实验

华科电气微机原理上机实验

微机原理上机实验(第一二次上机)主要内容包括:1.汇编编程上机环境讲解,采用EMU8086V4.952.汇编程序规范编程3.上机编程作业(附提示)详细内容:1.汇编编程上机环境讲解,采用EMU8086V4.951)EMU8086程序简介一般汇编环境是masm软件环境,具体可以到华中大在线上下载。

但是MASM环境是一种在DOS下的编译环境,虽然有debug程序的支持,但对于初学者来说调试观察十分不方便,而且信息又不直观。

Emu8086仿真软件就是在Windows下的一种仿真软件,它可以仿真模拟8086的程序运行,并且可以直观地观察CPU寄存器的变化情况。

Emu8086 - Microprocessor Emulator结合了一个先进的原始编辑器、组译器、反组译器、具除错功能的软件模拟工具(虚拟PC),还有一个循序渐进的指导工具。

这对刚开始学组合语言的人会是一个很有用的工具。

它会在模拟器中一步一步的编译程序码并执行,视觉化的工作环境让它更容易使用。

你可以在程序执行当中检视暂存器、旗标以及记忆体。

模拟器会在虚拟PC 中执行程序,这可以隔绝你的程序,避免它去存取实际硬体,像硬碟、记忆体,而在虚拟机器上执行组合程序,这可以让除错变得更加容易。

这个软件完全相容於Intel 的下一代处理器,包括了Pentium II、Pentium 4,而相信Pentium 5 也会继续支援8086 的。

这种现象让8086 程序码的可携性相当高,它可以同时在老机器以及现代的电脑是执行,8086 的另一个优势是它的指令比较小且相当容易学习。

对于程序类的各种实验,建议用Emu8086仿真软件来进行实验。

Emu8086本身也自带了一些例子程序。

初学者可以观摩别人的写法来安排自己的程序,也可以从中学习各种实用的伪指令及程序结构。

2)EMU8086安装提示安装过程比较简单,请大家自己研究,上机实验时可直接使用试用版本不影响使用,若希望继续使用可自己上网搜取RegKey。

华科微机原理实验报告

华科微机原理实验报告

微机原理实验报告课程:微机原理指导老师姓名:学号:实验名称:Lab 02: MIPS处理器部件实现A微机原理实验报告一、实验目的本实验旨在实现MIPS处理器的部件—控制器和ALU,理解CPU控制器,理解ALU的原理,使用Verilog语言设计CPU控制器和ALU ,使用ISim进行行为仿真。

二、实验原理及说明MIPS的基本架构如图1所示,包括Control,ALU这样的组合逻辑单元,也包括如instruction memory,Data memory和Registers file存储单元。

本实验主要实现CPU Control和ALU两个部分。

(一)CPU控制器的实现CPU Control单元输入为指令的opCode字段,即操作码;以及R指令的funct编码。

操作码和Funct编码经过主控制单元的译码,给ALU,Data Memory,Registers ,Muxs等部件输出正确的控制信号。

图2. MIPS基本指令格式图: 控制模块的IO定义注:Jump指令编码是000010,Jump输出信号为1,其他输出信号都为0图3. OpCode与控制输出的编码关系图4. Funct,ALUOp与ALU Control编码关系(二) ALU的实现ALU是CPU核心的计算单元,实现诸如加,减,或,与等操作。

算术操作的编码三、实验verilog代码(一)CPU控制器的实现module Ctr(input [5:0] OpCode,input [5:0] Funct,output regRegDst,output regALUSrc,output regRegWrite,output regMemWrite,output regMemRead,output regMemtoReg,output reg Branch,output reg Jump,output reg [3:0] ALUControl);reg [1:0] ALUOp;always @(OpCode)begincase(OpCode)//R type6'b000000:beginRegDst=1; ALUSrc=0; RegWrite=1; MemWrite=0; MemRead=0; MemtoReg=0;Branch=0;ALUOp=2'b10; Jump=0;end//beq6'b000100:beginRegDst=1'bx; ALUSrc=0; RegWrite=0; MemWrite=0; MemRead=0; MemtoReg=1'bx; Branch=1;ALUOp=2'b01; Jump=0;end//lw6'b100011:beginRegDst=0; ALUSrc=1; RegWrite=1; MemWrite=0; MemRead=1; MemtoReg=1;Branch=0;ALUOp=2'b00; Jump=0;end//sw6'b101011:beginRegDst=1'bx;ALUSrc=1;RegWrite=0;MemWrite=1;MemRead=0;MemtoReg=1'bx;Branch=0;ALUOp=2'b00;Jump=0;end//Jump6'b000010:beginRegDst=0;ALUSrc=0;MemtoReg=0;RegWrite=0;MemRead=0;MemWrite=0;Branch=0;ALUOp=2'b00;Jump=1;endendcaseendalways @(ALUOp or Funct)begincasex({ALUOp,Funct})8'b00xxxxxx: ALUControl=4'b0010;8'b01xxxxxx: ALUControl=4'b0110;8'b1xxx0000: ALUControl=4'b0010;8'b1xxx0010: ALUControl=4'b0110;8'b1xxx0100: ALUControl=4'b0000;8'b1xxx0101: ALUControl=4'b0001;8'b1xxx1010: ALUControl=4'b0111;default: ALUControl=4'b0000;endcaseendendmodule(二) ALU的实现module ALU(input [31:0] SrcA,input [31:0] SrcB,input [3:0] ALUCtr,output Zero,output reg [31:0] ALURes);assign Zero=(ALURes==1'b0);always @(SrcA or SrcB or ALUCtr)begincase(ALUCtr)4'b0000: ALURes=SrcA&SrcB; //AND4'b0001: ALURes=SrcA | SrcB; //OR4'b0010: ALURes=SrcA + SrcB; //add4'b0110: ALURes=SrcA - SrcB; //substract4'b0111: ALURes=SrcA<SrcB ? 1:0; //set on less than 4'b1100: ALURes=~(SrcA | SrcB); //NORdefault ALURes=32'h0;endcaseendendmodule四、仿真测试1.代码(一)CPU控制器的实现module Ctr_tb;// Inputsreg [5:0] OpCode;reg [5:0] Funct;// Outputswire RegDst;wire ALUSrc;wire RegWrite;wire MemWrite;wire MemRead;wire MemtoReg;wire Branch;wire Jump;wire [3:0] ALUControl;// Instantiate the Unit Under Test (UUT)Ctruut (.OpCode(OpCode),.Funct(Funct),.RegDst(RegDst),.ALUSrc(ALUSrc),.RegWrite(RegWrite),.MemWrite(MemWrite),.MemRead(MemRead),.MemtoReg(MemtoReg),.Branch(Branch),.Jump(Jump),.ALUControl(ALUControl) );initial begin// R-type AddOpCode=6'b000000;Funct=6'b100000;// R-type Subtract#10;OpCode=6'b000000;Funct=6'b100010;// Lw#10;OpCode=6'b100011;Funct=6'bxxxxxx;// Sw#10;OpCode=6'b101011;Funct=6'bxxxxxx;// Beq#10;OpCode=6'b000100;Funct=6'bxxxxxx;// R-type AND#10;OpCode=6'b000000;Funct=6'b100100;// R-type OR#10;OpCode=6'b000000;Funct=6'b100101;// R-type set on less than#10;OpCode=6'b000000;Funct=6'b101010;// Jump#10;OpCode=6'b000010;endendmodule(二) ALU的实现module ALU_tb;// Inputsreg [31:0] SrcA;reg [31:0] SrcB;reg [3:0] ALUCtr;// Outputswire Zero;wire [31:0] ALURes;// Instantiate the Unit Under Test (UUT)ALU uut (.SrcA(SrcA),.SrcB(SrcB),.ALUCtr(ALUCtr),.Zero(Zero),.ALURes(ALURes));initial begin// ANDSrcA =32'hf0f0ffff;SrcB =32'h0000f0f0;ALUCtr =0;// OR#10;ALUCtr =4'b0001;// Add#10;ALUCtr =4'b0010;// Subtract#10;ALUCtr =4'b0110;// set on less than#10;ALUCtr =4'b0111;//NOR#10;ALUCtr =4'b1100;//Other situation#10;ALUCtr =4'b1111;endendmodule2.仿真截图(一)CPU控制器的实现(二) ALU的实现五、实验总结实验名称:Lab03: MIPS处理器部件实现B微机原理实验报告一、实验目的本实验旨在使读者实现MIPS处理器的部件—Data memory, Instruction memory和Registers 三大存储器件。

华工操作系统实验

华工操作系统实验

一、实验步骤:在linux下编写一个应用程序,命名为an_ch2_1b。

这个程序不停地输出以下行:Thoseoutputcomefromchild,[ 系统时间]别的写一个应用程序,命名为an_ch2_1a。

这个程序创立一个子进度,履行an_ch2_1b。

这个程序不停地输出以下行:Thoseoutputcomefromchild,[ 系统时间]观察程序运转的结果,并对你看到的现象进行解说。

在linux环境下编写一个控制台应用程序,程序中有一个共享的整型变量shared_var,初始值为0;创立一个线程并使其马上与主线程并发履行。

新创立的线程与主线程均不停地循环,并输出shared_var的值。

主线程在循环中不停地对shared_var进行加1操作,即每次循环shared_var被加1;而新创立的线程则不停地对shared_var进行减1操作,即每次循环shared_var 被减1。

观察程序运转的结果,并对你看到的现象进行解说。

二、实验数据:文件:#include <iostream>#include <string>#include <>#include <>#include <>using namespacestd;string getTime() an_ch2_1b");return 0;}文件:#include <sys/>#include <>#include <>#include <>int shared_var=0;void*thread( void* arg){while(1){printf( "inthethreadshared_var:%d\n" ,--shared_var);}}int main(){pthread_tpt;1int ret=pthread_create(&pt, NULL,(void*)thread, NULL);if (ret!=0)printf( "failtocreatethread\n" );while(1){printf( "inthemainshared_var:%d\n" ,++shared_var);}pthread_join(pt, NULL);return 0;}生产者花费者问题(信号量)参照教材中的生产者花费者算法,创立5个进度,此中两个进度为生产者进度,3个进度为花费者进度。

华科操作系统课设报告

华科操作系统课设报告

华中科技大学操作系统课程设计实验报告专业:计算机科学与技术班级:1101姓名:许阳学号:U201014241一、实验目的掌握Linux操作系统的使用方法;了解Linux系统内核代码结构;掌握实例操作系统的实现方法。

二、实验要求1、掌握Linux操作系统的使用方法,包括键盘命令、系统调用;掌握在Linux下的编程环境。

●编一个C程序,其内容为实现文件拷贝的功能;●编一个C程序,其内容为分窗口同时显示三个并发进程的运行结果。

要求用到Linux下的图形库。

2、掌握系统调用的实现过程,通过编译内核方法,增加一个新的系统调用。

另编写一个应用程序,调用新增加的系统调用。

实现的功能是:文件拷贝;3、掌握增加设备驱动程序的方法。

通过模块方法,增加一个新的设备驱动程序,其功能可以简单。

实现字符设备的驱动;4、了解和掌握/proc文件系统的特点和使用方法●了解/proc文件的特点和使用方法●监控系统状态,显示系统中若干部件使用情况●用图形界面实现系统监控状态。

5、设计并实现一个模拟的文件系统(选作)三、实验一1、编一个C程序,其内容为实现文件拷贝的功能要实现文件拷贝功能,主要用到的函数是open、write、read。

以前在windows下写C语言打开文件常用的fopen,此时不能用,因为fopen是ANSIC标准中的C语言库函数,在不同的系统中应该调用不同的内核api ;所以应该直接使用linux中的系统函数open。

主要用到的头文件:Unistd.h \\包含了许多Linux系统服务的函数原型,如:read、writeFcntl.h \\定义了很多宏和open,fcntl函数原型Stdio.h \\标准输入输出头文件sys/types.h \\此头文件包含适当时应使用的多个基本派生类型sys/stat.h \\包含了获取文件属性的一些函数errno.h \\用于调试错误代码是所需要的一些errno变量string.h \\包含了处理字符串的一些函数设计思路:由命令行参数获取2个文件名,根据其文件名和路径分别打开该2个文件,设置一个循环,从源文件复制N个字节到目的文件,直到源文件指针到文件尾,最后关闭2个文件。

华科微机实验报告

华科微机实验报告

华科微机实验报告实验名称分支与循环程序设计实验指导教师专业班级姓名学号联系电话一、任务要求1.设有8bits 符号数X 存于外部RAM 单元,按以下方式计算后的结果Y 也存于外部RAM 单元,请按要求编写程序。

240/2204020X X Y X X XX ?≥?=<<??≤?当当当2. 利用51系列单片机设计一个24小时制电子时钟,电子时钟的时、分、秒数值分别通过P0、P1、P2端口输出(以压缩BCD 码的形式)。

P3.0为低电平时开始计时,为高电平时停止计时。

设计1s 延时子程序(延时误差小于10us ,晶振频率12MHz )。

二、设计思路1. 分支程序将外部单元0010H 中的x ,通过分支判断,分别执行不同的语句,三条语句分别为标记为TO1、TO2、TO3,先比较X 与40的大小关系,再判断X 与20的大小关系,主要利用比较转移指令CJNE,以及执行CJNE 指令后的进位位CY ,进一步比较大小,分别跳转至对应语句。

将结果存于外部单元的0040H 以及0041H 。

2.循环程序主程序设计三层循环,分别对应时、分、秒,最内层安放一秒延时程序。

利用R3、R4、R5计数,R2保存秒数,R1保存分钟数、R0保存小时数,最内层循环198次,中循环循环100次,外循环循环100次。

利用循环来设计延时程序,合理计算语句长度,以及循环次数。

程序运行时修正P3.0的值,可以实现暂停计数和继续的功能。

三、资源分配1.分支程序X存于外部数据存储器0010H;Y存于外部数据存储器0040H、0041H。

其中0041H用于存平方时的高位。

2.循环程序R0保存小时数;R1保存分钟数;R2保存秒数;R3、R4、R5计数;P0输出小时数;P1输出分钟数;P2输出秒数。

四、流程图1.分支程序2.循环程序五、源代码(含文件头说明、语句行注释)1.分支程序ORG 0000HLJMP MAINORG 0010HMAIN: MOV DPTR, #0010H ;赋地址指针 MOV A, #8AH ;赋值MOVX @DPTR, ACLR A ;清零 MOVX A,@DPTRCLR C ;清零CJNE A, #7FH, TO1 ;A!=127 SJMP PLACE1 ;A=127TO1: JNC PLACE3 ;A>127CJNE A, #28H, TO2 ;A!=40SJMP PLACE1 ;A=40TO2: JNC PLACE1 ;A>40CJNE A, #14H, TO3 ;A!=20SJMP PLACE3 ;A<20TO3: JNC PLACE2 ;A>20SJMP PLACE3 ;A=20PLACE1: MOV B, A ;平方MUL ABSJMP SAVEPLACE2: CLR C ;求二分之一 RRC A SJMP SAVEPLACE3: CPL A ;取反SAVE: MOV DPTR, #0040H ;平方存位MOVX @DPTR, AMOV A, BINC DPTRMOVX @DPTR, AHERE: SJMP HEREEND2.循环程序ORG 0000HLJMP STARTORG 0010HSTART: MOV SP,#40HMOV P0,#00HMOV P1,#00HMOV P2,#00HMOV R0,#00HMOV R1,#00HWAIT: JB P3.0, WAIT ;p3.0控制程序 JB P3.0, SEC SEC: LCALL DLY ;秒MOV A,R2MOV P2,AADD A,#01HDA AMOV R2,AACALL DLYCJNE A,#60H,WAITWIN: MOV R2,#00H ;分MOV P2,#00HMOV A,R1ADD A,#01HDA AMOV P1,AMOV R1,ACJNE A,#60H,WAITHOUR: MOV P2,#00H 时MOV P1,#00HMOV R1,#00HADD A,#01HDA AMOV P0,AMOV R0,ACJNE A,#24H,WAITSJMP STARTDLY: MOV R5,#32H ;延时循环L3: MOV R4,#32HL1: DJNZ R3,L1DJNZ R4,L2DJNZ R5,L3RETEND六、程序测试方法与结果1.分支程序2.循环程序思考题其它说明:1.标题:黑体,小四号2. 正文:宋体,五号,1.5倍行距3.流程图使用 SmartDraw7 或Visio软件绘制4.不要加封面。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程实验报告课程名称:操作系统课程设计专业班级:学号:姓名:指导教师:报告日期:计算机科学与技术学院目录实验1:进程并发实验错误!未定义书签。

实验概述错误!未定义书签。

实验内容错误!未定义书签。

实验设计错误!未定义书签。

实验过程错误!未定义书签。

实验结果错误!未定义书签。

实验小结错误!未定义书签。

实验2:添加系统功能调用错误!未定义书签。

实验概述错误!未定义书签。

实验内容错误!未定义书签。

阶段1 添加源代码错误!未定义书签。

阶段2 连接新的系统功能调用错误!未定义书签。

阶段3 重建内核错误!未定义书签。

阶段4 修改grub文件错误!未定义书签。

实验小结错误!未定义书签。

实验3:添加设备驱动程序错误!未定义书签。

实验概述错误!未定义书签。

实验内容错误!未定义书签。

阶段1 编写设备驱动程序错误!未定义书签。

阶段2 编译设备驱动模块错误!未定义书签。

阶段3 加载设备驱动模块错误!未定义书签。

阶段4 生成设备文件错误!未定义书签。

阶段5 编写应用程序测试错误!未定义书签。

实验小结错误!未定义书签。

实验总结错误!未定义书签。

实验1:进程并发实验实验概述通过本次进程并发实验,让同学更加熟悉和理解Linux编程环境。

实验内容本次实验的内容主要分为两个任务:1.编写一个C程序,用read、write等系统调用实现文件拷贝功能。

命令形式:copy <源文件名> <目标文件名>2.编写一个C程序,使用图形编程库(QT/GTK)分窗口显示三个并发进程的运行(一个窗口实时显示当前系统时间,一个窗口循环显示0到9,一个窗口做1到1000的累加求和,刷新周期均为1秒)。

实验设计任务1:实验1的第一个阶段需要实现一个简单的C语言程序,首先需要有一个复制的源文件,同时需要创建一个存放复制内容的复制文件,文件复制传输的中间站可以设置一个缓冲数组,此次试验设计了一个大小为10个字节的数组。

打开复制源文件,返回一个INT标识,使用readbuf()函数,每次读取10个字节的内容,将内容存放到缓冲区数组,使用writebuf()函数将缓冲区的10个字节写到复制文件中,重复上述过程直到将整个复制过程完成。

任务2:实验的第二个阶段是实现进程的同步,实现的工具是QT。

主要实现3个进程的同步,3个进程分别为:实时显示系统时间、循环显示0-9、显示1-1000的累加和。

以上程序的刷新时间设置为1秒钟。

使用的是c++编程语言。

为了实现3个进程。

需要为这3个进程分别创建3个不同的类,这3个不用的类具有不同的成员函数,使用成员函数来实现进程的所代表的具体细节。

为了实现进程的结果能实时更新,需要调用connect()函数,该函数的功能是每当其中的timer 每次发生变化时,就回调用该类的成员函数,也就是进程的具体实现,从而实时显示进程的细节内容。

而3个进程的实现是在Main中创建3个类,对应3个进程,调用类的一些函数实现进程并发。

实验过程给出实验过程的详细描述,分步骤说明实验的具体操作过程任务1。

1.首先需要有复制源文件和复制目的文件,具体实现方式如图1-1所示。

图1-1 打开文件分别以只读和只写的方式将文件打开。

2.创建缓冲区,大小为10个字节的数组。

如图1-2所示。

图1-2 创建缓存区3.通过循环读写的方式实现文件的复制,如图1-3所示。

图1-3 文件复制4.关闭文件。

5.其中的writebuf和readbuf是自己编写的一个读和写的函数,调用的是read和write函数。

如图1-4所示。

图1-4 读写函数任务2。

1.首先根据3个不同的进程创建3个不同的类。

如图1-5,图1-6,图1-7所示。

图1-5 进程1图1-6 进程2图1-7 进程32.分别为这3个类编写其对应的成员函数,实现进行的具体功能。

具体实现如图1-8,图1-9,图1-10所示。

图1-8 进程显示时间图1-9 进程循环显示0-9图1-10 进程显示1-1000求和3.在一个入口函数中创建3个不同的子进程,在进程中分别创建对应的类,使用类的方法来实现进程的功能。

具体实现如图1-11.图入口函数4.分别为这3个进程设计器对应的显示菜单,其中部分变量可以通过设置参数的方式进行调控。

并将进程输出结果与Forms中的UI绑定,在进程结果显示在界面中。

实验结果任务1.任务1的内容比较简单,主要使用C语言完成程序的编写,其对应的结果有两种情况,复制成功或者复制失败,从实验1的第一阶段的代码可以看出,失败阶段主要是是因为复制源文件打开失败造成的。

下面主要演示完成正确赋值的情况。

如图1-12所示。

图1-12 运行结果图将infile与outfile进行对比如图1-13,图1-14所示。

图1-13 复制原文件infile图1-14 任务1复制输出文件进过对比可以看出,程序运行的结果正确。

任务2.任务2需要并发执行3个进程,3个进程分别显示系统当前的时间,1-1000的求和以及循环显示0-9,刷新时间为1秒(1000ms),程序的运行结果如下图1-15所示。

图1-15 任务2进程运行结果图实验小结本次实验分为2个任务,第一个任务完成文件的赋值拷贝。

只要是运用write函数和read函数对文件进行读写操作。

操作简单没有什么难度,通过写readbuf 函数和writebuf函数使得读写函数使用起来更加的方便。

运行结果达到了预期要求。

第2个任务需要实现进程的并行以及运行结果的刷新显示,编写的语言是采用c++语言,需要为3个进程创建3个不同的类,在同一个函数入口中对3个并发进行进行操作,并显示其对应的结果。

其中遇到的问题主要集中在两个方便。

一是怎样将输出结果与显示窗口进行绑定,绑定时需要注意什么以及如何调整。

需要去网上查阅资料对对应的参数进行调整,由于QT的环境搭建的很好,学起来还是很轻松的。

将菜单对应的标签与输出结果绑定即可。

第二个问题是怎样实现1秒钟刷新一次输出结果呢查阅资料发现可以使用connect(timer, SIGNAL(timeout()), this, SLOT(MainWindowtm()));每当timer发生变化时就会调用SLOT中对应的函数,该函数就是对应的进程。

每一秒调用一次从而实现刷新。

通过上述方法成功实现了进程并行与输出结果的刷新。

实验2:添加系统功能调用实验概述通过添加系统功能调用,掌握添加系统功能调用的方法。

实验内容采用编译内核的方法,添加一个新的系统调用,实现文件拷贝功能编写一个应用程序,测试新加的系统调用。

阶段1 添加源代码1.任务描述:添加的系统功能调用需要实现一个文件拷贝的系统功能。

2.实验设计:本次实验需要添加的系统功能调用时文件的复制拷贝功能,由于实验1的任务1已经使用c语言实现了该功能则可以借用实验1任务1的思想,只是需要将函数做一些修改,包括函数名格式,入口参数,以及其中调用的其他函数。

3.实验过程:将调用函数名修改为以sys_开头的函数,命名为sys_mysyscall。

文件的打开函数以及输出结果函数也需要使用内核函数,避免内存检查时出现错误。

源代码如图2-1所示。

图2-1 编写系统调用源代码4.实验结果:完成系统功能调用源代码的设计。

阶段2 连接新的系统功能调用1.任务描述:该阶段的任务主要是使得内核的其余部分知道该系统功能调用的存在。

在该阶段需要编辑两个文件,include/linux/以及arch/x86/syscalls/。

2.实验设计:该阶段需要修改include/linux/的代码添加新的系统调用的函数定义。

asmlinkage long sys_mysyscall(int number);接着需要修改arch/x86/syscalls/(系统调用表)在系统调用表中为新增的系统调用分配调用号和系统调用名。

3.实验过程:在系统调用定义中添加新的系统条用定义。

操作如图2-2所示。

图2-2 添加系统调用定义接着需要在系统调用表中为该系统调用分配一个系统调用名和一个系统调用号。

系统调用号为359,系统调用名为mysyscall如图2-3所示。

图2-3 分配系统调用号和调用名4.实验结果:完成第二阶段添加系统定义以及为系统调用分配系统调用名和系统调用号。

阶段3 重建内核1.任务描述:在第三阶段主要完成系统内核的重建。

2.实验设计:,其完成的步骤为:1.生成内核配置文件,2.编译内核映像,3.生成并安装模块,4.安装新的系统。

其中如果报错说没有对应的软件包则需要下载软件包。

3.实验过程:a.首先根据自己的内核版本下载对应的内核源码,生成内核配置文件,接着编译内核映像,实现的操作为:make menuconfig。

运行成功回出现一个弹出框,可以直接退出,如图2-4所示。

图2-4 生成内核配置文件1退出后显示如下结果如图2-5 所示。

图2-5 生成内核配置文件2b.当完成内核文件的配置下面需要完成内核配置映像。

操作为指令为make bzImage。

如图2-6所示。

图2-6 编译内核映像由于在撰写实验报告时已经完成了编译,编译结果如图2-7所示。

图2-7 编译内核映像结果c.接下来需要编译内核模块。

操作指令如图2-8所示。

图2-8 编译内核模块编译结果如图2-9所示。

图2-9 编译内核模块结果d.生成并安装模块。

操作指令为:make modules_install,如图2-10所示。

图2-10 生成并安装内核模块d.安装新的系统。

操作指令如图2-11所示。

图2-12 安装新的系统安装结果如图2-12所示。

图2-13 安装新的系统阶段4 修改grub文件将/etc/default目录下的grub文件注释掉GRUB_HIDDEN_TIMEOUT=0,然后运行update-grub命令。

如图2-14所示。

图2-14 注释掉GRUB_HIDDEN_TIMEOUT=0重启选择新的修改内核选择新的修改内核如图2-15所示。

图2-15 选择新的修改内核编写程序测试编写的检测程序通过系统调用的返回值判断是否赋值成功,如图2-16所示。

图2-17 测试程序4.实验结果测试结果如图2-18,图2-19所示。

图2-18 系统调用测试图2-19 系统调用测试结果实验小结对本次实验使用的理论、技术、方法和结果进行总结。

描述一下通过实验你有哪些收获。

本次实验的工程量还是相当大的,其中需要是实验步骤很繁多,并且必须一步一步全部正确,不然后面的步骤无法完成。

实验课程的PPT教学做的还是很完善的,只要根据要求来,每步做正确,还是很容易的。

实验完成了系统功能调用的添加。

从最开始的编写系统调用源代码的编写到最后的系统功能调用的测试还是遇到了很多的问题。

其中的内核版本的下载一定要和自己的版本很好的兼容,不然可能或多或少出现一些不必要的麻烦。

相关文档
最新文档