摘要:本科嵌入式系统课程的讲授过程中,设备驱动程序作为难点章节,基于嵌入式ARM与Linux实验平台,以LED设备、按键设备为典型案例,教学内容涉及到Linux内核模块的编写与加载、设备驱动程序机制、用户程序访问外部设备三部分,并设计了按键控制LED、基于Web的远程控制两个综合实验。教学效果表明,将抽象知识点案例化,学生学习积极性较高,实践环节中学生完成情况符合预期要求。
关键词:嵌入式系统,设备驱动程序,典型案例,综合实验
1设备驱动程序案例的引入
教学案例的设计遵循简单实用的原则,尽量能够覆盖简单字符型设备驱动程序章节的知识点,达到教学大纲的要求,但同时也要考虑学生的知识接受能力,即通过读懂案例能够使学生清晰理解从而建立学习兴趣和信心。笔者在讲授本部分内容时,结合实验室的ARM-Linux开发板,设计了两个具有层次掌握要求的案例。(1)LED设备的电路原理图见图1,通过GPIO控制LED灯的亮灭。图1LED设备电路原理图该案例包括最基本的设备驱动程序的框架,要求学生必须掌握的该设备驱动涉及到的所有知识点,编写设备驱动程序代码,能够独立在实验室的设备上调试出来。(2)按键设备的电路原理图如图2所示,4个按键连接在外部中断引脚上。该案例的设备驱动程序涉及到一些高级编程,如中断、等待队列、内核定时器与延时、阻塞I/O等,要求学生能够读懂驱动程序代码,将给出的示例程序在嵌入式开发板上调试出来。
2设备驱动程序基础知识教学
笔者在进行本部分内容教学时,为了使学生在宏观上进行认识Linux系统下的设备驱动程序,以案例1LED设备驱动为切入点,引导学生思考,比较无操作系统的LED底层驱动代码和具有操作系统的驱动程序的异同点。在讲解设备驱动程序编写之前,需要强调驱动程序设计中的“机制”和“策略”的概念。“机制”指的是Linux内核的设备驱动接口,即设备驱动程序框架,“策略”指的是如何访问底层硬件。编写设备驱动程序的过程,就是把无操作系统的代码填写到驱动程序框架中,操作系统根据注册的结构体和函数指针,虚拟文件系统才能通过访问设备文件调用对应的驱动实现函数。
3设备驱动程序高级编程教学
案例2按键用作设备驱动程序知识进阶讲授,该案例电路简单但涉及到了阻塞型I/O和中断,还需要在判断按键按下时进行延时消除抖动,故在实现该设备的驱动程序时包括:file-operations结构中函数、中断处理函数、消除抖动定时器函数、模块加载与卸载函数,复杂程度较案例1增加较多。在引导学生分析案例2时,等待队列是核心概念和实现阻塞型I/O的关键,笔者在授课时结合案例中等待队列的应用讲解该结构的函数。
4基础实验教学安排
基础实验目的是为了巩固验证课上的理论知识,笔者所在学校实验采用S3C6410平台嵌入式开发板,linux2.6.32内核,实验安排为4学时,在教师指导下学生独立完成任务为:(1)设备驱动程序的编写,案例1要求能够独立编写完整程序,案例2给出程序框架进行补充等待队列部分的程序代码;(2)编译驱动程序,能够编写makefile文件将驱动程序的C语言源程序编译为模块,鼓励有余力的学生试验修改内核构建系统将驱动程序编译到内核中;(3)加载驱动程序模块,要求能够挂载NFS根文件系统,将二进制驱动程序模块加载到正在运行的嵌入式平台;(4)编写用户程序设备访问外部设备,采用LinuxC语言编程控制LED灯的亮灭、获取键盘键值,涉及到系统调用如open、read、write、ioctl、close等。
5通过综合实验扩展学生的实践能力
合理设置综合性、设计性的实验能够有效激发学生的学习积极性和独立解决问题的能力,本部分实践教学设计了2个不同难度的综合性实验,在2个学时的时间内学生可以根据自己的兴趣和掌握情况选作。(1)按键控制LED灯实验,难度一般,将基础实验中的两种设备进行综合应用,要求按键S1-S4控制D1-D4的两灭,按下S5程序退出。(2)基于Web的远程控制实验,综合了嵌入式软件移植部分的内容,综合性较高,完成的功能为通过http协议和浏览器能够远程控制开发板的LED设备。任务要求学生在移植BoaWeb服务器的基础上,编写html代码提供给用户操作界面。实验难点和主要任务为使用C语言编写CGI程序处理用户提交的参数,点亮或熄灭LED。
6教学效果分析
作为理论和实践并重的章节,学生在实验过程中的情况直接反映了教学效果。在笔者授课的大约30人的计算机科学与技术专业的学生中,要求学生在实验时独立进行。基础实验完成的情况为:提前完成(大约3个学时)4人,能够在规定时间内完成为20人左右;综合实验由学生自主选题,两个题目大约维持半数选择,超过2/3的学生能够按照预期任务要求进行验收。学生参与积极性高,部分没能完成的同学在开发实验室时间也能与教师积极交流存在的问题。
7结语
根据学生在实践环节中的情况,下一步需要改进之处为加强实验过程细节管理,要求学生在课前准备回顾前导知识点,这样在实验中才不会出现如NFS挂载出错、内核代码未经配置就直接用来编译驱动模块等问题;另外,在授课过程中还要考虑与操作系统、计算机组成原理等经典课程的前后呼应,使得理论知识能够融会贯通。
作者:房好帅 朱杰 李楠 单位:北华航天工业学院 计算机与遥感信息技术学院