Creat:一个嵌入式系统项目

作者:Nick Bailey

Creat 代表组合资源嵌入式应用工具包。它是一个从互联网上收集的工具集合,旨在允许 Linux 用户(以及未来任何 UNIX 用户)构建基于摩托罗拉 MC68HC811 8 位微控制器的简单项目。对于项目的硬件部分,其想法是为希望在其毕业设计中拥有少量计算能力的学生提供一个通用微控制器;对于那些希望专攻应用微型计算机的学生,可以研究该项目的内部结构。我希望它能够从“两端”(编程和硬件)都足够易于访问,以便一个领域的专家可以从另一个领域的经验中受益。整个项目最终成为一次积极的体验,也是合作和开放软件益处的教训。

在为练习选择硬件时,我本希望获得一个搭载 Linux 的高端 16 位微控制器。这将为主机和目标平台之间提供无缝集成,但即使是现在,此类项目的成本在资金和开发时间方面都令人望而却步。由此产生的庞然大物可能对于目标应用领域来说是明显的杀鸡用牛刀。在非常低端领域,Linux 社区已经拥有一系列针对 PIC 微处理器的实用工具(请参阅 Brian C. Lane 在 1998 年 10 月《Linux Journal》上发表的“使用 Linux 进行 PIC 编程”),这是一款用于用单个封装替换大量逻辑的有用芯片。更雄心勃勃的项目可能会使用 Linux 本身的微控制器端口(请参阅 D. Jeff Dionne 的 Linux/Microcontroller 主页,http://ryeham.ee.ryerson.ca/uCinux/)。我的目标是介于两者之间的项目:比您计数事件和运行多路复用 LED 显示器所需的处理能力更强,但比运行 X 所需的处理能力更弱。我们典型的项目有一个 LCD 显示器、一个键盘和一些定制电子设备来处理特定于项目的 I/O。中断处理可能很重要,同时还要有足够的灵活性来存储合理数量的数据。这些项目需要具有高度可测试性和可修改性,但为了经济起见,应避免使用特殊的硬件适配器和编程器。

整合解决方案

由于时间和资金有限,明确的前进方向是搜寻互联网。要构建一个有用的系统,必须考虑的不仅仅是硬件。为了与市场上大型且昂贵的套件竞争,我需要一个在线路仿真器、一个编译器/汇编器以及某种下载程序和启动目标板的方法。为了硬核计算机科学家的利益,在线路仿真器是昂贵的设备,一端插入微控制器插座,另一端插入工作站。它们完成一个像样的 IDE 所做的所有事情,但也可以通过监控总线控制信号等来确保硬件正常运行。对于微控制器,鼓励学生插入逻辑分析仪:更像是一个具有大量通道和触发的示波器,可以锁定到特定的数据值,从而锁定到特定指令的执行。您看不到堆栈跟踪或寄存器内容,但您可以准确检查逻辑电平方面的变化。

在利兹大学,所有电子工程专业的毕业生都熟悉 C 语言。那些专攻计算机科目的学生可能还会学习一些解析、X Window 系统应用程序编程、Java 或 C++ 以及 Occam。主要要求是为他们提供“一次成功”的原型设计工具,以便他们可以在工作站上调试程序,并尽可能轻松地“交付”程序。他们执行项目的环境实际上与商业环境非常相似:资金太少,时间压力太大,无法打造出最美观、最优雅的系统。电子电气工程学院没有的一件事是制造镀通孔 PCB(多氯联苯电路板)的设施。由于与该技术相关的严重环境问题,运行成本太高。学生可以通过光刻和蚀刻技术生产单面或双面铜板(他们也已经这样做了),但镀通孔和生产微控制器板确实是不可能的。因此,我们需要制造用于通用应用的电路板。我们在大型面板上进行外部制造并将它们切割开来,以便它们可以用作电气上更简单的项目的大脑,该项目构建在内部制造的电路板上。

Creat 规范要求如下

  • 比 PIC 更强大,具有更大的数据存储容量

  • 对 C 用户开放的开发环境

  • 构建成本非常低廉

  • 应用领域灵活

  • 无需用于编程或维护的特殊硬件

  • 目标系统仿真以帮助调试

合作与竞争

制定了需求规范后,很明显我没有时间从头开始编写所有必要的代码和设计硬件。通常的情况是获得贷款(或课程开发补助金),聘请员工,让他们通过构建又一个微控制器套件来重新发明轮子,然后说服大学尝试将其推向市场。当然,这将引发所有反对发布软件源代码的常见论点,并且即使对于一个简单的系统,到一切都稳定下来时,成本也不会低于 10 万美元。项目的开放性将受到损害;分发、维护和维修问题将会出现。

Creat: An Embedded Systems Project

图 1. 突出显示铜迹线的 PCB

幸运的是,作为电子工程系的一位长期 Linux 用户,我早已接触过 Thomas Nau 的 PCB 程序。(源代码可从 ftp://ftp.uni-ulmde/pub/pcb/ 获取,也可作为 Red Hat RPM 或 Debian 软件包获取。请参阅 README 文件了解更多详情。)

PCB 是一个绘图软件包,具有许多有用的调试辅助工具,包括网络列表导入和导出,但没有自动布线或原理图捕获功能。它非常适合学生手工绘制单面 PCB,这项技能至少尚未被大多数商业软件包取代。软件包的维护已由 Harry Eaton 接管,他负责 Gerber 输出(PCB 制造商中流行的文件格式)等功能。图 1 显示了正在运行的该程序,显示了 Creat CPU 板的一部分。关于 PCB 真正的好处是,它带有一个微控制器电路布局作为演示文件。这是 Thomas 的项目之一,我简直不敢相信自己的运气,因为它具备 Creat 所需的所有属性。事实上,由于 Thomas 的电路板是一个功能齐全的独立应用程序,对于我们需要的任务来说有点过于复杂,所以我着手将其缩小尺寸。

第二个幸运的巧合发生在我收到来自图卢兹毕业生 Jerome Debard 的电子邮件时。他拥有工程学学位,他希望通过在英国工作来获得一些工作经验和语言技能,并准备免费这样做!他接受了缩小 Thomas 电路板尺寸的想法,并在几周的疯狂活动中使其正常工作,包括为其编写运行时库。(他还负责年度通信小组屋顶烧烤的烹饪工作,这是该场合首次受益于拥有一位法国厨师。)

Creat: An Embedded Systems Project

图 2. Creat CPU 板

除了使电路mis au point之外,硬件基本上已经完成。图 2 显示了商业制造后的裸板:它的实际尺寸约为 3.5 英寸见方,并添加了所有组件。要使电路板工作,您必须焊接以纯文本标记的组件。如果您希望它在没有稳压电源的情况下工作,您还需要括号中标记的组件。这为您提供了一个微控制器模块,具有 2KB EEPROM、256KB RAM、28 个数字和 8 个模拟 I/O 线路。这对某些项目很有用,但对于 C 来说还不够。添加以斜体标记的组件可为您提供高达 128KB 的 RAM,但仅留下五个 I/O 线路。幸运的是,摩托罗拉制造了一个非常有用的 PRU(端口替换单元),可以将其挂在地址和数据总线上,透明地将这些线路返回给您。图 3 显示了安装了 128KB 内存的系统的内存映射。(摩托罗拉公司制作了该处理器系列的综合参考手册,参考编号 MC68HC11RM/AD REV 3:Motorola Literature Distribution, P.O. Box 5405, Denver, Colorado 80217

Creat: An Embedded Systems Project

图 3. 系统内存映射

低成本软件开发理念

有了基本可靠的硬件,现在工作开始于开发系统,首先是 C 编译器。回到互联网,回到前面提到的 Donald Jeff Dionne,我在他的公共 FTP 空间中找到了我需要的编译器的二进制发行版。它基于 Coactive(http://www.coactive.com/)的 gcc 端口,非常理想。可以构建一个通用的源代码库,在 Linux 机器上运行,然后为 Creat 板进行交叉编译。二进制文件采用旧的 a.out 格式,我给 Jeff 发送电子邮件,询问它是否已经开发出来。

gcc-hc11 是 Jerome 研究过的 C 编译器,然后匆忙推出了一个运行时库,包括内存分配和基本的字符串 I/O 例程。当时,系里有两位来自巴伦西亚的欧洲共同体交换生,因此基于可用的 gcc,我们开始着手开发一些有用且免费的东西。

通常,将基于微控制器的项目分为两部分是高效的,在将硬件和软件一起使用之前,先独立测试它们。当然,重要的是两个任务要相互告知,但如果项目很大,几乎可以肯定的是,硬件组将与软件组同时进行项目。Creat 旨在通过严格的硬件抽象过程使该过程尽可能容易。当有人构建一个可能具有通用用途的硬件部件时,他们会将其打包。一个包由三件事组成:pcb 格式的 PCB 布局,其外形尺寸与主 CPU 板相同,一组子例程(可以用 C 或汇编程序编写),具有特定的 C 语言接口,以及另一组 C 子例程,它们采用相同的参数,可以在工作站上编译和运行。

关键思想是,任何使用特定硬件(例如点阵 LCD 显示器)的程序都可以使用 Creat LCD 设备接口编写。这提供了两个主要的调用:一个是在设备可以使用之前调用的初始化调用,另一个是在 LCD 上写入字符的调用。Creat 的 make 系统可用于通过发出以下命令为 Linux 机器构建应用程序

make depend; make wkstn

测试后,也可以使用以下命令为 6811 编译代码

make 6811; make boot
软件包中有什么?

Daniel Roques Escolar 和 Alberto Ramos Fernandez 在两个软件包的编码上付出了辛勤的努力:一个用于驱动点阵 LCD,另一个用于驱动行列扫描键盘。我们受到了之前文章(Matt Welsh 在 1995 年 2 月的《Linux Journal》上发表的“从您的 C 程序中使用 Tcl 和 Tk”)的启发,该文章展示了如何通过派生新进程然后执行 wish 副本的方式来执行 Tcl/TK 脚本。通过管道将 wish 连接到父进程意味着可以将命令发送到它,并接收返回的信息。这使得将模拟 LCD 显示为 wish X 窗口非常容易,并且无需编写任何 X 代码即可实现很多目标。即使基于 Xlib 的代码比 wish 脚本执行得快得多,但这应该不是问题,因为它可能是一个 586 级别的处理器与一个 8 位微控制器的比较。

感谢 Danny 和 Alberto,现在至少有两个额外的模块可用,它们可以插入 Creat 总线:LCD 和键盘模块。这些软件包提供了硬件抽象接口,并使用派生的 wish 脚本来模拟屏幕上的 LCD 和键盘。

微控制器往往优于甚至 Linux 的一个问题领域是中断处理。微控制器加载了 I/O 功能,因此存在大量中断源。甚至还有定时器,它们不必与异步外部世界连接,而只是坐在那里生成中断。这些以及其他麻烦制造者给 Linux 平台上的仿真带来了严重问题。编写硬件抽象代码的程序员可能希望生成少量不同的中断,但用于仿真的中断只有 SIGUSR1 和 SIGUSR2。一个定时器就可以产生那么多中断。因此,我们设计了一种模拟多个中断源的方法。

当硬件仿真中存在利益冲突时,重要的是将压力放在 Linux 一侧,而不是微控制器一侧。中断处理方法基本上对 68HC811 是透明的。它相当于响应“register interrupt”子例程调用在中断表中插入一个向量。在 Linux 端,事情变得更加复杂,因为所有生成中断的进程都被告知生成相同的中断。此外,每个进程都与父进程共享一个管道,它们在引发 SIGUSR1 之前通过该管道写入一个字节。当处理程序被调用时,它使用 select 对所有管道进行操作,以确定哪个进程需要服务,然后在其自己的服务例程表中查找并调用相应的例程。列表 1 显示了注册中断进程的代码。

有了可用的注册过程,就可以创建导致中断发生的软件包。最简单的例子是定时器设备,它以规则的时间间隔生成中断。创建定时器设备的例程是 init_timer,对于微控制器来说,它只需要设置适当的定时器中断向量并启动自由运行模式下的硬件定时器。在工作站上编译时,该函数注册一个中断源,然后派生一个函数,该函数大部分时间处于休眠状态,偶尔醒来并发出信号。代码出现在 列表 2. 中。

无论中断源是定时器还是其他一些模拟 I/O 设备,每次发出信号时都会调用相同的中断服务例程 sigusr1_handler列表 4)。信号处理程序可以访问已注册进程的列表,因此它可以调用 scanlist (列表 3) 来捕获罪魁祸首并执行关联的中断服务例程。整个过程就像一种中断多路复用器,因此借助管道列表,可以将适当的源与适当的服务例程关联起来,即使所有可能的源都发出相同的信号。

我们做了什么;我们学到了什么?

实际上,我所做的只是管理一个项目。该项目拥有一些优秀的资源,我的投入是指引他们朝着我认为在教育上有用的方向发展。我希望“真实”的应用程序(无论它们是什么)也会发现这个软件包很有用。整个捆绑包在我的网站上以软件包的形式提供(http://www.ee.leeds.ac.uk/homes/NJB/Software/linux-stuff.html#creat),您可以在线浏览 Danny 和 Alberto 编写的手册。Thomas 的 PCB,经过 Jerome 和其他人修改,也在那里,以及端口替换单元 PCB 和上面提到的所有其他软件。该手册包含 130 多页。

我希望人们会受到鼓舞,为这个项目贡献软件包。到目前为止可用的模块并非完全完整。我需要整理中断注册表,使其真正模块化,并使向量插入在微控制器上工作。LCD 模块的问题需要解决,例如 Tcl/Tk 脚本中显示尺寸是固定的;并且需要构建 gcc6811 的新版本,使用最新的 gcc 作为基础和 glibc。然而,从积极的方面来看,延迟我解决这些问题的事情之一是整个系统实际上似乎运行得相当好。图 4 显示了模拟键盘和 LCD,背景中有一个简单的计数器在滴答作响。

Creat: An Embedded Systems Project

图 4. 工作站模拟简单配置

致谢

Creat: An Embedded Systems Project
Nick Bailey (n.j.bailey@leeds.ac.uk) 获得了杜伦大学计算机与电子学学士学位。曾在伦敦西区的英国电信应用技术部门工作,之后返回杜伦大学攻读并行计算在音频信号合成中的应用博士学位。他目前是利兹大学电子电气工程系应用计算机系统专业的讲师,并额外负责海外和欧洲联络工作。他喜欢老旧、不可靠的快速汽车,拥有一把大提琴,但在这些方面都没有表现出明显的才华。
加载 Disqus 评论