linux 信号量 自旋锁 测试 实验,嵌入式驱动开发实验指导书.doc

41528d3028836879cd698677c3999917.gif嵌入式驱动开发实验指导书.doc

《嵌入式驱动开发》实验实验一 实验题目:Linux 计算器应用程序及 hello 驱动程序 实验目的:掌握 Linux 常用操作命令、熟悉使用 vi 编程、掌握 gcc/makefile 编译基本方法 实验类型:设计 实验要求:必修 仪器设备:计算机 实验内容、方法、步骤: 一、编写一个计算器程序,实现菜单显示、加减乘除功能。 要求:1)基于 Linux 平台开发 2)使用 vi 编辑器编写 3)使用 gcc 编译 一.课搭建 samba 服务器二.c 编程练习(将 10 个数放入数组,找出最大的一个数,并输出)二、 编写 hello 驱动程序,编译后,进行加载、卸载驱动模块以对 驱动进行测试。 一.hello.c 驱动程序实验二 实验题目:简单的字符设备驱动程序 实验目的:掌握 Makefile 文件编写方法;熟悉字符设备驱动程序设 计、开发和使用流程; 实验类型:综合 实验要求:必修 仪器设备:计算机 实验内容、方法、步骤: 编写一个简单的字符设备驱动程序,完成下列功能,并写出运行 程序后输出的结果。 1) 编写简单的字符设备驱动程序,能够实现对虚拟设备int类 型变量的读写操作;2) 编写Makefile文件,对驱动程序进行编译; 3) 采用动态模块加载方式对驱动程序进行加载,并查看加载前 后效果; 4) 编写测试程序,对虚拟设备进行读写操作,对驱动程序功能 进行验证。 实验步骤: 1)使用如下命令创建驱动源程序文件进行编写。 vim globalvar.c 2)编写相应的Makefile文件。 vim Makefile 3)对驱动程序进行编译、调试,生成globalvar.o目标文件。 make(make clean) 4)加载驱动程序,并查看是否加载成功。 insmod globalvar.o cat /proc/devices (卸载模块命令 rmmod globalvar)(注意:无后缀名) 5)编写测试文件globalvartest.c,并进行编译,生成globalvartest.o可执行文件。 6)创建虚拟设备文件。 mknod /dev/globalvar c 253 0 7)运行globalvartest.o,查看、记录并提交结果。 ./globalvartest.o 提交代码: 1)globalvar.c/globalvar.o 2)Makefile 3)globalvartest.c/globalvartest.o 4)测试结果(.jpg文件) 一.globalvar.c驱动程序 测试程序makefile文件 测试结果实验三 实验题目:并发控制及中断程序 实验目的: (1)掌握linux内核中并发控制的方法,学会运用信号量/队列/自 旋锁进行内核驱动程序中的并发控制; (2)掌握中断处理机制原理,学会使用 tasklet 进行软中断处理。 实验类型:综合 实验要求:必修 仪器设备:计算机 实验内容、方法、步骤: 以简单的字符设备驱动程序globalvar为基础,编写程序完成下 列功能,并写出运行程序后输出的结果。1) 在globalvar驱动程序中,使用自旋锁功能,进行设备打开 操作控制。实现已打开的设备不能再被其他用户和进程打开;并 编写测试程序进行测试; 2) 在globalvar驱动程序中,使用信号量和队列功能,进行设 备读写操作控制。实现:a) 设备不能同时被两个及以上用户和 进程打开; b) 且仅能先写入设备,才能进行读取设备操作;c) 编程测试程序进行功能测试; 3) 在globalvar驱动程序中,使用tasklet功能,进行中断处 理操作。实现在对设备进行写入操作后,通过中断处理方式,打 印信息;并编写测试程序进行测试; 实验步骤: 一,基本操作 1)使用如下命令创建驱动源程序文件进行编写。 vim globalvar.c 2)编写相应的Makefile文件。 vim Makefile 3)对驱动程序进行编译、调试,生成globalvar.o目标文件。 make(make clean)4)加载驱动程序,并查看是否加载成功。 insmod globalvar.o cat /proc/devices (卸载模块命令 rmmod globalvar)(注意:无后缀名) 5)编写测试文件globalvartest.c,并进行编译,生成 globalvartest.o可执行文件。 6)创建虚拟设备文件。 mknod /dev/globalvar c 253 0 7)运行globalvartest.o,查看、记录并提交结果。 ./globalvartest.o 二,自旋锁功能 1)定义及初始化: 包括头文件/asm/semaphore.h static spinlock_t spin = SPIN_LOCK_UNLOCKED; static int count = 0; 2)获取自旋锁在globalvar_open()中获取自旋锁, spin_lock( 3)释放自旋锁 在globalvar_open()中释放自旋锁, if(count) { spin_unlock( return –EBUSY; } count++; spin_unlock( 4) 在globalvar_release()中, count--; 5) 测试MOD_INC_USE_COUNT/ MOD_DEC_USE_COUNT功能。 6)编写应用测试进行测试。 7)提交代码和测试结果(参照实验2方式)。 一. spin.c驱动程序测试程序 运行结果 解释代码三,信号量和队列功能 1)定义及初始化: 包括头文件/asm/semaphore.h 以及 /linux/wait.h static struct semaphore sem; static wait_queue_head_t outq; static int flag = 0; 初始化: 在globalvar_init(void)中 if(ret) .else {init_MUTEX( init_waitqueue_head( … } 2)获取信号量和并判断是否加入队列 在globalvar_read()中获取 if(wait_event_interruptible(outq,flag != 0)) return –ERESTARTSYS; if(down_interruptible( flag = 0; … up(3)在globalvar_write()中唤醒队列 if(down_interruptible( …up( flag = 1;wake_up_interruptible( 4)编写应用test1.c test2.c进行测试。 5)提交代码和测试结果(参照实验2方式)。 四,中断练习 1) void tast_tasklet_action(unsigned long t){ printk(“tasklet is running\n“);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值