内存技术对嵌入式自控系统产品的样机研制、生产和现场升级等都提供了诸多好处。系统内可编程ISP节省了大量的时间,提供了更多的灵活性,并且消除了采用非易失存储器所固有的浪费。
自控系统开发商为满足日益高涨的用户需求,须加速新品的研制,同时还要解决IC供货、开发工具等诸多技术经济问题。为此,人们开始寻求简单、快捷、经济的技术解决方案。分析证明妙用存储技术,对系统开发商意义巨大。
系统内可编程(ISP)设计可以极大的简化样机研制。传统方式人们需借助EPROM来制造样机,程序员调试程序,需要反复的进行擦写工作,这个过程需花费4到5分钟以上的时间,给程序员带来了诸多不便。若我们对MCU预编程,设计人员可将待调试的程序下载到RAM中进行调试工作,这样可省去反复擦写芯片之苦,加快了研发进程。
同时系统内可编程设计降低了研制费用。程序员借助MCU供应商提供的调试仿真工具,在调试中断、MCU外围IC时往往感到困难,高价购得的专用调试工具有时未能物尽其用;而且为了调试复杂的外围器件往往须单独做专门的实验板。系统内可编程技术允许程序员在装配结束后,在系统内编程,从而解决了上述问题,进而避免因ROM编程造成不必要的时间和经济上的浪费。
借助系统内可编程设计,可以提供更为简易灵活的现场服务。任何系统都需要升级,也许是因为无法避免的程序中的“Bug”, 也许是因为系统应用要求的改变,如被控对象变化进而要求变更控制策略。改程序就要替换器件或烧录程序,那将是一个成本高昂的方案。系统内可编程的程序存储方法消除了产品升级必须亲临现场的限制。产品可通过网络或电话线等媒介进行升级。
简言之,由RAM和FLASH MEMORY技术提供的系统内可编程的程序存储方法增加了设计的灵活性,而且降低了产品的研制、制造和现场升级的成本。
实现原理
微处理器在寻址方式上对于程序存储区和数据存储区不加以区分,使得系统内可编程(ISP)可以直接实现。为了不烧录程序即可调试程序,须先将程序当做数据下载到指定的内存中去,一旦程序下载完毕,经校验正确,可下发命令控制MCU跳转到指定的RAM区去执行待调试程序。在这里必须明确的一点是:以上所指的“指定的RAM区”从系统程序的角度看实际是一段数据区,只不过它所存储的数据比较特殊,存储的是程序代码;从待调试程序的角度看,它是程序区。另外,我们可以设计一些辅助程序以实现变量跟踪、程序单步执行等调试功能。这样一来,可省去反复擦写芯片之苦,而且可方便的调试中断、MCU外围器件。
以上方案虽并非“Raw Chip”来实现ISP/D,但现在推出的MCU往往采用了可串行编程的闪存,提供4引脚的JTAG接口或串行编程接口,借助PC串口或专用固化器可方便的进行预编程工作。
在调试系统程序设计时,需着重考虑嵌入式系统的资源分配和任务调度,尤其在最终的系统中要考虑实现在线调试、修改程序以提供更为灵活的现场服务。
[page]
应用举例
假设要研发升级自控系统平台,为了提高装置性能指标,选用了新的微控制器、新的A/D转换器、现场总线控制器、I2C/SPI BUS 芯片等等诸多外设。
图1示例中的微控制器MCU集成了RAM、ROM等资源,这样,首先数据不易受干扰、地址总线不外引,提高了装置的抗干扰能力;第二,简化了设计,降低成本 (注:图例中采用I/O口线模拟方式控制A/D)。实际上ISP设计同样适合微控制器MCU外扩RAM、ROM的方式,但需要锁存器、译码器等RAM、FLASH MEMORY与MCU接口的逻辑电路;另外采用外扩方式时,不能应用MCU内部集成的编程逻辑,需要设计者自行设计串行编程逻辑,在一定程度上增加了设计工作。图中所示RS232串口作为调试口用以接收PC下载的程序,同时上传数据(实际由以上分析可知任何通讯口均可作为调试口)。
在设计ISP系统程序时,首要考虑的是MCU资源分配,在这里必须明确的一点是:以上所指的“指定的RAM区”从系统程序的角度看实际是一段数据区,只不过它所存储的数据比较特殊,存储的是程序代码;从待调试程序的角度看,它是程序区。为了简化起见,建议资源严格分开。系统程序专用的RAM数据区、堆栈区、系统程序区和中断向量表与待调试程序专用的区域严格分开,这样系统程序与待调试程序资源分开,互不影响,从而降低编程的复杂性,提高了程序的可靠性。
本例以串口作为调试口,调试系统程序结构大体分为3部分:程序初始化、循环自检和串口接受中断,如图2。系统程序初始化模块进行一系列的初始化工作,将MCU设定到一个合适的运行状态后,开放中断,进入循环自检状态,等待用户下载程序和下发命令。串口接收中断服务程序收到下载程序和命令,分别填到相应的区段中,等待处理。要调试程序,先将程序当做数据下载到指定的内存中去,一旦程序下载完毕,经校验正确,可下发命令控制MCU跳转到指定的RAM区去执行待调试程序。虽然已由系统程序跳转到待调试程序专用区,但MCU仍可响应串口接收中断,故可由串口接收中断服务程序中的逻辑控制调试程序的运行,及实现一些调试功能。如变量跟踪,假如要检查RAM区某地址单元中的值,除了由程序员编写代码让程序主动发送该地址单元中的值及时标(变量地址、时间、进程号)至PC,显示不同进程、不同时间变量的值以便分析程序逻辑;也可以下发带地址参数的命令,由串口接收中断服务程序的逻辑返回指定地址单元的值。
在这里需注意的是,最终编译成的微控制器可执行文件不能直接作为可执行程序下载到RAM区执行。一般来讲,微处理器可执行文件或采用Motorola格式或采用Intel格式,所以,需根据不同的格式提取出微处理器机器码,以便下载执行。
在编写调试程序时,需将程序的首地址指定到RAM区,同时代码所用到的资源应严格的映射到相应的待调试程序专用的区域,这样才能保证程序下载到RAM区后能正确执行。RAM区溢出及逻辑指向错误都可能导致程序出轨。采用C等高级语言编程,程序员需注意程序与ROM相关的部分,如定义某变量的初值,定义常量。一般编译器在处理带初值的变量时的做法是,分别在RAM、ROM区各声明一单元存储变量和其初值,在程序起始时将ROM区初值复制到RAM区变量中去。若C程序员不考虑,可能会引起逻辑错误。该类问题请查阅微处理器用户手册或咨询微处理器当地公司代表、分销商。
至此,已可以在自控系统中实现ISP设计,实现简单的调试、编程功能。实际上,自控系统设计者可以根据自身系统的特点优化设计,完善功能。如图1所示的串行编程口和调试口,可以通过增加简单的辅助逻辑电路合并为一个通讯口;可修改中断向量表,使中断入口地址映射到RAM区,以调试中断服务程序。这些技术细节需结合各自不同的自控系统特点统一考虑设计。
小结
我们可以看出,该设计的实现方法简单,避免了设计、生产时不必要的物质上和时间上的开销,同时可以帮助系统供应商提供更为简易、灵活、经济的现场服务。该方案已成功地应用到自控系统设计中。 |