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

📄 testintr.cxx

📁 eCos1.31版
💻 CXX
📖 第 1 页 / 共 3 页
字号:
        intercom = MBX;        ercd = set_flg( 2, 0xfff );        CYG_TEST_CHECK( E_OK == ercd, "set_flg(2) bad ercd" );        ercd = set_flg( 3, 0xfff );        CYG_TEST_CHECK( E_OK == ercd, "set_flg(3) bad ercd" );        ercd = set_flg( 4, 0xfff );        CYG_TEST_CHECK( E_OK == ercd, "set_flg(4) bad ercd" );                CYG_TEST_CHECK(              0 == wakeups[0], "set_flg: Wakeups[0] hit" );        CYG_TEST_CHECK(              0 == wakeups[1], "set_flg: Wakeups[1] hit" );        CYG_TEST_CHECK( prewups[2] + 1 == wakeups[2], "set_flg: Wakeups[2] not hit" );        CYG_TEST_CHECK( prewups[3] + 1 == wakeups[3], "set_flg: Wakeups[3] not hit" );        CYG_TEST_CHECK( prewups[4] + 1 == wakeups[4], "set_flg: Wakeups[4] not hit" );        prewups[2] = wakeups[2];        prewups[3] = wakeups[3];        prewups[4] = wakeups[4];                // -------- TIMERS AND TIMESLICING DISABLED ---------        // install an isr that will wake them all up in turn        attach_isr( isr_snd_msg );        DELAY();        detach_isr( isr_snd_msg );        // -------- timers and timeslicing ENABLED ---------        CYG_TEST_CHECK(         0 == wakeups[0], "isnd_msg: Wakeups[0] hit" );        CYG_TEST_CHECK(         0 == wakeups[1], "isnd_msg: Wakeups[1] hit" );        CYG_TEST_CHECK( prewups[2] < wakeups[2], "isnd_msg: Wakeups[2] not hit" );        CYG_TEST_CHECK( prewups[3] < wakeups[3], "isnd_msg: Wakeups[3] not hit" );        CYG_TEST_CHECK( prewups[4] < wakeups[4], "isnd_msg: Wakeups[4] not hit" );        diag_printf( "INFO:<(fg loops %10d) message rec'pts: %2d %2d %2d >\n", count,                     wakeups[2] - prewups[2],                     wakeups[3] - prewups[3],                     wakeups[4] - prewups[4] );        prewups[2] = wakeups[2];        prewups[3] = wakeups[3];        prewups[4] = wakeups[4];        // move them on to exiting, all done        if ( 1 == loops )            // then we are about to exit            intercom = EXIT;        else            intercom = SLP;        ercd = snd_msg( 2, (T_MSG *)&intercom );        CYG_TEST_CHECK( E_OK == ercd, "snd_msg(2) bad ercd" );        ercd = snd_msg( 3, (T_MSG *)&intercom );        CYG_TEST_CHECK( E_OK == ercd, "snd_msg(3) bad ercd" );        ercd = snd_msg( 4, (T_MSG *)&intercom );        CYG_TEST_CHECK( E_OK == ercd, "snd_msg(4) bad ercd" );        CYG_TEST_CHECK(              0 == wakeups[0], "snd_msg: Wakeups[0] hit" );        CYG_TEST_CHECK(              0 == wakeups[1], "snd_msg: Wakeups[1] hit" );        CYG_TEST_CHECK( prewups[2] + 1 == wakeups[2], "snd_msg: Wakeups[2] not hit" );        CYG_TEST_CHECK( prewups[3] + 1 == wakeups[3], "snd_msg: Wakeups[3] not hit" );        CYG_TEST_CHECK( prewups[4] + 1 == wakeups[4], "snd_msg: Wakeups[4] not hit" );        prewups[2] = wakeups[2];        prewups[3] = wakeups[3];        prewups[4] = wakeups[4];        CYG_TEST_PASS( "Tested ISR invoked uITRON functions" );    } while ( 0 < --loops );    CYG_TEST_EXIT( "All done" );    ext_tsk();}void body( int n ){    unsigned int z;    ER ercd;    T_MSG *pk_msg;    do {        switch ( intercom ) {        case NOTHING:            ercd = slp_tsk();            CYG_TEST_CHECK( E_OK == ercd, "slp_tsk (doing nothing)" );            continue;        case SLP:            ercd = slp_tsk();            CYG_TEST_CHECK( E_OK == ercd, "slp_tsk bad ercd" );            wakeups[ n ]++;            break;        case SEM:            ercd = wai_sem( n-1 ); // 1..3 for semas            CYG_TEST_CHECK( E_OK == ercd, "wai_sem bad ercd" );            wakeups[ n ]++;            break;        case FLG:            ercd = wai_flg( &z, n, (1<<n), TWF_CLR | TWF_ANDW );            CYG_TEST_CHECK( E_OK == ercd, "wai_flg bad ercd" );            CYG_TEST_CHECK( z & (1<<n), "Flag bit not set" );            wakeups[ n ]++;            break;        case MBX:            ercd = rcv_msg( &pk_msg, n );            CYG_TEST_CHECK( E_OK == ercd, "rcv_msg bad ercd" );            CYG_TEST_CHECK( pk_msg, "rcv_msg NULL msg" );            wakeups[ n ]++;            break;        case EXIT:            return;        }    } while ( 1 );}void task2( unsigned int arg ){    ER ercd;    CYG_TEST_INFO( "Task 2 running" );    ercd = get_tid( &scratch );    CYG_TEST_CHECK( E_OK == ercd, "get_tid bad ercd" );    CYG_TEST_CHECK( 2 == scratch, "tid not 2" );    if ( 222 != arg )        CYG_TEST_FAIL( "Task 2 arg not 222" );    body(2);    CYG_TEST_INFO( "Task 2 exiting" );    ext_tsk();    CYG_TEST_FAIL( "Task 2 failed to exit" );}void task3( unsigned int arg ){    ER ercd;    CYG_TEST_INFO("Task 3 running");    ercd = get_tid( &scratch );    CYG_TEST_CHECK( E_OK == ercd, "get_tid bad ercd" );    CYG_TEST_CHECK( 3 == scratch, "tid not 3" );    if ( 333 != arg )        CYG_TEST_FAIL( "Task 3 arg not 333" );    body(3);    CYG_TEST_INFO( "Task 3 exiting" );    ext_tsk();    CYG_TEST_FAIL( "Task 3 failed to exit" );}void task4( unsigned int arg ){    ER ercd;    CYG_TEST_INFO("Task 4 running");    ercd = get_tid( &scratch );    CYG_TEST_CHECK( E_OK == ercd, "get_tid bad ercd" );    CYG_TEST_CHECK( 4 == scratch, "tid not 4" );    if ( 444 != arg )        CYG_TEST_FAIL( "Task 4 arg not 444" );    body(4);    CYG_TEST_INFO( "Task 4 exiting" );    ext_tsk();    CYG_TEST_FAIL( "Task 4 failed to exit" );}// ------------------------------------------------------------------------// Start of C++ aware portion, so to speak.//#include <cyg/hal/hal_intr.h>#include <cyg/kernel/intr.hxx>#include <cyg/kernel/clock.hxx>#include <cyg/kernel/sched.hxx>#include <cyg/kernel/sched.inl>void set_interrupt_number( void ){    clock_interrupt = CYGNUM_HAL_INTERRUPT_RTC;}// This snippet stolen from kernel/.../clock.cxx to be able to detach// the RTC from its interrupt source.class Cyg_RealTimeClock    : public Cyg_Clock{public:    Cyg_Interrupt       interrupt;    static cyg_uint32 isr(cyg_vector vector, CYG_ADDRWORD data);    static void dsr(cyg_vector vector, cyg_ucount32 count, CYG_ADDRWORD data);    Cyg_RealTimeClock();};static Cyg_Interrupt uit_intr(        (unsigned)CYGNUM_HAL_INTERRUPT_RTC, // Vector to attach to        0,                              // Queue priority        (unsigned)0,                    // Data pointer        &isr_wup_tsk,                   // Interrupt Service Routine        &cyg_uitron_dsr                 // Deferred Service Routine);voidattach_isr( unsigned int (*isr)(unsigned int, unsigned int) ){    int inuse;    int old_ints;    Cyg_RealTimeClock *prtc = (Cyg_RealTimeClock *)Cyg_Clock::real_time_clock;    HAL_INTERRUPT_MASK( CYGNUM_HAL_INTERRUPT_RTC );    HAL_DISABLE_INTERRUPTS(old_ints);    prtc->interrupt.detach();    HAL_INTERRUPT_IN_USE( CYGNUM_HAL_INTERRUPT_RTC, inuse );    CYG_TEST_CHECK( !inuse, "Failed to detach clock ISR" );    uit_intr = Cyg_Interrupt(         CYGNUM_HAL_INTERRUPT_RTC,       // Vector to attach to        1,                              // Queue priority        0,                              // Data pointer        isr,                            // Interrupt Service Routine        cyg_uitron_dsr                  // Deferred Service Routine        );        uit_intr.attach();    HAL_INTERRUPT_IN_USE( CYGNUM_HAL_INTERRUPT_RTC, inuse );    CYG_TEST_CHECK( inuse, "Failed to attach new ISR" );    ACK_CLOCK();    HAL_RESTORE_INTERRUPTS(old_ints);    HAL_INTERRUPT_UNMASK( CYGNUM_HAL_INTERRUPT_RTC );}voiddetach_isr( unsigned int (*isr)(unsigned int, unsigned int) ){    int inuse;    int old_ints;    Cyg_RealTimeClock *prtc = (Cyg_RealTimeClock *)Cyg_Clock::real_time_clock;    HAL_INTERRUPT_MASK( CYGNUM_HAL_INTERRUPT_RTC );    HAL_DISABLE_INTERRUPTS(old_ints);    uit_intr.detach();    HAL_INTERRUPT_IN_USE( CYGNUM_HAL_INTERRUPT_RTC, inuse );    CYG_TEST_CHECK( !inuse, "Failed to detach my ISR" );    prtc->interrupt.attach();    HAL_INTERRUPT_IN_USE( CYGNUM_HAL_INTERRUPT_RTC, inuse );    CYG_TEST_CHECK( inuse, "Failed to attach clock ISR" );    ACK_CLOCK();    HAL_RESTORE_INTERRUPTS(old_ints);    HAL_INTERRUPT_UNMASK( CYGNUM_HAL_INTERRUPT_RTC );}voidlock_sched( void ){    cyg_uint32 l;    Cyg_Scheduler::lock();    l = Cyg_Scheduler::get_sched_lock();    CYG_TEST_CHECK( 0 < l, "lock: Sched not locked" );    CYG_TEST_CHECK( 2 > l, "lock: Sched already locked" );}voidunlock_sched( void ){    cyg_uint32 l;    l = Cyg_Scheduler::get_sched_lock();    CYG_TEST_CHECK( 0 < l, "unlock: Sched not locked" );    CYG_TEST_CHECK( 2 > l, "unlock: Sched already locked" );    Cyg_Scheduler::unlock();}#else // not enough (or too many) uITRON objects configured in#define N_A_MSG "not enough uITRON objects to run test"#endif // not enough (or too many) uITRON objects configured in#else  // not C++ and some C++ specific options enabled#define N_A_MSG "C++ specific options selected but this is C"#endif  // not C++ and some C++ specific options enabled#else // ! CYGVAR_KERNEL_COUNTERS_CLOCK   - can't test without it#define N_A_MSG "no CYGVAR_KERNEL_COUNTERS_CLOCK"#endif // ! CYGVAR_KERNEL_COUNTERS_CLOCK  - can't test without it#else  // ! CYGFUN_KERNEL_THREADS_TIMER   - can't test without it#define N_A_MSG "no CYGFUN_KERNEL_THREADS_TIMER"#endif // ! CYGFUN_KERNEL_THREADS_TIMER   - can't test without it#else  // ! CYGIMP_THREAD_PRIORITY        - can't test without it#define N_A_MSG "no CYGSEM_KERNEL_SCHED_MLQUEUE"#endif // ! CYGSEM_KERNEL_SCHED_MLQUEUE   - can't test without it#else  // ! CYGPKG_UITRON#define N_A_MSG "uITRON Compatibility layer disabled"#endif // CYGPKG_UITRON#ifdef N_A_MSGexternC voidcyg_start( void ){    CYG_TEST_INIT();    CYG_TEST_NA( N_A_MSG );}#endif // N_A_MSG defined ie. we are N/A.// EOF testintr.c

⌨️ 快捷键说明

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