可重定目标的嵌入式集成开发平台设计
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)替代即可,其他地方基本上可以不变。
- 嵌入式系统的定义与发展历史(11-15)
- 嵌入式系统亲密接触(11-22)
- 嵌入式系统设计中的USB OTG方案(02-01)
- 嵌入式线控驾驶系统开发过程中设计和测试考虑(02-02)
- 一个典型的嵌入式系统设计和实现 (02-02)
- DDR SDRAM在嵌入式系统中的应用(02-07)