如今,大多数从大学毕业并获得电气工程或计算机科学学位的程序员都非常精通 Linux 桌面平台上的编程。当这些程序员需要跨越式地对嵌入式 Linux 系统进行编程时,他们常常会感到惊讶和困惑,因为他们在桌面上编写的程序无法运行他们的 Linux 嵌入式系统。
如今,大多数从大学毕业并获得电气工程或计算机科学学位的程序员都非常精通 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 的众多商业平台的兼容性。
嵌入式 Java
EMAC 的原始 Eclipse 环境是为 SoM-400M 模块开发的,使用 Dallas/Maxim 的 DS400 TINI 处理器。该处理器的固件包含专有的嵌入式 JRE。通过为普通 JRE 环境编译类,用 TINI 特定 jar 替换核心 jar,然后将生成的类转换为 TINI 可执行文件来完成为系统构建 Java 代码。
为此,开发人员利用了 Eclipse 的原生 Ant 支持,它可以用来创建一种 XML 格式的高级 Java Makefile。Ant 然后使用 Eclipse 的 JDTcompileradaptor 类构建目标,这使得内部编译器可用于 Ant 的任务。Sourceforge TiniAnt 扩展然后执行从 Java 类到 TINI 可执行文件的最终转换。执行此操作所需的所有复杂声明都隐藏在顶级 build.properties 文件中,从而极大地降低了将 SoM-400M 编译为简单的标准 Ant 任务的复杂性。
交叉编译的 C
Eclipse 工具项目提供了一个开放的、可再发行的 C 开发插件,称为 CDT。除其他外,它还提供:
语法高亮
代码完成
即时构建
调试器集成(使用 GDB 的 MI 接口)
它不提供实际的编译器、链接器和调试器二进制文件。这些特定于正在构建的目标,并且必须从外部源提供。然后可以通过编写 Eclipse 插件将它们集成到 Eclipse 中,或者更简单地说,通过使用“标准”make 项目并在 Makefile 中指定编译器。
清单 1 中的 Makefile 将在 EMAC Eclipse 环境中编译一个简单的 Hello World 示例项目。
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 上,这些库是原生的;在 Windows 上使用 Cygwin 库。然后,我们“隐藏”实际的 Eclipse 可执行文件,并用一个批处理文件替换它,该批处理文件在 Eclipse 启动时临时添加所需的路径以支持 GNU 工具链。
调试
使用 GDB 和 GDBServer 进行调试以促进远程调试环境。为此,将编译后的可执行文件上传到 SBC 并启动 GDBServer 会话,侦听特定端口或串行终端。Eclipse 调试透视图允许用户通过指定要使用的连接参数以及为目标体系结构构建的 GDB 版本来调试应用程序。
Debugging 透视图显示要调试的程序的源代码和生成的汇编代码。易于管理和监视断点和变量,以及逐行单步执行程序。源代码中的当前位置会自动突出显示。Eclipse 提供了一个图形化的调试环境,极大地简化了远程目标调试的过程。
目标沟通
在为嵌入式环境进行开发时,需要通过串行终端程序或使用 Telnet、SSH 或其他类似连接通过 TCP 与目标板建立连接。当这是通过命令行界面或图形前端完成时,程序员被迫不断地在窗口之间切换以同时监视连接和 IDE。
EMAC 通过集成 Eclipse 插件消除了这个问题,这些插件允许 SSH、Telnet 和终端连接都在 Eclipse 中。这允许程序员监控嵌入式目标板,就像它是本地文件系统一样,并直接发出命令,而无需离开 Eclipse 环境。
CVS
Eclipse 原生提供了强大的 CVS。通过设置 CVS 登录并向客户提供密码,开发人员可以确保他们始终可以访问最新版本的代码和产品的错误修复。
将 SDK 的软件补丁和全新组件上传到 CVS 服务器可为客户提供最新的软件支持,客户可以以图形方式查看文件中的差异,并使用已上传的部分、全部或不修补自己的 SDK 。
文档
Eclipse 提供了自己的本机浏览器,这有利于在工作区中创建 HTML 链接文档。通过这种方式,客户可以浏览 HTML 文档(类似于 Doxygen 和 Javadoc 生成的文档)。上下文相关的帮助也集成在 Eclipse 中(参见图 2),使新用户的工作效率更高。
图 2:上下文相关的帮助也集成在 Eclipse 中
该文档也可以直接链接回软件开发人员的网站,从而允许动态添加用户文档。用户可以使用选项卡从代码直接切换到文档,而不是一次浏览多个窗口。
集成工具,更好的开发
Eclipse 提供了一个环境,让 GNU 工具和商业工具可以一起发挥作用。通过一点点集成,OEM 可以为其开发板创建一个强大的跨平台开发平台,该平台将在许多商业软件供应商采用的同一平台上运行。
在 Eclipse 框架内,EMAC 使用交叉编译来缓解将嵌入式开发环境从标准桌面环境中抽象出来的问题。调试是使用带有 Eclipse 窗口的 GDB 来完成的,用于调试器的输入和输出。与目标的通信也通过 Telnet、FTP、终端和 SSH 插件集成到 Eclipse 中。CVS 版本控制和 HTML 文档也是在 Eclipse 环境中完成的。
将上述所有开发功能整合到一个标准 IDE 中,形成了一个强大、高效的开发平台,可以与基于 Java 的小型 8 位控制器和用 C 编程的 32 位 Linux 服务器一起使用。这就是蚀。
作者:Nathan Z. Gustavson,Eric Rossi
审核编辑:郭婷
-
嵌入式
+关注
关注
5068文章
19008浏览量
302965 -
Linux
+关注
关注
87文章
11219浏览量
208872 -
服务器
+关注
关注
12文章
9010浏览量
85160
发布评论请先 登录
相关推荐
评论