新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 说说嵌入式调试方式

说说嵌入式调试方式

作者:时间:2016-10-15来源:网络收藏

软件的开发,讲解的教程、教材都比较多,但这些都还只是在理论上进行说明,并且,对开发环境、仿真器的作用对于一个开发的门外汉来讲都是非常复杂的知识,这里就将我所总结出来的开发过程的相关概念进行一下解释,主要是对ARM嵌入式中关于片内flash,片外flash,片内RAM,片外RAM的相关调试工作进行一下详细的说明。

本文引用地址:http://www.eepw.com.cn/article/201610/307387.htm

我所获取的知识的实践环境还是老样子:IAR+JLINK V7.0,这套环境说明一下:IAR是一套非常成熟的嵌入式开发环境,之所以选择它,是因为入门时的项目就是拿他做的,当时用的是LM1138 是M3的ARM核。

作为一个嵌入式的门外汉辛辛苦苦的详细了解了IAR环境的一个调试过程,然后就产生了惰性,哈哈,懒得用别的开发环境了。其实就是这样的,做软件开发的,尤其是嵌入式软件开发,你用什么开发工具其实都是一样的,几种开发工具ADS,IAR,MDK其实都是各有优缺点的,我感觉IAR的环境下官方例程较多,如果采用比较常见的MCU的话,基本在里面都能找到相应的例程的;并且IAR是在不断更新的,目前的最新版本已经到了5.4.1了,相对非常成熟,对各种新的核心支持非常及时;ADS是早期对ARM开发支持的最好的环境之一,兼容所有ARM指令集、伪指令集,应该可以说是标准的开发环境了,但ADS环境永远停留在了1.2版本上,对新ARM核的支持已经无从谈起,它在设计上比较优越的就是将软件调试AXD与编辑ADS是分开两个程序的,我们可以使用ASD对非ADS开发的bin程序进行调试,算是比较方便的,网上的资源相对来讲也是比较多的,如果是嵌入式爱好者使用ADS作为开发环境还是相当不错的。MDK没有用过,不太清楚,不过MDK是ARM在放弃ADS环境支持后选择的第二个官方编译环境,对新内核的支持也是非常迅速的。总的说来,做嵌入式软件开发,选用哪一中开发环境其实都是没有什么关系的,从开发上来讲,他们的主要区别主要还是集中在汇编指令不同、程序入口函数名不同等等,这些非常细节上的东西,对程序主体所使用的C语言是完全相同的。这些开发环境在网上都有相应的破解版,如果是个人作为学习之用选择哪一个都是无所谓的。

作为仿真器来讲,JLINK我认为是非常值得推荐的,主要原因还是JLINK破解的非常完善,随便在淘宝上一搜就有一堆,现在的价钱又非常的便宜,一般在80块左右使用起来就没有问题了,与正版的JLINK在功能上现在已经没有什么区别了。JLINK支持几乎所有片内flash烧录,以及大部分的Norflash的烧录。但JLINK不支持直接的NANK flash的烧录。而目前对产品开发来说所使用的仿真器如ZLG的AK100来说是支持NAND flash的直接烧录的。并且在IAR下不论使用JLINK方式还是RDI的,都是不能使用JLINK的Norflash烧录程序的,只能使用片内flash的烧录算法。

好啦,上面的工具说明就说到这里;下面主要说一下关于IAR环境调试的主要方式。在嵌入式开发中,由于对flash芯片的烧录速度较慢,读取flash芯片的速度也非常慢,而调试的时候需要频繁修改程序,对程序的读取、写入速度对开发速度影响很大。因此对调试来说,一般讲程序直接烧入片内ram或者是片外的ram中运行的,这样调试速度极快。这在IAR中是通过在linker中所设置的icf文件所实现的,在调试时,我们一般讲icf中RAM ROM都设置为片内ram的地址范围,这样程序在链接时所使用的地址范围都在片内ram中,IAR调试时将程序镜像放于片内RAM中,跳转到入口程序__iar_start就可以对程序进行调试了。但有时片内RAM空间并不够使用,我们需要使用片外的RAM,但是我们需要知道,使用片外RAM的话我们需要首先设置CPU内相应的存储器管理寄存器,告诉CPU如何访问片外RAM(主要有片外RAM 地址、大小、位宽、时序等)这部分工作是需要在程序写入片外RAM之前就完成的,所以将这部分指令实现为IAR下的linker设置中的mac文件,在该文件中完成对CPU相关寄存器的设置后,IAR通过仿真器向片外RAM写入数据。这里需要说明一个问题就是异常向量的访问,我们在片内或者片外RAM中调试程序的时候,是不能够运行正常的异常向量的,我们知道异常向量表是在地址空间0x000000的位置的,一般是flash空间,(不经过Remap,MMU的修改,关于Remap,MMU在这里就不进行展开说明了,改日再讨论)而我们的程序都是写入RAM地址空间的,这就导致我们的程序如果进入异常状态那就肯定会跑飞,就是说程序跳转到异常处理函数,而异常处理函数又指向一个不存在的函数地址,这样就非常不方便调试异常状态了。

再说一下关于片内flash,片外flash的调试方法,首先,我们要明确,只要是flash不管是NAND,还是Norflash,对flash芯片的访问都是需要驱动程序的,这是嵌入式初学者经常糊涂的地方,对Norflash来说,它的地址线、数据线连接与片外SRAM,SDRAM其实是差不多的,为什么对SRAM,SDRAM我们只需要在mac文件中设置寄存器,而flash确一定要使用驱动程序那,这里,主要是对RAM的访问,我们只需要设置地址、大小、位宽、时序就可以访问了,而对flash来说,我们在向其中写入或者读出数据,我们首先要向flash芯片内相应的寄存器写入命令才能都完成后续的读取、写入、设置的操作,这就是flash芯片驱动程序的作用。可能有人发现,IAR下对片内flash并没有设置flash驱动程序啊,其实这部分在我们设置工程中使用的DEVICE名称时就自动设置好啦,如我们使用LM1138的芯片,IAR在将程序写入片内flash时,自动调用LM1138的flash驱动函数向flash中写入程序。这样片外flash又该如何操作那,这里就要说一下啦,只要是flash就必须要有驱动,对flash芯片的烧录过程就是首先,IAR在芯片的片内RAM中运行flash驱动程序,将程序烧录入片内或者片外的flash芯片中。片内非flash驱动IAR已经自动设置好啦,片外的flash就需要我们来写驱动了,这里就有两种方式来调用驱动了,一个是在IAR下编译根据flash芯片的数据手册编写驱动,然后通过IAR的flashloader调用编译好的驱动程序,片外flash芯片写入数据。还有就是功能比较全面的仿真器,可以直接在设置时指定片外flash芯片驱动程序,IAR通过相应的调试接口支持相关的仿真器的在线调试。使用JLINK的话只能通过在IAR下编写片外flash芯片驱动的方式开实现对片外flash芯片读写的需要。

最后说一下程序链接与程序烧录的关系,在程序链接时指定ROM,RAM地址的范围,ROM,RAM其实就相当于程序烧录地址,也就是说,设置链接器地址时需要对应芯片数据手册、开发板的地址空间范围等,设计好程序运行地址空间,设置链接地址。



关键词: 调试方式 嵌入式

评论


相关推荐

技术专区

关闭