账号:
密码:
最新动态
产业快讯
CTIMES / 文章 /
芯片内建增强型仿真模块让程序除错更简单
 

【作者: Andreas Dannenberg】2007年04月11日 星期三

浏览人次:【4930】

除错是嵌入式应用开发人员的日常工作之一。随着应用日益复杂,除错过程变得更加困难耗时。利用仿真器解决方案进行除错的缺点在于无法准确复制应用操作条件。许多仿真器虽提供程序代码覆盖率分析 (code coverage)、执行频率统计 (profiling) 和条件断点等功能,却只能仿真处理器核心和少数外围。这对复杂的纯软件算法测试或许足够,但嵌入式应用却常涉及许多软硬件互动,如外部连接电路及模拟数字转换器与定时器模块等微控制器的整合外围都会产生实时事件。此外,微控制器本身可能是更复杂系统的一部份,并且会链接外部控制与数据储存组件,或是与DSP配合提供支持功能。开发人员很难在处理器核心仿真器的「无尘室环境」除错、或验证这些与外部组件通讯的软件。


克服这些缺点的常用方法之一是使用在线仿真器 (ICE),ICE兼具仿真器的优点及在实际硬件实时执行软件的能力。设计人员只需以芯片封装转接器 (chip-package adapter) 取代目标板上的微控制器,该转接器会连接另一个含有复杂电子电路的机盒,负责仿真微控制器的行为和提供除错功能。ICE仿真器虽有许多功能,但却相当昂贵与笨重,且无法提供100%的精确环境,尤其在遇到模拟数字转换器、数字模拟转换器、比较器、振荡器和电压参考这类敏感的模拟外围时更是如此。


有鉴于这些缺点,在微控制器加入除错功能的嵌入式仿真变得很受欢迎。除错计算机主机可透过嵌入仿真功能利用JTAG等序列界面直接链接芯片内建的仿真逻辑电路,应用程序代码即可在微控制器上执行。这种做法的优点在于软件设计是在实际操作条件下进行,所以发展完成后不需额外的硬件测试。


到目前为止,就算在小型的16和8位控制器架构中,嵌入式除错功能也极为常见,只不过多数产品只提供内存存取、处理器执行控制和硬件断点等基本功能,因此相较于完全成熟的ICE仿真器还有很大改进空间。最新的16位微控制器则进一步提供更丰富的功能特色,使其除错能力更接近ICE仿真器。不仅能在许多情形下为开发人员省下ICE费用,还可以应付许多困难的除错问题。稍后将介绍一些先进微控制器的除错功能和实例。


系统介绍

如图1所示,德州仪器 (TI) MSP430微控制器内建的加强型仿真模块 (EEM) 包含下列功能方块:基本触发输入、触发组合逻辑、触发排序器、触发动作单元 (trigger action)、状态储存和频率控制 (图1)。



《图一 MSP430加强型嵌入式仿真模块》 - BigPic:846x484
《图一 MSP430加强型嵌入式仿真模块》 - BigPic:846x484

加强型除错模块提供8个可用的基本触发输入,进行除错时至少要设定其中一个。一般芯片内建的嵌入式仿真电路仅可透过触发设定来监控处理器地址总线 (MAB),且只能在特定内存地址停止程序执行。但某些先进的微控制器却可提供更复杂的触发设定,前述MSP430就是一例。除了地址总线外,它还能设定触发功能来监控处理器数据总线 (MDB)、处理器内部缓存器和部份的处理器控制讯号。不仅如此,必要时它还能将位掩码套用于地址和数据总线触发设定,以便取出想要的值,或是利用一个额外常数执行「等于」、「不等于」、「少于」和「大于」等各种比较。相较于「在某个地址中断程序执行」的标准除错功能,上述这些功能可以组合出一套复杂精密的断点设定方式。


透过触发组合逻辑,可把基本触发输入组合成复合的触发。此方块输出的触发事件是多个基本触发输入的逻辑AND组合。举例来说,把地址和数据总线触发组合,就能监控某些特定值是否在某个内存位置被读写,这种复合触发事件可用来直接停止程序执行或产生状态储存事件。在执行该功能前,触发事件可先由触发排序器 (电路内建的状态机器,共有四种状态) 处理。根据输入触发产生的可程序状态条件能用来产生状态转移动作。设计人员可以设定微控制器,使它在排序器达到最终事件状态时停止程序执行、产生状态储存事件或同时执行这两个动作。


如前所述,状态储存单元可以使用任何的复合触发。状态储存单元是可以储存8笔数据的环形缓冲区,每笔数据都包含16位地址总线、16位数据总线和某些重要处理器控制讯号在触发当时的内容。它可视为一种简单的追踪缓冲区 (trace buffer),可以撷取状态信息而不影响微控制器软件的实时工作。开发人员还能取得基本触发事件发生时的系统状态快照 (snapshot),包括根据多个触发的组合、根据排序器输出、或是仅止于在每个处理器频率周期执行这项动作。


有些新型微控制器不仅具备嵌入式仿真模块,还提供另一项很有用的功能-频率控制单元 (clock control unit)。可在组件内部提供3个频率树讯号,其中任何一个讯号都能用来驱动不同的外围,如模拟数字转换器、LCD驱动器、定时器和序列通讯模块。频率控制单元还能针对个别模块进行设定,以便决定程序停止时应该为哪些外围继续提供频率,或是处理器在除错过程中停止运作时应该切断哪些外围的频率供应。如果仿真模块突然停止所有频率 (例如执行到断点),不必要的副作用就可能发生,例如通讯字符遗失或错误的模拟数字转换结果。


另一个可能的实作方法是在仿真停止时继续为外围模块提供频率。但这种解决方案有个潜在问题-就算处理器停止运作,包括定时器在内的某些模块仍可能一直设定中断旗标,这会让原始程序的单步执行相当困难。要避免上述作法产生的问题,开发人员可以使用频率控制方块,让唯有对应用很重要的模块才能获得频率。


EEM触发组成的复杂断点

常见的芯片内建仿真模块都会提供基本的硬件程序断点设定功能,但倘若能为断点增加条件,除错作业在许多情形下会变得更简单。举例来说,某个C语言嵌入式应用提供一套复杂的状态机器,将目前的状态储存在一个全局变量中,而且原始程序有许多地方都会修改这个变量的内容;假设此应用出现了「在错误条件下进入状态 ‘3’」的意外状况,要如何找出导致这项意外错误的源代码?方法很简单,只要使用一个复合式EEM模块触发,让它在发现「3」 这个值写入状态机器变量 StateVar时就停止程序执行即可。这个复杂断点是两个基本EEM触发的逻辑AND组合,它会在侦测到前述现象时产生一个处理器停止事件。(图二)是这个复合触发的简单实作方块图。


《图二 两个基本触发的组合》 - BigPic:600x256
《图二 两个基本触发的组合》 - BigPic:600x256

为了监看状态机器变量StateVar的地址与处理器写入动作控制讯号,可设定一个基本触发来监控组件内部的地址总线 (MAB)。另一个触发则设定为监控内部数据总线是否出现「3」这个值。以这种方式设定加强型仿真模块后,只要有任何指令将「3」这个值写入StateVar,程序就会停止执行,因此很容易就能找出导致该写入动作的程序代码。这套方法不仅适用于RAM存取,还适用于闪存和外围模块的存取动作。


利用所有基本EEM触发都提供的位掩码功能,还能进一步设定这个复杂的断点。倘若客户将超低耗电微控制器应用于可携式运动表时发现下列问题:通用端口1的接脚3会被意外设定。我们假设埠1在此应用里专用来控制各种外部电路,因此在程序执行期间会被存取许多次。


现在的问题是找出会意外修改端口接脚内容的处理器指令及相关的原始程序。首先利用类似前述的复合式EEM断点来监控埠1输出缓存器的写入动作,再将屏蔽AND值和触发比较值都设为0x0008,然后利用位掩码功能取出位3。MDB EEM触发硬件现能在每次比较前执行逐位AND运算。这种方式既能让处理器继续工作,又能在任何一行程序代码设定埠1输出缓存器的位3时,停止程序执行。只要等到程序执行几次后,就能找出导致该异常行为的错误C程序。


揪出恼人的错误

堆栈溢出是嵌入式应用常见的错误。多数微控制器架构会在RAM内配置堆栈空间,然而RAM却是一种其它变量及程序元素共享的有限资源。微控制器的一种常见做法是在程序初始化时将堆栈指针设定到RAM空间的顶端。对C程序来说,随着所使用开发工具的不同,链接程序会配置0x50个字节的RAM做为默认堆栈空间。然而随着程序设计工作的进行和更多全局变量加入,链接程序最终会在编译时发出可用内存不足的警告。这里的问题是,倘若设计人员未谨慎指定堆栈大小,保留空间可能会不敷应用需求。


在执行期间,使用易失存储器配置和递回程序设计技巧都会消耗大量的记忆空间,实际应用时发生的不可预期事件,例如按键开关的讯号跳动或其它会产生巢状中断 (nested interrupt) 的输入讯号,也会迫使堆栈指针移到堆栈边缘或超出堆栈范围。若缺乏执行期间的堆栈指针检查功能,开发人员将可能冒着堆栈不断扩大而侵入变量储存空间的风险。如果发生这类情形,重要应用数据就可能毁损并造成从程序行为异常到软件完全当机等各种难以预料的影响。使用在堆栈指针 (SP) 离开指定记忆区域时能立即停止程序执行的机制是解决这个问题的简单方法。(图三)显示如何设定一个复杂断点以监控TI超低耗电MSP430微控制器的堆栈指针,这张图片和其它屏幕撷图都来自IAR Embedded Workbench V3.20A整合开发环境。



《图三 堆栈溢出侦测》
《图三 堆栈溢出侦测》

这颗组件使用0xA00 – 0x50 = 0x9B0 做为堆栈边界。若此断点让程序停止执行,开发人员即可检查堆栈内容,进而找出堆栈溢出的根本原因。例如堆栈若有许多相同值,就表示问题可能来自端口讯号跳动而产生的大量中断要求。


范围断点 (range breakpoint) 是另一种可组合而成的复杂断点,用以监控特定范围内或范围外的地址或数据总线。这类除错器使用两个已在内部完成组合并设为监控相同总线的EEM基本触发,其中一个触发设为「少于」比较模式,另一触发则设为「大于」比较模式。程序只有在这两个条件都满足时才会停止执行。举例来说,范围断点可做为一种监控装置,确保处理器不会从程序内存以外的地方取得指令。这有助于找出程序内存因为计算错误的间接跳跃动作而产生的内容错误问题。范围断点还能搭配读/写修饰词 (read/write modifier),避免某些记忆区域被覆写。


让触发变聪明

以微控制器搭配DSP执行键盘扫描、电源管理和实时频率等支持功能的数字相机应用,是很适合展示EEM强大威力的另一个实例,DSP与微控制器是透过UART序列线路相连。假设当DSP传送一系列多字节命令,透过微控制器查询目前的电池状态时,微控制器却没有做出适当的响应。这将使开发人员面临一个问题:如何在序列接收中断服务函式里增加断点,以便找出问题根源而又不影响应用的实时工作。困难点是DSP软件已逾时,通讯已中断,数据交换又无法完成。解决方法是把3个复合触发送到触发排序器,再利用类似(图五)的参数设定,让程序在收到3个字节长的命令序列后立即停止执行。



《图四 排序器控制》
《图四 排序器控制》

接着只要采取单步执行模式 (single-stepping) 观察处理器执行程序的路径,即可看出为什么该命令未被执行。


了解程序的执行

状态储存方块是另一个强大的EEM组件。当进行程序代码除错、或设定状态储存模块在每个CPU指令摘取周期都执行撷取动作时,储存缓冲区会包含前8个汇编语言指令的执行记录 (8阶执行记录)。当以手动方式或透过断点停止程序执行时,这份记录即可提供许多有用的信息,例如程序停止执行前发生什么事。利用这项功能搜集基本或EEM复合触发事件的数据时,还可以只记录跳跃指令或分支指令等特定运算码。这提供一项强大的指令追踪功能,可用来观察最近的程序流程。


由于状态储存缓冲区可以透过JTAG存取,而不会干扰CPU和目标应用作业,因此它还能实作另一项有用的功能:实时观察。这项观察功能对马达控制应用等许多除错作业都很有帮助。在应用软件中增加断点以便停止程序执行,并透过一般的观察窗口读取变量值时,控制算法会被打断,这可能导致机械设备发生故障。但若结合微控制器的EEM触发及状态储存功能,即可在不修改程序的情形下实时监控应用变量。只要利用一个触发来监控目标变量内存位置的写入动作,就能产生状态储存事件,使传送至缓冲区的数据总线值一定是该变量的最新值。(图五)是IAR Embedded Workbench撷取的状态储存窗口画面。



《图五 状态储存窗口》
《图五 状态储存窗口》

在此例子里,含有马达转速的全局变量内存地址为0x200,系统会监控该地址的写入动作。随着马达控制算法实时运行,状态储存窗口会自动更新,并在「数据总线」字段显示最新的马达转速,整个过程都不会影响应用执行。从屏幕撷图可以看出马达转速在增加。这种利用数据总线值进行实时观察的机制仅限于16位,但对多数应用应该都已足够。


频率控制

EEM频率控制方块还能协助开发另一种嵌入式应用。微控制器的用途之一是驱动升压转换器藉以产生高电压的MOSFET开关晶体管。该晶体管会连接到定时器PWM输出(其负载周期由软件算法控制)。工程师必须在应用软件正常运作的情形下修改RAM储存的参数值。工程师会先关闭频率控制组态对话盒里的「Stop Timer_Bclock on emulation stop」选项,然后停止应用以便修改RAM内容。


假设手动停止程序执行时,输出晶体管的负载周期约为20%,由于定时器在程序停止后,仍会继续工作并产生适当的PWM波形,这个负载周期将能继续维持。但若将定时器停止,就有可能造成开关晶体管持续导通,而出现电路过载甚至损坏的情形。


结语

假设手动停止程序执行时,输出晶体管的负载周期约为20%,由于定时器在程序停止后,仍会继续工作并产生适当的PWM波形,这个负载周期将能继续维持。但若将定时器停止,就有可能造成开关晶体管持续导通,而出现电路过载甚至损坏的情形。相较于常见的基本型嵌入式仿真电路,本文介绍的加强型仿真模块 (EEM) 让除错变得更先进容易。加强型仿真模块的另一优点是不需要ICE之类的额外工具成本,因为所有的仿真功能都已内建至处理器核心做为标准功能。此外,许多实际而复杂的讯号处理应用都必须应付敏感的模拟讯号,加强型仿真模块能让这类应用的在线除错 (in-system debugging) 付诸实现。TI正在开发中的程序代码执行频率统计、更强大的实时系统存取和更深的追踪缓冲区等扩充功能,将进一步缩小加强型仿真模块与ICE的差距,并且满足嵌入式开发人员的需求。


(作者任职于德州仪器)


相关文章
低 IQ技术无需牺牲系统性能即可延长电池续航力
以霍尔效应电流感测器简化高电压感测
以固态继电器简化高电压应用中的绝缘监控设计
以半导体技术协助打造更安全更智慧的车辆
适用於整合太阳能和储能系统的转换器拓扑结构
comments powered by Disqus
相关讨论
  相关新闻
» AMD扩展商用AI PC产品阵容 为专业行动与桌上型系统??注效能
» 豪威集团汽车影像感测器相容於高通Snapdragon Digital Chassis
» 意法半导体扩大3D深度感测布局 打造新一代时间飞行感测器
» AMD第2代Versal系列扩展自调适SoC组合 为AI驱动型系统提供端对端加速
» 意法半导体与trinamiX、维信诺合作 打造手机OLED萤幕脸部认证系统


刊登廣告 新聞信箱 读者信箱 著作權聲明 隱私權聲明 本站介紹

Copyright ©1999-2024 远播信息股份有限公司版权所有 Powered by O3  v3.20.1.HK84I6S3XBESTACUKZ
地址:台北数位产业园区(digiBlock Taipei) 103台北市大同区承德路三段287-2号A栋204室
电话 (02)2585-5526 #0 转接至总机 /  E-Mail: webmaster@ctimes.com.tw