通过CPU仿真器(ICE)实现对嵌入式操作系统的调试
对于开发嵌入式系统,软件调试一直是一个难度大、直接影响产品质量的重要环节。由于嵌入式系统本身不具备调试环境,又有较高的实时性要求,所以必须要有外部调试工具的协助工作。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 (英文)。

