引 言
嵌入式运用软件的开发与通用计算机软件开发不同,因为受资源束缚,嵌入式软件开发一般需求在专门的开发渠道上进行穿插开发(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,且扩展性较好,价格低廉,现已被国内许多高等院校和一批中小企业所选用,并已投入批量出产。可是,完善、晋级以及对新式芯片的习惯还需进一步作业。在我国现在的状况下,开发具有自主知识产权的嵌入式集成开发渠道是一项含义严重、困难且绵长的作业,期望本文能够起到学习和抛砖引玉的效果。