可重定目标的嵌入式集成开发平台设计

嵌入式系统 时间:2017-06-04来源:网络

引 言

嵌入式应用软件的开发与通用计算机软件开发不同,由于受资源约束,嵌入式软件开发一般需要在专门的开发平台上进行交叉开发(cross developing)。同时,由于嵌入式系统的开发及嵌入式软件的调试也非常复杂,因而迫切需要强有力的集成开发平台(Integrated Development En-vironment,IDE)作为支持,以保证程序执行的实时性、可靠性,保障软件质量,并缩短开发时间。因而,对MCU系统开发平台和开发环境的研究近年来备受重视,出现了比较著名的嵌入式开发软件,如ImageCraft公司的IC-CAVR、Freescale公司的CodeWarrior等。当前,在我国高等院校及嵌入式系统产品的研发企业中,绝大多数都使用国外的嵌入式系统集成开发平台。原因很简单:MCU绝大多数是进口的,国外集成开发平台功能完善、稳定。另外,由于嵌入式系统集成开发平台具有芯片相关性,这就为我国研制嵌入式系统集成开发平台增加了难度。因此,开发具有自主知识产权的嵌入式系统集成开发平台是一件很有意义且具有挑战性的工作。从2001年开始,苏州大学在Motorola M68HC08系列MCU上尝试开展这一工作,并开发了MT-HC08/S08型嵌入式集成开发平台,命名为“MT-IDE For Motorola HC08/S08”。为了克服开发平台适用范围的局限性,通过实验确定,开发平台模块可分为“与芯片无关”和“与芯片有关”两大部分,这样就可彻底地分割开来,实现可重定目标。因而,在先前研究的基础上又成功研发了可重定目标的集成开发平台(SdIDE),且已成功应用于Freescale HC08/S08/S12、M*Core、C*Core、ColdFire及ARM等系列MCU芯片。本文主要介绍这项成果,并对开发平台的可重定性和通用性的关键技术给出必要的阐述。

1 设计思路

考虑到GNU Tools是开源软件,且完全覆盖编译开发工具(如gcc等)、调试工具(如gdb)等)和软件工程工具(如make等),可有效地开发嵌入式系统。因而,选择GNU Tools作为IDE的交叉开发工具,会有较好的推广前景。在设计过程中,重点考虑以下三个方面。

1.1 编程调试器方案的确定

在早期的MCU开发中,程序固化于EPROM中,擦除时间较长,操作繁琐,程序调试困难。为解决此问题,仿真器技术得以较快发展,用软件来模拟目标系统中MCU的运行情况,但是使用仿真器往往把目标硬件与软件独立开来,难以实现100%的硬件模拟。

片内Flash 储器的使用,使得嵌入式系统的开发可以不再使用仿真器,而是直接调试目标系统。Flash存储器虽然有写入、擦除次数、寿命方面的限制,但一般都可以达到10万次以上,故开发过程中不必顾及Flash的寿命问题。目前单片机内Flash都是可以在线编程的,即在线写入、擦除,在线调试程序。由此可见,如今嵌入式系统的开发可以彻底脱离仿真器方式。所以,本文设计的编程调试器是充分利用Flash存储器特点,直接面向目标系统的编程调试方式(如BKGD模式)。

1.2 开发平台的通用性

一般嵌入式集成开发平台都与具体的单片机相关,很多集成开发平台只能针对一种MCU芯片,移植起来非常不方便。本文在开发平台的通用性上做了较深入研究,使其便于移植。在硬件相关部分尽可能对GNU Tools开发工具所支持的系列MCU通用,与MCU有相关性的参数由PC机方的IDE软件处理,使IDE与MCU相对独立。考虑到许多笔记本电脑没有串行口,编程调试器与PC机的接口采用USB,以提高适用性。本文给出嵌入式系统集成开发平台SdIDE,把系列MCU的下载与调试接口设计在一块评估板上,可以适用于多种MCU型号,对新型号也给出了加入方法。

1.3 开发平台的可移植性

嵌入式开发平台一般针对某一厂商生产的MCU,或针对某一系列MCU。但其中运行于PC方的IDE在工程管理、编辑功能上具有公用性,编译设置、下载与调试等功能虽然与硬件相关,但可以通过调用参数数据库的方式,用软件的方法避免其直接与硬件打交道,提高IDE的可移植性。一种嵌入式开发平台可以尽可能地做到对某一系列MCU通用,但很难做到适用所有的MCU。因而,没计一个可以方便移植到其他系列MCU平台上的IDE是很有意义的。本文在IDE可移植性方面做了大量的研究工作,并成功地将其移植到Freescale HC08/S08/S12系列微控制器、M*Core核的MMC2107微控制器、C*Core核的CCM3118微控制器、ColdFire核的MCF5271微控制器和ARM核的AT91RM9200微控制器上。

2 SdIDE集成开发平台的软件功能设计

可重定目标集成开发平台SdIDE是一个高度集成的标准的Win32界面,包含编辑器、编译汇编链接器、调试器、工程管理、Flash在线编程及程序下载等交叉工具,采用Visual C++MFC编写。该集成开发平台包含工程管理、编辑、编译、链接、程序下载与调试等功能,为了使其具有可重定目标的特性,因而在其功能模块上将其划分为公共模块和私有模块两大部分。下面具体介绍各个模块的功能及其软件设计思想。

2.1 SdIDE公共模块

这里公共模块是指与编译器和目标MCU无关的模块,实现工程管理与编辑功能。设计时,一定要把它们与整个系统切割开来,便于移植。

2.1.1 源文件编辑模块

提供源文件编辑,支持剪切、复制、查找、替换,完全支持中文和语法高亮显示(Syntax Highlight)。此部分主要的技术难点是语法高亮显示,以及如何解决半个汉字问题。使用MFC的RichEdit控件可以解决此问题,但没有语法高亮功能。作者在RichEdit的基础上编写了语法高亮类,使用效果较好。

2.1.2 工程管理

在SdIDE集成开发平台中,工程是一个非常重要的概念,它是用户组织一个应用的所有源文件、设置编译链接选项、生成调试信息文件和最终目标文件的一个基本结构;提供对源文件、库文件以及其他输入文件的管理,并含有编译与链接等设置。

2.2 SdIDE私有模块

私有模块是指与编译器和目标MCU相关的模块,实现编译、链接、程序下载与调试等功能。为了满足可移植性,采用数据耦合的方式设计。

2.2.1 交叉编译模块

包括C/C++编译器、汇编器、链接器、目标文件格式转换工具等。编译模块根据选用的MCU型号调用GNU移植过来的m68hcll、m68k、arm、mcore或ccore等编译器,编译成功后生成标准的Motorola S-record文件或Bin文件等。汇编器将汇编语言程序转换为可重定位目标代码(如Elf格式,执行时链接文件格式),易于定位和链接。链接器根据链接定位信息,将可重定位的目标模块链接成一个单一的、绝对定位的目标程序,链接后的目标程序可以包含调试信息。

2.2.2 程序下载模块

在PC方编写下载界面,通过设定MCU的环境变量及公用参数,分析S格式文件后通过TBDML写入头,把数据下载到空白芯片。

2.2.3 调 试

与过去的仿真方式不同,本开发环境的调试是通过BDM头直接对MCU中的程序进行调试。BDM头除实现Flash写入、擦除功能外,还可以在应用程序运行时,动态地获取CPU、存储器等瞬态信息。BDM调试工具与单片机的通信通过双向的BKGD引脚实现。调试模式有两种:单步调试和断点调试。

3 SdIDE可重定目标的技术要点

3.1 GCC编译器的基本特点及其调用的方法

该开发环境使用的是由GNU移植的GCC编译器。GCC是由美国自由软件基金(FSF)开发和维护的软件,它是一个跨平台的C语言编译器,完全兼容ANSIC,支持目前大多数CPU体系,具有开放的开发模式,且性能优异。SdIDE通过建立子进程的方式调用该编译器,具体方法如下:把GCC所支持的所有编译器目录放在该开发环境的安装目录下,采用线程管道的方法来捕获由“make.exe-f”命令对makefile脚本文件(是针对GCC编译器支持的所有MCU而编写的较通用的脚本文件)进行编译的输出信息流,并显示在SdIDE的信息输出窗口中。如果捕获的编译输出信息出现任何错误,包括源文件语法错误和其他错误,则编译、链接操作立刻终止,并在输出窗的Build子窗口中提示错误。若是语法错误,则用户可以通过双击错误提示行来定位引起错误的源文件行,并且用语法高亮显示。

3.2 更换编译器的设计

为了实现SdIDE可重定目标的特性,最主要的是要安排好如何编写较通用的makefile脚本文件,这样SdIDE开发环境可根据所选定的MCU型号来调用一个新的编译器工具集。因而,在makefile中所有使用编译器名的地方都用同一个变量来代替。更换编译器时,只需修改变量定义的地方,其他所有引用这个变量的地方不用改变。makefile是编程人员和make之间的接口,本设计通过写makefile文件来说明各模块的依赖关系。makefile文件要严格按其书写规则来编写,其中的内容大致可分成宏定义区和基于依赖关系的指令区两大部分。宏定义区主要是定义一些变量,可以在makefile的任何地方被引用;在建立makefile之后,就可以使用make命令来完成所需的编译工作。

在SdIDE开发环境中更换编译器的软件设计思路如下:

① 把GCC支持的编译器目录全部放在开发环境的安装目录下,以便程序调用。

② 把Cygwin.dll复制SYSTEM32目录下。为了在Windows平台上构建GNU工具链,需要安装Cygwin。Cygwin是一个基于DLL的Unix仿真层(位于Win32之上)。它提供了Unix风格的环境,包括Bashe外壳和GNU工具,这样就可以建立交叉编译器工具。

③ 在选定目标平台(即目标芯片)后,程序自动确定所需要调用的编译器,把编译器名赋给一个全局变量——CompilerName。

④ 更换makefile脚本文件中的编译器名。主要是将makefile脚本文件中用到编译器名的地方全部用变量来替换,即在makefile文件的宏定义区定义一个变量,如COMPILERPREFIX=CompilerName。在makefile文件中用到编译器名的地方用$(COMPILERPREFIX)替代即可,其他地方基本上可以不变。

3.3 更换编译参数

若需要编译命令定义一组编译参数选项,且这组编译参数选项会被多个规则(或编译器命令)引用,那么可把这组参数选项赋值给一个变量,把这个变量放在所有引用它的地方。当需要改变参数选项时,只需要在变量赋值的地方改变一下。变量可在makefile文件的宏定义区定义,定义变量的方法与3.2小节相同。

4 编程调试器的设计方案

4.1 程序下载

SdIDE提供系列MCU的程序下载与调试,系列MCU通过串行接口、BDM或监控模式进行程序下载与调试。

程序下载部分的功能,在该集成开发平台中也是根据所选的MCU型号不同,决定调用不同的程序下载模块来实现。例如:若对AT91RM9200T和MCF5271微控制器进行程序下载,则使用JTAG头下载,因而调用其相应的下载模块程序。下面以Freescale S08/S12系列微控制器的下载为例,阐述BDM方式下载。该方式对FreescaleS08/S12系列MCU都是可行的,它们都有BKGD引脚,支持背景调试和程序下载。

下载程序的功能包括S19文件分析模块以及Flash存储器的擦除和写入模块;但采用BDM头下载时还要包括TBDML通信模块,该模块负责通过USB接口将PC方的S-record机器码写入到空白的Flash存储器的指定区域。S19文件分析模块则负责对S-record标准的S19文件进行分析,将文件的内容转换成方便传输的格式,以及判断文件中程序的起始地址、页数、是否越界等。下载程序先将Flash擦写程序数据和用户程序数据写入RAM的指定区域,当一页的用户程序数据写入到事先分配的RAM区后,则可通过调用tbdml动态链接库函数来实现擦除和写入操作。BDM头下载程序的工作流程如图1所示。

4.2 程序调试

程序调试是IDE的重要功能之一,也是开发嵌入式集成开发平台的难点之一。下面简要介绍本开发系统所实现的调试功能。

断点设置:在调试状态下,用户可以使程序的执行停留在设置了断点的代码行上,系统提供各寄存器的值、程序中定义的变量值以及Flash中相应地址的值等信息。设置了断点的代码行将以红色高亮显示。

断点调试:设置断点后,用户可进入断点调试模式。在断点调试模式下,当前即将执行的代码行将以红色高亮显示,如图2所示。同时在SdIDF集成开发平台的右侧会出现3个用于调试的信息窗口:Register窗口中显示的是各寄存器的当前值(各寄存器的值会自动显示);Watch窗口中显示的是变量的值(在变量地址中输入变量名,例如I1,按回车即可);Memory窗口中显示的是存储器中的内容(在地址中输入Flash地址,例如0x8000,按回车即可),如图3所示。在断点调试状态下,系统提供相关的命令:设置断点、清除断点、退出调试、单步步人、单步步过和执行。

结 语

一个可重定目标的嵌入式集成开发平台研制的难点在于IDE的可重定性和编程调试器的实现。针对GCC编译器所支持的系列MCU,本文介绍的开发环境实现了IDE可重定目标、编程调试器,形成了目前较通用的嵌入式集成开发平台SdIDE,且扩展性较好,价格低廉,已经被国内许多高等院校和一批中小企业所采用,并已投入批量生产。但是,完善、升级以及对新型芯片的适应还需进一步工作。在我国目前的情况下,开发具有自主知识产权的嵌入式集成开发平台是一项意义重大、艰难且漫长的工作,希望本文可以起到借鉴和抛砖引玉的作用。

关键词: 嵌入式 集成开发 平台设计 MCU

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章


用户评论

请文明上网,做现代文明人
验证码:
查看电脑版