借助树莓派提升本科汇编语言教学
1. 引言
在最近的教学实践中,计算机科学学生通常通过学习高级计算机语言来接触编程。尽管掌握高级语言编程的重要性不可否认,但很难说学习汇编语言对于理解底层计算机体系结构不是至关重要的。遗憾的是,尽管汇编语言仍然是计算机科学中的一个基础主题,初学汇编语言的程序员常常发现用它编程的过程枯燥且令人沮丧。这并不奇怪,因为汇编语言编程通常是一个繁琐的过程,并且常被描述为“枯燥”[1],“难以学习”以及“令人困惑”[2]。如果课程涉及复杂的高级汇编语言编程技术,这种印象可能会被进一步放大,尽管这些技术在许多计算机科学、信息技术和工程领域被认为是必不可少的。
因此,高等教育工作者强烈希望使学生学习汇编语言的过程变得更加有趣和富有成效。
树莓派于2012年作为计算机科学的教学工具推出,是一种价格实惠、体积相对较小的设备,内置ARM处理器,并支持多种外设。其配备的通用输入输出(GPIO)接口使其特别适合用于教授各种I/O协议。我们在汇编语言编程课程中使用树莓派的动机在于,希望让学生在学习汇编语言的过程中获得更大的乐趣,同时使他们接触到一种现代架构(类似于当今无处不在的移动设备中所使用的架构)。我们还认为,让学生亲眼看到并亲自操作真实的物理设备(而非看不见且远程的服务器),将有助于打破软件与硬件之间的概念壁垒。因此,本文旨在回答的主要研究问题是:采用树莓派是否能够改善学生的学习体验和学习成果。
树莓派通常配备Linux操作系统,使用树莓派的教育机构通常将其作为独立计算机(运行Linux)来使用。相比之下,我们的方法是将树莓派用作嵌入式设备。当存在一个过度保护的操作系统来守护硬件资源时,无法实现对硬件的直接编程,因此我们在树莓派上使用最小化操作系统(仅使用第一阶段引导加载程序),从而允许学生直接对硬件进行编程。
尽管树莓派已被许多高校用作教学工具(并且在[8]中作为高中生的动机),但由于该设备的新颖性,目前仅有少数研究对这些经验进行了深入分析。例如,Brock等人讨论了树莓派如何被用于一系列中学计算机课程[5],而Foltz则讨论了如何在本科阶段利用它来教授网络管理[9]。尽管Hooper在一个研讨会上从入门级别介绍了如何使用C++和ARM处理器汇编语言对树莓派进行底层编程[10],但据我们所知,我们将树莓派用于本科计算机科学课程中教授底层编程的做法是独一无二的。
除了树莓派之外,还有其他可用于教授软硬件接口的替代方案(例如,Arduino或现场可编程门阵列(FPGA)等嵌入式设备已被用于此目的),但这些设备通常不具备可比拟的一套内置外设接口。此外,也可以采用支持操作系统的“实模式”(允许直接硬件访问)的架构,本文所描述的课程正是由此发展而来。
2. 课程背景
CPSC 359课程的主题是为大学计算机科学专业三年级学生开设的,该课程标题为“计算机械II”,是本科阶段的课程,旨在获得学士学位。在本课程中,学生将学习通用计算机知识,而在CPSC课程中则涉及接口。学生还将学习逻辑设计、机器处理、硬件操作等内容。通过这些主题,本课程帮助学生理解计算机体系结构和操作系统的基本原理。
在2013年秋季、2014年冬季和2015年冬季的注册人数分别为61、112和112,每节实验课有学生参与,与讲座时间相结合的课程环节,旨在让学生获得实践经验。
该课程的主要目标是让学生掌握ARM汇编语言编程、硬件/软件组织概念,接触数字硬件I/O、中断等概念。课程内容包括在树莓派上进行“裸机”(无操作系统)编程,以一种直观的方式呈现。尽管该系统具有代表性,但示例展示了遍历数据结构以绘制标题屏幕,并允许有限制地使用系统功能,以便程序能够接收来自超级任天堂娱乐系统(SNES)控制器的输入,失败消息则根据评估结果进行处理,学生被给予选择权。
在使用Windows[3]时。尽管如此,树莓派是学生参与度的关键因素。
3. 汇编语言教学中的树莓派使用
3.1 硬件设置
为了使交叉编译程序能够正常工作,该地址包括:
a) Raspberry Pi
b) Custom breakout board
c) Segger™ JLink EDU debugger
d) Super Nintendo Entertainment System (SNES) controller
e) HDMI display
f) USB to TTL serial adapter
硬件通过(通用输入输出)接口连接到主机,用于连接第二台计算机的设备通过树莓派上的通用输入输出接口进行通信,该接口还连接了串行输入设备到通用输入输出。
树莓派在开发功能齐全的操作系统时,其特点是树莓派系统本身不依赖复杂的设备,而是基于基本的用户输入和输出。该系统配备了第二年本科生可用的鼠标驱动程序,该驱动程序用于处理输入。输入由专用模块处理,每个模块负责控制特定的硬件。
裸机汇编需要向ARM处理器提供树莓派,以及促进图1中树莓派的实现。树莓派引入了新的程序,树莓派操作系统不提供编译功能,因此还必须通过USB连接来实现。本科生的汇编语言实验包含用户输入,涉及最底层的接口操作,该实验包括以下描述的内容。
用户输入的方法。最后,树莓派原生的HDMI接口(e)连接到显示器,从而提供来自树莓派的图形输出手段。
3.2 软件设置
为树莓派编写裸机汇编需要与直接在设备本身上编写和运行程序不同的软件设置。由于树莓派不会使用功能完整的操作系统(即,我们使用一个简单的操作系统,而不是Linux,该系统不提供文本编辑器、编译器或调试器等工具),学生必须在另一台计算机系统(以下简称主机)上编辑和编译他们的程序。
主机上的编译器必须能够交叉编译源代码,以生成可在树莓派上运行的可执行二进制文件。调试带来了额外的挑战,因为主机上的调试器需要与在远程系统上运行的程序进行交互。
工作站上的软件设置使用了Linux操作系统的发行版。在工作站上安装了一个针对树莓派ARM11架构构建的GNU编译器集合(gcc)版本,提供了跨平台编译器和调试器。此外,在主机计算机上还安装了由Segger™提供的GNU调试器(gdb)服务器(JLinkGDBServer),以允许主机上的gdb调试客户端与连接到树莓派的JLink EDU远程调试单元之间进行通信。
为了在JLink EDU远程调试单元与树莓派之间建立连接,必须通过一系列软件命令将用于JTAG通信的GPIO引脚设置为正确的模式。为此,学生需编译一个“最小化”内核镜像,该镜像仅包含启用JTAG GPIO引脚所需的代码,并将其从主机复制到SD卡中,然后插入该SD卡并启动树莓派。此处的一个难点是,在本文撰写之时,第一阶段引导加载过程的详细信息尚未公开,因此学生无法自行重建引导加载过程的这一阶段。为解决此问题,首先使用原始的Raspbian发行版(可从树莓派网站获取,其中包含第一阶段引导加载程序)写入一张SD卡,然后通过用“最小化”内核镜像覆盖第二阶段引导加载过程中使用的内核镜像文件来修改该SD卡。
当树莓派插入包含“最小”内核镜像的SD卡并通电后,可以在主机上启动JLinkGDBServer。成功建立连接且调试器服务器运行后,学生可以使用他们用ARM-targeted编译器编译的内核镜像,启动针对ARM的gdb客户端,并与JLinkGDBServer实例建立远程调试连接。此时,学生在gdb客户端中执行命令,将内核镜像上传至树莓派的随机存取存储器,设置树莓派的程序计数器寄存器指向内核镜像的起始位置,并继续在设备上执行。如果成功,学生的新的内核镜像将开始在设备上运行。
3.3 其他注意事项
尽管学生使用树莓派的整体经验普遍有利,但应该指出的是,我们创建的专用实验花费了超过3万加元,用于约34个工作站(包括4个教学人员工作站)。尽管这一成本对某些机构来说可能过高,但值得注意的是,该实验室配备的完全是新设备,包括新的高端主机和双显示器(一台用于主机,一台HDMI显示器用于树莓派)。因此,需要注意的是,通过简单地利用现有的主机实验室设备,这一成本可以大幅降低;将现有实验室改造为支持树莓派的附加成本可能非常低,仅包括HDMI显示器(如有必要)、JLink设备以及一些廉价配件的费用。此外,还有比我们实验室所使用的HDMI显示器更便宜的显示方案,可以利用树莓派的RCA视频输出功能。
树莓派本身及其配件的成本非常低;在2015年冬季,一个组装套件(包括电源适配器、SIM卡、线缆和保护外壳)的价格约为85美元(加元)。请注意,所有学生在注册该课程时都必须购买树莓派及配件。
还应注意的是,由于冬季学期的注册人数超过100名学生,在临近作业截止日期的高峰时段,学生很难找到实验时间和空间。无法在家进行学习(由于需要专用硬件)对学生来说明显不利,但在家中复制实验室工作站的成本相对较低,可在今后的课程中鼓励这种做法。学生只需额外配备一个HDMI显示器、一个JLink EDU设备以及我们本地制造的扩展板即可。
4. 课程目标
由于本文描述了使用树莓派进行汇编语言教学的情况,值得注意的是,若干树莓派相关主题被列为课程目标,包括但不限于以下内容:
高级ARM汇编编程 :学生将学习堆栈、子程序概念(在汇编语言中的实现)、二维数组以及中断服务程序。
通用输入/输出 :通用输入输出是用于为微控制器提供灵活输入/输出的知名机制。通用输入输出允许学生将各种输入/输出设备连接到树莓派。然而,编写设备接口函数需要大量的编程工作(即通用输入输出并非即插即用)。学生需要熟练掌握通用输入输出寄存器的使用,包括设置GPIO引脚功能(如输入、输出或特殊功能)的寄存器,以及读取或设置GPIO引脚值的寄存器[7]。
通用异步收发传输协议 :UART是一种低速串行协议,广泛用于设备间简单的通信。树莓派通过其GPIO接口提供对UART(以及一种称为mini-UART的简化实现)的支持。该协议相对容易向学生呈现,学生需要从零开始实现一个通用UART设备的驱动程序。
视频编程 :树莓派通过帧缓冲架构提供对视频编程的支持,该架构通过内存映射I/O进行访问(即,通过内存加载和存储指令访问帧缓冲)。在树莓派上,缓冲区通过邮箱接口进行初始化,并用于建立ARM核心与视频核心(或图形处理器)之间的通信。除随机存取存储器外,还使用一组寄存器来实现此通信,学生必须熟练掌握这些寄存器的使用以及初始化帧缓冲[7,13]的协议。
中断和异常 :ARM架构具有多种不同的执行模式,以及软件或硬件中断)变化和注册理解向量程序状态寄存器(SPSR)中断服务使用上升或下降中断)变化和注册理解向量程序状态寄存器(SPSR)中断服务使用上升或下降。学生需处理硬件线路问题。
5. 旧版本课程平台
值得注意的是,先前课程中使用的是基于x86架构的系统,运行于实地址模式下的Windows 98环境。该模式允许开发交互式内容,在本课程中,学生必须在Windows版本的特权操作模式下工作,该选项以及其他过于保护性的安全限制使得访问硬盘硬件变得困难。
显著的本质在于前任的c库(VES)与它们协同工作也是必要的,需要解决专门的PS/2问题,他们编程和如前所述,Windows 98需要一个特殊的驱动程序,因此需要专门的配置。尽管如此,这里存在两个问题:一个是实质性的问题,另一个至今仍然适用。许多学生在课程发布后从该环境中获得了反馈,但他们对此感到失望。
第二个问题涉及持续存在的实验限制,学生表示当他们在字面意义上“变化”时会感到气馁。出现的问题是,x86架构变得越来越依赖于备件,我们最终转向了DOSBox[17],学生直接参与与运行旧机器相关的,随着后续任何故障的mac 7]逐渐增多,同时在接收时对实际硬件感到越来越不满意。
在x86机器上,学生可以访问硬件资源(其中,在第二版课程中)带来了显著的课程变化,涉及设备驱动程序编写。不幸的是,由于操作系统不再支持某些旧系统(例如),开发者难以继续进行相关工作。
为了实现当前迭代的可交付成果(不依赖于操作系统),较新版本不再提供之前版本中可用的某些功能(如Linux)。目标是编写直接在硬件上运行的程序。未更改树莓派。底层视频15],需要内存映射I/O。GA显示器(带显示器),以及开发人员(需要中断处理程序)。后续实地址修改了课程al,使用Windows 98版本的课程设置。第一,在spi上,这些点是通用的,集成环境使人们相信这一点。实践反馈表明,有相当数量的人具备计算能力“远古”。
可持续性使得ng Windows 9更难处理hines。为解决此问题,需通过使用模拟器来提升th的服务质量。
6. 成绩对比分析
根据卡尔加里的规定,字母分值在0.0到4.0之间,A+对应4.0,F对应0.0。学生的成绩分配给每次考试,以便对学生成绩进行评分,从而可以计算出学生系列的平均绩点。
在2013年秋季学期,共有13名学生参加了该课程(x86架构)并完成了课程。在对每位学生的平均成绩进行统计后,得出平均绩点为2.986(标准差0.730)。这些结果相当于B级,即学生的平均字母成绩为B−。
在2014年冬季学期,38名学生在使用x86架构的课程中,以及319名学生在使用Raspberry Pi的课程中,字母成绩的绩点为2.542(标准差0.846),对应图2中那些的分布情况。
图2展示了使用x86和Raspberry Pi两种平台的学生绩点分布情况。数据显示,采用树莓派后,学生整体平均绩点有所提高,且分布更为集中(标准差减小),表明学生表现更加稳定,落后学生人数减少。
图3. 正态性检验结果显示,树莓派组的成绩分布与x86组相比具有统计显著性差异(p值 < 0.0001),支持树莓派对学习成果有积极影响的结论。
7. 调查结果
7.1 定量分析
表格1显示了学生在使用树莓派时的反应,他们对学习过程感到满意,其中大部分学生表现出相似积极的态度。
| 项目 | 强烈同意 | 同意 | 中立 | 不同意 | 强烈不同意 |
|---|---|---|---|---|---|
| (a) 我享受在树莓派上工作 | 22.73% | 43.43% | 20.71% | 7.58% | 5.56% |
| (b) 树莓派的使用增强了我的学习 | 66.16% | 29.29% | 15.66% | 1.01% | 1.01% |
| (c) 树莓派的使用激励了我 | 82.32% | 15.66% | 15.66% | 2.02% | 2.02% |
| (d) 我想学习更多关于低级编程 | 52.53% | 35.86% | 18.69% | 18.69% | 10.10% |
| (e) 我更想了解游戏编程 | 71.21% | 14.65% | 14.65% | 14.14% | 14.14% |
| (f) 我会独立继续学习相似的主题 | 60.61% | 19.70% | 19.70% | 10.61% | 9.09% |
表格2呈现了报告的关注点,参与者对低级别编程研究的反应。在所有情况下,反应都是积极的。
7.2 定性分析
参与调查的人员在自由选择的分析中,学生对选项(a)的选择表明了存在的变化。第一个主题是关于开发环境的满意度:“然而,事实是,这种显式性过于复杂,学生继续日常技术表示不同意ARM是一种当前的新颖但痛苦的方法:树莓派被过度……”
第二个主题是家庭中的匮乏:“相关性,技术是有趣的……与问题当前技术由于故障而显得突出,通信变得复杂。”以实验室空间中的中心为基准的代表性反馈。
享受者们是否同意该部分取决于他们个人的回应,这些回应介于同意与非享受者的中立之间,并且两者都与树莓派相关,回应具有显著性差异(p<0.01)。她的学生们的平均成绩分别为4.08。与享受者相比,这一项目的平均回应显示出两者之间存在显著差异,对于这两个群体而言都极为明显。研究结果表明,学生们认为该项目有助于提升并改善了他们的学习体验。
难以解释受仪器或“强烈树莓派”影响的情况。一名学生表示:“Although I enjoy the idea of the Raspberry Pi, the project took up an enormous amount of my time, far more than any other course. […] Working at the OS level is interesting […], but the project required extensive debugging, and we could only use the Raspberry Pi on campus.”
8. 结论
在本科阶段教授汇编语言编程通常具有挑战性,这往往归因于学生认为该主题枯燥乏味。此前为抵消这种偏见所做的尝试(在本文讨论的前身课程《计算机械学II》中)包括引入视频游戏开发,以在学生学习过程中增加“趣味性”。虽然我们在当前课程设计中保留了这一元素,但我们进一步考虑引入一种更贴近计算机行业现状的现代平台。使用配备ARM处理器的信用卡大小的计算机正符合这一需求,主要原因在于移动设备在学生日常生活中的广泛存在。
本文表明,由于采用树莓派作为学习平台,绝大多数学生对学习软硬件接口和汇编语言的动机显著增强。另外,大多数学生也表明,树莓派提升了他们的学习体验以及对该主题的兴趣和享受程度。
这些结果源自学生在调查工具中提供的“自我评估”,与我们对学生表现的定量分析高度一致。我们发现,当《计算机械学II》课程从x86平台转向树莓派后,该模块相关考试的平均绩点显著提高。此外,标准差减小(结合图2中分布情况的直观检查以及更高的平均绩点),表明在这门具有挑战性的课程中,落后学生的人数减少。
在进一步改善体验的任务上,应当注意到,树莓派似乎只说服了约30%的受访学生去进一步自主学习底层编程。尽管这无疑是一个值得肯定的结果,但要继续提高这一比例仍然是一项艰巨的任务。这一结果引出了以下问题:如果一名学生享受在树莓派上使用汇编语言进行编程,并表示这是一次难忘的学习经验,那他们为何仍不愿意独立地进一步学习该主题?对此可以采取什么措施来解决?
最后,尽管该经验对大多数学生普遍有利,但定性分析也表明了两个需要改进的方面:一是“不友好的”开发环境,二是实验室访问的便利性。对于开发环境被认为是“不友好”的这一看法,目前难以做出太多改善,因为交叉编译和使用JLink调试设备在现阶段是不可避免的复杂环节。改善实验室访问同样困难,因为扩大实验室设施需要在空间紧缺的情况下寻找新的场地,并投入更多资金。一种可能的解决方案是为希望在家用计算机上复制开发环境的学生提供帮助和资源。这对学生而言额外成本相对较小(当然,如果学生更愿意在校内工作,这完全是可选的)。
在选择特定平台以实现普遍的教学目标时,总会存在权衡取舍。正如我们所展示的那样,通过特定平台向学生展示真实世界的经验,以教授通用概念,对学生非常有益。但是,必须特别注意确保“特定平台的细节不会淹没教学目标”。[14]
2079

被折叠的 条评论
为什么被折叠?



