⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tcdiag.cxx

📁 eCos操作系统源码
💻 CXX
字号:
//==========================================================================////        tcdiag.cxx////        Infrastructure diag test harness.////==========================================================================//####ECOSGPLCOPYRIGHTBEGIN####// -------------------------------------------// This file is part of eCos, the Embedded Configurable Operating System.// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.//// eCos is free software; you can redistribute it and/or modify it under// the terms of the GNU General Public License as published by the Free// Software Foundation; either version 2 or (at your option) any later version.//// eCos is distributed in the hope that it will be useful, but WITHOUT ANY// WARRANTY; without even the implied warranty of MERCHANTABILITY or// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License// for more details.//// You should have received a copy of the GNU General Public License along// with eCos; if not, write to the Free Software Foundation, Inc.,// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.//// As a special exception, if other files instantiate templates or use macros// or inline functions from this file, or you compile this file and link it// with other works to produce a work based on this file, this file does not// by itself cause the resulting work to be covered by the GNU General Public// License. However the source code for this file must still be made available// in accordance with section (3) of the GNU General Public License.//// This exception does not invalidate any other reasons why a work based on// this file might be covered by the GNU General Public License.//// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.// at http://sources.redhat.com/ecos/ecos-license/// -------------------------------------------//####ECOSGPLCOPYRIGHTEND####//==========================================================================//#####DESCRIPTIONBEGIN####//// Author(s):     dsm// Contributors:  dsm, jlarmour// Date:          1999-02-16// Description:   Test harness implementation that uses the infrastructure//                diag channel.  This is intended for manual testing.// //####DESCRIPTIONEND#####include <pkgconf/infra.h>#include <pkgconf/system.h>#include CYGBLD_HAL_TARGET_H           // get initialization for#include CYGBLD_HAL_PLATFORM_H         //   cyg_test_is_simulator#include <cyg/infra/cyg_type.h>        // base types#include <cyg/hal/hal_arch.h>          // any architecture specific stuff#include <cyg/infra/diag.h>            // HAL polled output#include <cyg/infra/testcase.h>        // what we implement#include <cyg/hal/hal_intr.h>          // exit macro, if defined#ifdef CYGHWR_TARGET_SIMULATOR_NO_GDB_WORKINGint cyg_test_is_simulator = 1;         // set this anyway#elseint cyg_test_is_simulator = 0;         // infrastructure changes as necessary#endif//----------------------------------------------------------------------------// Functions ensuring we get pretty printed assertion messages in the// farm - regardless of configuration and GDB capabilities.#ifdef CYGPKG_KERNEL# include <pkgconf/kernel.h># include <cyg/kernel/thread.hxx>        // thread id to print# include <cyg/kernel/thread.inl>        // ancillaries for above#endif#ifdef CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT#include <cyg/hal/hal_if.h>#endifstatic inline const char *trim_file(const char *file){    if ( NULL == file )        file = "<nofile>";        const char *f = file;        while( *f ) f++;    while( *f != '/' && f != file ) f--;    return f==file?f:(f+1);}static inline const char *trim_func(const char *func){    static char fbuf[100];    int i;        if ( NULL == func )        func = "<nofunc>";    for( i = 0; func[i] && func[i] != '(' ; i++ )        fbuf[i] = func[i];    fbuf[i++] = '(';    fbuf[i++] = ')';    fbuf[i  ] = 0;    return &fbuf[0];}static inlinevoid write_lnum( cyg_uint32 lnum){    diag_write_char('[');    diag_write_dec(lnum);    diag_write_char(']');}static inlinevoid write_thread_id(){#ifdef CYGPKG_KERNEL    Cyg_Thread *t = Cyg_Thread::self();    cyg_uint16 tid = 0xFFFF;    if( t != NULL ) tid = t->get_unique_id();    diag_write_char('<');    diag_write_hex(tid);    diag_write_char('>');#endif}// Called from the CYG_ASSERT_DOCALL macroexternC voidcyg_assert_msg( const char *psz_func, const char *psz_file,                cyg_uint32 linenum, const char *psz_msg ) __THROW{    cyg_uint32 old_ints;    HAL_DISABLE_INTERRUPTS(old_ints);    DIAG_DEVICE_START_SYNC();#ifdef CYG_HAL_DIAG_LOCK    CYG_HAL_DIAG_LOCK();#endif        #ifdef CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT    {        int cur_console;        int i;        struct cyg_fconfig fc;        cur_console = CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT);        fc.key = "info_console_force";        fc.type = CYGNUM_FLASH_CFG_TYPE_CONFIG_BOOL;        fc.val = (void *)&i;        if (CYGACC_CALL_IF_FLASH_CFG_OP2(CYGNUM_CALL_IF_FLASH_CFG_GET, &fc)) {            if (i) {                fc.key = "info_console_number";                fc.type = CYGNUM_FLASH_CFG_TYPE_CONFIG_INT;                if (CYGACC_CALL_IF_FLASH_CFG_OP2(CYGNUM_CALL_IF_FLASH_CFG_GET, &fc)) {                    // Then i is the console to force it to:                    CYGACC_CALL_IF_SET_CONSOLE_COMM(i);                }            }        }#endif    diag_write_string("ASSERT FAIL: ");    write_thread_id();    diag_write_string(trim_file(psz_file));    write_lnum(linenum);    diag_write_string(trim_func(psz_func));    diag_write_char(' ');    diag_write_string(psz_msg);    diag_write_char('\n');#ifdef CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT        CYGACC_CALL_IF_SET_CONSOLE_COMM(cur_console);    }#endif#ifdef CYG_HAL_DIAG_UNLOCK    CYG_HAL_DIAG_UNLOCK();#endif            DIAG_DEVICE_END_SYNC();    HAL_RESTORE_INTERRUPTS(old_ints);}externC voidcyg_test_init(void){    // currently nothing}externC voidcyg_test_output(Cyg_test_code status, const char *msg, int line,                const char *file){    char *st;    switch (status) {    case CYGNUM_TEST_FAIL:        st = "FAIL:";        break;    case CYGNUM_TEST_PASS:        st = "PASS:";        break;    case CYGNUM_TEST_EXIT:        st = "EXIT:";        break;    case CYGNUM_TEST_INFO:        st = "INFO:";        break;    case CYGNUM_TEST_GDBCMD:        st = "GDB:";        break;    case CYGNUM_TEST_NA:        st = "NOTAPPLICABLE:";        break;    default:        st = "UNKNOWN STATUS:";        break;    }#ifdef CYG_HAL_DIAG_LOCK    CYG_HAL_DIAG_LOCK();#endif            diag_write_string(st);    diag_write_char('<');    diag_write_string(msg);    diag_write_char('>');    if( CYGNUM_TEST_FAIL == status ) {        diag_write_string(" Line: ");        diag_write_dec(line);        diag_write_string(", File: ");        diag_write_string(file);    }    diag_write_char('\n');#ifdef CYG_HAL_DIAG_UNLOCK    CYG_HAL_DIAG_UNLOCK();#endif            }// This is an appropriate function to set a breakpoint onexternC voidcyg_test_exit(void){// workaround SH dwarf2 gen problem    #if defined(CYGPKG_HAL_SH) && (__GNUC__ >= 3)    static volatile int i;    i++;#endif#ifdef CYGHWR_TEST_PROGRAM_EXIT    CYGHWR_TEST_PROGRAM_EXIT();#endif#ifdef CYGSEM_INFRA_RESET_ON_TEST_EXIT#ifdef HAL_PLATFORM_RESET    HAL_PLATFORM_RESET();#else#warning "Reset selected for test case exit, but none defined"#endif#endif    // Default behaviour - simply hang in a loop    for(;;)        ;}// EOF tcdiag.cxx

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -