您的位置: 嵌入式在线 > 技术中心 > Linux > 通过CPU仿真器(ICE)实现对嵌入式操作系统的调试

通过CPU仿真器(ICE)实现对嵌入式操作系统的调试

2007-08-30      嵌入式在线      收藏 | 打印

       对于开发嵌入式系统,软件调试一直是一个难度大、直接影响产品质量的重要环节。由于嵌入式系统本身不具备调试环境,又有较高的实时性要求,所以必须要有外部调试工具的协助工作。ICE仿真器作为嵌入式调试的核心设备,可以帮助用户实现断点调试、单步运行、寄存器与内存读写、闪存烧写等功能。

       嵌入式系统通常可以分为硬件、硬件驱动、实时操作系统以及上层应用等几部分。其中实时操作系统是整个系统的管理者,起着承上启下,合理分配系统资源的作用。操作系统的开发、调试是系统开发的最重要环节。如果操作系统不能稳定运行,整个系统就无法正常工作;反之,操作系统正常工作了,再进行上层应用开发就会变得快速、稳定、可靠。同时,稳定的系统也有利于进行各种相关测试。

图1  ICE仿真器工作示意图

       日本横河数字计算机公司出品的AdvicePro仿真器产品,通过对实时操作系统TCB(Task Control Block)的解析,非常直观地显示操作系统的资源信息以及各进程的状态,为客户提供稳定的系统调试平台。以横河数字计算机公司为大唐移动提供的实时操作系统ThreadX调试方案为例,ThreadX是一种以占用空间小、可靠性高、实时性高、完全源代码透明而闻名的实时操作系统,完全与Green Hills Software的MULTI IDE集成,并包含可识别内核的调试(kernel awareness debugging)、工程项目管理、源代码浏览、事件跟踪分析、代码分析,用于系统及应用项目监控。作为多任务系统,在系统运行时,会产生多个线程互相通信,交替工作。ThreadX的各个线程的信息都保存在TCB结构体中,ThreadX的TCB结构体的一部分如下:

       typedef  struct TX_THREAD_STRUCT
{
    ULONG       tx_thread_id;           /* Control block ID         */
    ULONG       tx_run_count;           /* Thread's run counter     */
    VOID_PTR    tx_stack_ptr;           /* Thread's stack pointer   */
    VOID_PTR  tx_stack_start;         /* Stack starting address   */
    VOID_PTR    tx_stack_end;           /* Stack ending address     */
    ULONG       tx_stack_size;          /* Stack size               */
    ULONG       tx_time_slice;          /* Current time-slice       */
    ULONG  tx_new_time_slice;      /* New time-slice           */
  CHAR_PTR  tx_thread_name;         /* Pointer to thread's name */
    UINT        tx_priority;            /* Priority of thread (0-31)*/
    UINT        tx_state;               /* Thread's execution state */
    UINT   tx_delayed_suspend;     /* Delayed suspend flag     */
    UINT        tx_suspending;          /* Thread suspending flag   */
  UINT  tx_preempt_threshold;   /* Preemption threshold     */
   ULONG  tx_priority_bit;        /* Priority ID bit          */
 }

       线程的信息保存在TCB结构体中,因此只要能够对TCB进行解析,就可以获取各线程的相关信息,跟踪系统状态。例如,在图2所示的系统中,通过解析,我们可以知道,该系统中共有9个线程被启动,同时工作。其中线程System_Timer_Thread拥有最高的优先级,状态为SUSPENDED。

图2  多线程状态表示界面

       在多任务系统中,每个进程都拥有独立使用的堆栈,用于保存进程在函数调用、中断处理时产生的临时信息、数据。适当地为堆栈分配空间,是维护系统稳定,节约系统资源的一个核心环节。因为,如果为堆栈分配的空间过小,当需要保存的信息较多时,堆栈就可能会溢出,从而导致系统崩溃;反之,如果给堆栈分配的空间过大,就会浪费宝贵的系统资源。AdvicePro的系统堆栈分析功能,可以直观地帮助用户了解到系统堆栈的状态,控制余量,在保证系统稳定的前提下,最大程度节省系统资源,提高系统效率。

       通过线程堆栈资源表示界面(图3),可以清楚地观察到各线程堆栈的当前状态。例如为线程System_Timer_Thread分配的堆栈空间是0x801f5a3~0x801f1a4,大小为400个双字,当前堆栈指针指向0x801f514,已使用空间占全部空间的14%。这样就可以非常直观地了解到堆栈的使用状况,有效预防由于堆栈溢出而引起的系统崩溃。

图3  线程堆栈资源表示界面

       AdvicePro的实时操作系统调试功能是通过TCL脚本语言来实现的。TCL是一种很通用的脚本语言,它几乎在所有的平台上都可以解释运行,功能强大,是Tool Command Language的缩写,主要适用于发布命令给一些交互程序,如文本编辑器、调试器和shell。它有简单的语法和很强可扩充性,TCL可以创建新的过程以增强其内建命令的执行能力。AdvicePro的调试软件MicroView-Plus中内嵌了TCL解释器,用户可以根据需要自行定制界面,增加了产品的灵活性。

       以上,我们只是以ThreadX为例,简单介绍了AdvicePro仿真器在嵌入式实时操作系统调试中的应用。作为日本最成熟的嵌入式测试产品,AdvicePro在Symbian、Linux、Nucleus等操作系统上也有相当丰富的实际经验。欲了解更多信息请访问:www.yokogawa.com/cn-ysh (中文)或 www.yokogawa.com (英文)。
 

本文来源:上海横河国际贸易有限公司    作者:孟繁普
热点资讯(一周点击率)
热评博文
评一评已有 0 位网友对此文发表了看法。  我也来评一下

验证码:  看不清?换一张

 

快乐大本营
工程师之星
高福东
擅长嵌入式开发及单片机应用开发
  • 王波涛  熟悉单片机及其接口技术
  • 朱伟平  熟悉51单片机系统LCD驱动程序编写及调试。
热门招聘
论坛热贴