关于基于ARM嵌入式软件设计教学的若干探索
2013-04-02于杰
于杰
(厦门大学嘉庚学院 计算机科学与技术系,福建 漳州 363105)
关于基于ARM嵌入式软件设计教学的若干探索
于杰
(厦门大学嘉庚学院 计算机科学与技术系,福建 漳州 363105)
嵌入式软件设计是当今社会需求的一个热点,也是高校计算机专业教学的一个难点,长期以来高校的嵌入式软件设计教学存在着忽视开源软件教学工具,轻视软件调试教学,和缺乏软件设计实例化等问题,本文主要在实际教学的基础上,总结出若干解决办法,从而达到提高嵌入式软件设计教学水平的目的.
嵌入式;软件设计;软件调试;开源软件;项目化;教学
目前,嵌入式产品已经无处不在,通信、信息、数字家庭和工业控制等领域,随处都能见到嵌入式产品.而ARM系列的处理器更是其中的佼佼者,这使得基于ARM的嵌入式系统成为当今计算机领域最热门的学科之一,庞大的嵌入式软件系统的市场急需大量合格的专业人才,这无疑为高校的嵌入式软件设计教学带来了新的机遇[1].但与此同此,嵌入式知识的学习非常广泛,不仅要学习程序设计的知识,同时也涉及到数据结构,计算机组成原理,操作系统和编译原理等相关知识,这样为相应的教学带来了不小的挑战,如何既能做到联系相关课程的知识,又能突出嵌入式软件设计本身的特点,便成为当前嵌入式软件设计教学急需解决的问题.而本文主要总结了作者在嵌入式软件设计教学方面的经验,希望能够对其他高校的嵌入式软件设计教学有所启发.
1 开源软件和开发环境的引入
目前高校传统的嵌入式软件教学主要采用的是ADS、RVDS、以及CodeWarrior等国外商业软件进行,这些商业软件有着稳定可靠、方便易用、可扩展性强等诸多优点,但是由于其商业性质的原因,也不可避免的带来了,诸如知识产权,软件费用,以及盗版泛滥等相关问题,这些问题已经严重的影响了嵌入式软件教学的进一步发展.把开源软件长期排除在外,使开源软件教育以商业化培训为主,是少数人才能接受的“阳春白雪”式高端教育,未能形成开源人才的规模化培养.对于国内众多开源企业来说,“招不到合适的人才”也成为长期困扰企业发展的瓶颈之一.而把开源软件和开发环境引入高校课堂当中,正是对开源软件普及型教育的一种体现,也是增强计算机专业毕业生竞争力的一种手段.
为此,笔者根据本校基于ARM的嵌入式软件设计教学实际情况,使用GNU-Make与编译器配合负责代码的管理.GNU-Make可以支持大多数PC操作系统,包括Windows、Linux、MacOS等,GNU-Make的机制简单易懂且适用于模块化的系统,而且GNU-Make其完全免费的特性,更可以在实验室等环境大面积的使用,而没有费用问题,这样就为学生的学习搭建了一个有效的平台,而且,该平台由于没有过多的封装,开放其内部的细节,也适合学生进一步的了解,且具有良好的跨平台移植能力,可用于多种教学和实验环境中.
2 软件调试的引入与强化
2.1 嵌入式软件调试教学的起因
在大多数传统的基于ARM嵌入式软件设计更多的是强调怎样进行软件的设计,希望通过程序设计的教学,让学生掌握相应的知识,但这样带来的一个问题就是学生会认为软件开发的主要过程就是设计和编码的过程而对调试和测试的理解和掌握不够深刻.初学者在设计编写程序的时候,很可能出现各种意料之外的情况,比如突然有一个错误报告,或者给出一个看似正确但却并非我们期望的结果,也可能忽略用户的命令,甚至长时间没有反应等,这些都是需要通过软件调试来进行解决的.笔者在教学过程中注意总结出初学者易犯的若干种错误,并给出解决这些错误的常见调试方法.
2.2 调试工具GDB的引入
通过对调试工具GDB的引用来向学生介绍常见的调试方法和思路,比如调试中必不可少的内容—断点,向学生讲授关于断点的细节,包括设置、删除和禁用断点,从一个断点移到另一个断点,查看关于断点的详细信息等等.而对于这些调试最适应的算法,当非树的遍历莫属,这样就采用实例涉及遍历树的代码,重点是介绍当到达断点时如何方便的显示树中节点的内容.再比如由于段错误而产生的致命运行时错误,笔者首先介绍了崩溃时在底层发生了什么事,包括程序的内存分配以及硬件与操作系统的协同作用.并继而向学生介绍核心文件,包括如何创建核心文件,如何使用它们来完成“事后反思”.
2.3 错误代码的解决
使用GDB工具进行调试的前提是代码的成功编译,但是在实际的软件开发当中,学生经常会遇到代码不能编译的情况,那么这时候,GDB调试工具将变得无能为力,因此一些常见的处理这种问题的方法也需要介绍给学生,比如如何处理缺少必要的库造成的连接失败问题,比如如何处理编译器指出第x行有语法错误,而事实上第x行完全正确,真正的错误在前面的某一行.而这些过程中学生们会发现他们以前学过的确认原则,二分法搜索原则非但不再抽象,晦涩,反而是一种有效的解决问题的方法和手段[2].
3 以系统移植为重点的实例化教学
现有的嵌入式教材大体可以分为两类,一类教材泛泛而谈:ARM、MIPS、x86等各种体系结构处理器均做了介绍;uC/OS、Linux、WinCE等各种操作系统也是一一罗列其特色,但这种教材对于学生来说,更多的是走马观花的查阅,很难掌握嵌入式的基础知识,更无法了解基于某一款处理器的基本开发过程.另一类教材通常是由嵌入式系统实验设备厂家提供的,基本就是数据手册加实验手册,学生使用这种教材往往只见树木不见森林,也很难系统掌握嵌入式系统的基本理论和概念[3].
笔者在从事基于ARM的嵌入式软件设计教学工作中,根据自己的授课经验,总结出一套实例化的教学方法,由于嵌入式程序开发平台(PC机)和运行平台(嵌入式设备)的不同,所以所有的嵌入式开发遇到的第一个问题,毫无疑问的就是软件的移植,所以笔者的实例化教学也是围绕着软件移植而展开的.
首先是Bootloader的移植,介绍了Bootloader相关知识、移植方法及要注意的事项.之后以U-boot为例,详细的分析了U-boot代码,并修改U-boot代码,使之支持Norflash和Nandflash、Nandflash启动、DM9000网卡和YAFFS文件系统.通过本实例的学习,学生将会对嵌入式通用的Bootloader有一个大体的了解,并且可以熟练的移植U-boot和使用U-boot.
其次是内核的移植,对Linux内核组成和目录进行讲解,分析Linux内核的Makefile,解释了Makefile的编译流程,之后讲解如何对内核进行剪裁配置,使之支持YAFFS、RTC时钟、LCD和DM9000等,最终实现了在ARM平台上的内核移植,这样学生将对Linux内核有一个更深入的了解,学会如何进行内核的剪裁和内核的移植,同时以Busybox为基础进行嵌入式开发板文件系统的移植,这样学生通过对文件系统的选择,对嵌入式系统特点有更深入的了解,也将熟练的掌握如何配置一个文件系统并对其进行移植.
再次是驱动程序的移植,首先对Linux设备驱动进行了介绍和分类,讲解了设备驱动程序的移植步骤,以Hello world、led和按键三个实例介绍了Linux设备驱动的移植过程,之后讲解了如何完善串口、USB、声卡和SD卡的驱动.通过这些的学习,学生将会明白Linux设备驱动的重要性,学会如何写一个简单的Linux设备驱动并将此驱动编译进内核,或者以模块方式加载到内核中,之后学生将学会如何完善Linux已有的一些驱动程序.
最后是应用程序的移植,先对嵌入式GUI进行简单的介绍,并对常见的一些GUI进行交叉编译和安装,之后进行音频解码器madplay的移植、数据库SQLite的移植和Webserver的移植,通过这些学习,学生将掌握应用程序移植的关键,达到举一反三的目的,尝试移植更多的应用程序.由于现在Android系统的火爆和市场对Android人才的大量需求,笔者也加入了对Android系统的移植讲解.
总结,通过上述教学方法的实施,学生的学习目标更加的确定,并使得学生对理论学习热情和主动性都有所提高,加强了学生的动手能力,这些经历可能会改变一个人的学习和工作习惯,也许对学生来说是受益终身的.另外,由于学生在大学期间已经有了一些项目开发的基础,从文档写作到涉及编码的过程都得到了锻炼,因此学生很容易找到工作,就业之后,也能非常顺利的实现过渡.
〔1〕文全刚.嵌入式linux操作系统原理与应用[M].北京航空航天大学出版社,2011.
〔2〕张云.软件调试的艺术[M].人民邮电出版社,2009.
〔3〕李宁,宋薇,库少平.项目化嵌入式教学方法研究[J].单片机与嵌入式系统应用,2010(2):5-8.
G642
A
1673-260 X(2013)10-0240-02