对嵌入式软件的开发,讲解的教程、教材都比较多,但这些都还只是在理论上进行说明,并且,对开发环境、仿真器的作用对于一个嵌入式开发的门外汉来讲都是非常复杂的知识,这里就将我所总结出来的嵌入式开发过程的相关概念进行一下解释,主要是对ARM嵌入式中关于片内flash,片外flash,片内RAM,片外RAM的相关调试工作进行一下详细的说明。
我所获取的知识的实践环境还是老样子: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其实就相当于程序烧录地址,也就是说,设置链接器地址时需要对应芯片数据手册、开发板的地址空间范围等,设计好程序运行地址空间,设置链接地址。
对很多概念我也不是很清楚,欢迎大家讨论!