作者:Nathan Z. Gustavson,Eric Rossi
如今,大多数拥有电气工程或计算机科学学位的大学程序员都相当精通Linux桌面平台上的编程。当这些程序员需要对嵌入式Linux系统进行编程时,他们经常感到惊讶和困惑,因为他们在桌面上编写的程序将无法运行他们的Linux嵌入式系统。
为了缓解这个问题,一些程序员选择在嵌入式应用程序中使用桌面系统的版本。这通常不太合适,因为台式机系统通常具有风扇和硬盘驱动器,它们是故障点。一个更大的障碍是快速变化;需要拥有最快,最新的技术,在短短六个月内淘汰了桌面系统。围绕没有寿命的平台设计长寿命的嵌入式产品是一场灾难。
即使桌面平台可以保证从现在起大约五年后,Linux内核和相关发行版也是移动的目标。内核和标准库在不断发展,发行版也在努力跟上步伐。内核补丁和库更新可能会使用户的程序无法运行。当工程师由于安全漏洞或其他问题而需要更新开发计算机时,这种情况会加剧。需要一种将嵌入式开发环境从标准桌面环境中抽象出来的方法。
关键不仅在于找到一个长寿命的嵌入式Linux硬件平台,更是一个长寿命的嵌入式Linux软件平台。有成就的嵌入式Linux程序员通常可以通过收集正确的库和工具版本并适当地修改Makefile来创建嵌入式开发平台。即使成功,它也是一个次优的开发环境。
理想情况下,编译器不应依赖于其主机的库和内核,而应依赖于更静态目标的工具链。软件平台应与其他平台、其他操作系统 (OS) 和其他语言兼容。软件开发工具包(SDK)应该基于具有广泛社区支持的工具链,以便即使推动SDK的组织之一停止支持它,它也能在其他人的肩膀上生存。
输入日食
Eclipse 是一个开源的、可再发行的、跨平台的、用于代码开发的框架。它本身支持 Java,并且 C/C++及其 CDT 插件。它提供了许多由商业集成开发环境 (IDE) 一遍又一遍地重新设计的相同功能(语法突出显示、语言感知搜索、代码完成等),但不依赖于任何一组特定的工具来完成它(请参见图 1)。
图 1:许多由商业集成开发环境(IDE)一遍又一遍地重新发明的相同功能(语法突出显示,语言感知搜索,代码完成等),但不依赖于任何一组特定的工具来完成它
该解决方案的灵活性促使 EMAC 和其他嵌入式软件公司在 Eclipse 环境中构建开发平台。这种商业采用为嵌入式代码开发人员创造了事实上的标准化。OEM 可以编写与 GNU 工具链配合使用的 Eclipse 插件和项目,同时提供与同时运行 Windows 和 Linux 的众多商业平台的兼容性。
嵌入式爪哇
EMAC的原始Eclipse环境是为SoM-400M模块开发的,使用来自达拉斯/马克西姆的DS400 TINI处理器。该处理器的固件包含专有的嵌入式 JRE。为系统构建 Java 代码是通过编译普通 JRE 环境的类,用特定于 TINI 的 jar 替换核心 jar,然后将生成的类转换为 TINI 可执行文件来完成的。
为此,开发人员利用了 Eclipse 的本机 Ant 支持,该支持可用于创建一种 XML 格式的高级 Java 生成文件。然后,Ant 使用 Eclipse 的 JDT 编译器适配器类构建目标,这使得内部编译器可用于 Ant 的任务。然后,源代码锻造的 TiniAnt 扩展执行从 Java 类到 TINI 可执行文件的最终转换。执行此操作所需的所有复杂声明都隐藏在顶级 build.properties 文件中,从而大大降低了 SoM-400M 的编译复杂性,使其成为简单的标准 Ant 任务。
交叉编译 C
Eclipse 工具项目提供了一个开放的、可再发行的 C 开发插件,称为 CDT。除其他事项外,它还提供:
语法突出显示
代码完成
动态构建
调试器集成(使用 GDB 的 MI 接口)
它不提供实际的编译器、链接器和调试器二进制文件。这些特定于要构建的目标,并且必须从外部源提供。然后,可以通过编写 Eclipse 插件,或者更简单地说,通过使用“标准”生成项目并在 Makefile 中指定编译器,将它们集成到 Eclipse 中。
清单 1 中的生成文件将在 EMAC 日食环境中编译一个简单的“你好世界”示例项目。
SDKBASE=。./。./
CROSS=$(SDKBASE)gcc-4.0.0-i486-D/bin/i486-linux-
CC=$(CROSS)gcc
LIBFLAGS =-lc
#VERBOSE=-v
CFLAGS= -g
OFLAGS=-Wl
TARGET=hello
CFILES=hello.c
all: $(TARGET)
$(TARGET): objects
$(CC) $(VERBOSE) *.o $(OFLAGS) $(SLIBS)-o $(TARGET) $(LIBFLAGS)
objects: $(CFILES)
$(CC) $(VERBOSE) $(CFLAGS) -c $(CFILES)
clean:
$(RM) *.o *.gdb $(TARGET)
TARGET_IP=192.168.0.1
LOGIN=someuser
PASSWORD=somepassword
upload:
wput $(TARGET) ftp://$(LOGIN):$(PASSWORD)@$(TARGET_IP)/。./。./tmp/$(TARGET)
与嵌入式 Java 环境一样,所有项目通用的复杂编译器/链接器标志都隐藏在更高级别的文件中,然后由 SDK 中的所有 Makefile 包含该文件。
EMAC 通过针对目标开发操作系统的库构建免费提供的 GNU 交叉编译器,为其所有板提供交叉编译器。在Linux上,这些库是原生的;在视窗上,使用天鹅库。然后,我们“隐藏”实际的 Eclipse 可执行文件,并将其替换为一个批处理文件,该文件在 Eclipse 启动时临时添加支持 GNU 工具链所需的路径。
调试
使用 GDB 和 GDB 服务器进行调试,以方便远程调试环境。为此,将编译后的可执行文件上载到 SBC,并启动 GDBServer 会话侦听特定端口或串行终端。Eclipse 调试透视图允许用户通过指定要使用的连接参数以及为目标体系结构构建的 GDB 版本来调试应用程序。
“调试”透视显示要调试的程序的源代码和生成的程序集代码。它易于管理和监视断点和变量,并且可以逐行逐步完成程序。源代码中的当前位置会自动突出显示。Eclipse 提供了一个图形化调试环境,极大地简化了远程目标调试的过程。
目标沟通
在针对嵌入式环境进行开发时,需要通过串行终端程序或通过 TCP 使用 Telnet、SSH 或其他类似连接与目标板建立连接。当通过命令行界面或图形前端完成此操作时,程序员被迫不断在窗口之间切换,以同时监视连接和IDE。
EMAC 通过集成 Eclipse 插件来消除此问题,这些插件允许在 Eclipse 中实现 SSH、远程登录和终端连接。这允许程序员像监控本地文件系统一样监控嵌入式目标板,并直接发出命令,而无需离开 Eclipse 环境。
CVS
日食本身提供了一个强大的 CVS。通过设置 CVS 登录名并为客户提供密码,开发人员可以确保他们始终可以访问最新版本的代码和产品的错误修复。
将 SDK 的软件补丁和全新组件上传到 CVS 服务器上可为客户提供最新的软件支持,客户能够以图形方式查看文件的差异,并使用部分、全部或全部上传的内容修补自己的 SDK。
文档
Eclipse 提供了自己的本机浏览器,这有利于在工作区中创建 HTML 链接的文档。通过这种方式,客户可以浏览 HTML 文档(类似于由多克西根和爪哇生成的文档)。Eclipse 中还集成了上下文相关帮助(参见图 2),使新用户能够提高工作效率。
图 2:上下文相关帮助也集成在 Eclipse 中
该文档也可以链接回软件开发人员的网站,从而允许动态添加用户文档。用户可以使用选项卡直接从代码切换到文档,而不是一次浏览多个窗口。
集成工具,更好的开发
Eclipse 提供了一个 GNU 工具和商业工具可以一起玩的环境。通过少量集成,OEM可以为他们的电路板创建一个强大的跨平台开发平台,该平台将在许多商业软件供应商采用的同一平台上运行。
在 Eclipse 框架中,EMAC 使用交叉编译来缓解将嵌入式开发环境从标准桌面环境抽象出来的问题。调试是使用带有 Eclipse 窗口的 GDB 完成的,用于调试器的输入和输出。与目标的通信也通过远程登录、FTP、终端和 SSH 插件集成到 Eclipse 中。CVS 版本控制和 HTML 文档也在 Eclipse 环境中完成。
将上述所有开发功能整合到标准IDE中,形成了一个功能强大、高效的开发平台,可以与基于Java的小型8位控制器和用C编程的32位Linux服务器一起使用。这就是日食的力量。
审核编辑:郭婷
全部0条评论
快来发表一下你的评论吧 !