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

📄 tm_basic.cxx

📁 ecos实时嵌入式操作系统
💻 CXX
📖 第 1 页 / 共 4 页
字号:
    // Set up common bits of sigevent    sigev.sigev_notify = SIGEV_SIGNAL;    wait_for_tick(); // Wait until the next clock tick to minimize aberations    for (i = 0;  i < ntimers;  i++) {        HAL_CLOCK_READ(&timer_ft[i].start);        sigev.sigev_signo = SIGRTMIN;        sigev.sigev_value.sival_ptr = (void*)(&timers[i]);        res = timer_create( CLOCK_REALTIME, &sigev, &timers[i]);        HAL_CLOCK_READ(&timer_ft[i].end);        CYG_ASSERT( res == 0 , "timer_create() returned error");    }    show_times(timer_ft, ntimers, "Create timer");    wait_for_tick(); // Wait until the next clock tick to minimize aberations    tp.it_value.tv_sec = 0;    tp.it_value.tv_nsec = 0;    tp.it_interval.tv_sec = 0;    tp.it_interval.tv_nsec = 0;    for (i = 0;  i < ntimers;  i++) {        HAL_CLOCK_READ(&timer_ft[i].start);        res = timer_settime( timers[i], 0, &tp, NULL );        HAL_CLOCK_READ(&timer_ft[i].end);        CYG_ASSERT( res == 0 , "timer_settime() returned error");    }    show_times(timer_ft, ntimers, "Initialize timer to zero");    wait_for_tick(); // Wait until the next clock tick to minimize aberations    tp.it_value.tv_sec = 1;    tp.it_value.tv_nsec = 250000000;    tp.it_interval.tv_sec = 0;    tp.it_interval.tv_nsec = 0;    for (i = 0;  i < ntimers;  i++) {        HAL_CLOCK_READ(&timer_ft[i].start);        res = timer_settime( timers[i], 0, &tp, NULL );        HAL_CLOCK_READ(&timer_ft[i].end);        CYG_ASSERT( res == 0 , "timer_settime() returned error");    }    show_times(timer_ft, ntimers, "Initialize timer to 1.25 sec");    wait_for_tick(); // Wait until the next clock tick to minimize aberations    tp.it_value.tv_sec = 0;    tp.it_value.tv_nsec = 0;    tp.it_interval.tv_sec = 0;    tp.it_interval.tv_nsec = 0;    for (i = 0;  i < ntimers;  i++) {        HAL_CLOCK_READ(&timer_ft[i].start);        res = timer_settime( timers[i], 0, &tp, NULL );        HAL_CLOCK_READ(&timer_ft[i].end);        CYG_ASSERT( res == 0 , "timer_settime() returned error");    }    show_times(timer_ft, ntimers, "Disable timer");    wait_for_tick(); // Wait until the next clock tick to minimize aberations    for (i = 0;  i < ntimers;  i++) {        HAL_CLOCK_READ(&timer_ft[i].start);        res = timer_delete( timers[i] );        HAL_CLOCK_READ(&timer_ft[i].end);        CYG_ASSERT( res == 0 , "timer_settime() returned error");    }    show_times(timer_ft, ntimers, "Delete timer");            sigev.sigev_signo = SIGRTMIN+1;    sigev.sigev_value.sival_ptr = (void*)(&timers[i]);    res = timer_create( CLOCK_REALTIME, &sigev, &timers[0]);    CYG_ASSERT( res == 0 , "timer_create() returned error");    tp.it_value.tv_sec = 0;    tp.it_value.tv_nsec = 50000000;    tp.it_interval.tv_sec = 0;    tp.it_interval.tv_nsec = 50000000;;    timer_cnt = 0;    res = timer_settime( timers[0], 0, &tp, NULL );    CYG_ASSERT( res == 0 , "timer_settime() returned error");    sem_init(&synchro, 0, 0);    wait_for_tick(); // Wait until the next clock tick to minimize aberations    do    { res = sem_wait(&synchro);    } while( res == -1 && errno == EINTR );    CYG_ASSERT( res == 0 , "sem_wait() returned error");            tp.it_value.tv_sec = 0;    tp.it_value.tv_nsec = 0;    tp.it_interval.tv_sec = 0;    tp.it_interval.tv_nsec = 0;    res = timer_settime( timers[0], 0, &tp, NULL );    CYG_ASSERT( res == 0 , "timer_settime() returned error");    res = timer_delete( timers[0] );    CYG_ASSERT( res == 0 , "timer_delete() returned error");    show_times(sched_ft, nscheds, "Timer latency [0 threads]");        struct sched_param schedparam;    pthread_attr_t attr;    void *retval;        // Set my priority higher than any I plan to create    schedparam.sched_priority = 20;    pthread_setschedparam( pthread_self(), SCHED_RR, &schedparam );        // Initiaize thread creation attributes    pthread_attr_init( &attr );    pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED );    pthread_attr_setschedpolicy( &attr, SCHED_RR );    schedparam.sched_priority = 10;    pthread_attr_setschedparam( &attr, &schedparam );        for (i = 0;  i < 2;  i++) {        pthread_attr_setstackaddr( &attr, &stacks[i][STACK_SIZE] );        pthread_attr_setstacksize( &attr, STACK_SIZE );        res = pthread_create( &threads[i],                        &attr,                        timer_test,                        (void *)i                        );        CYG_ASSERT( res == 0 , "pthread_create() returned error");    }    wait_for_tick(); // Wait until the next clock tick to minimize aberations    sigev.sigev_signo = SIGRTMIN+1;    sigev.sigev_value.sival_ptr = (void*)(&timers[i]);    res = timer_create( CLOCK_REALTIME, &sigev, &timers[0]);    CYG_ASSERT( res == 0 , "timer_create() returned error");    tp.it_value.tv_sec = 0;    tp.it_value.tv_nsec = 50000000;    tp.it_interval.tv_sec = 0;    tp.it_interval.tv_nsec = 50000000;;    timer_cnt = 0;    res = timer_settime( timers[0], 0, &tp, NULL );    CYG_ASSERT( res == 0 , "timer_settime() returned error");        sem_init(&synchro, 0, 0);    do    { res = sem_wait(&synchro);    } while( res == -1 && errno == EINTR );    CYG_ASSERT( res == 0 , "sem_wait() returned error");            res = timer_delete(timers[0]);    CYG_ASSERT( res == 0 , "timerdelete() returned error");        show_times(sched_ft, nscheds, "Timer latency [2 threads]");    for (i = 0;  i < 2;  i++) {        pthread_cancel(threads[i]);        pthread_join(threads[i], &retval);    }        for (i = 0;  i < ntest_threads;  i++) {        pthread_attr_setstackaddr( &attr, &stacks[i][STACK_SIZE] );        pthread_attr_setstacksize( &attr, STACK_SIZE );        res = pthread_create( &threads[i],                        &attr,                        timer_test,                        (void *)i                        );        CYG_ASSERT( res == 0 , "pthread_create() returned error");    }    wait_for_tick(); // Wait until the next clock tick to minimize aberations    sigev.sigev_signo = SIGRTMIN+1;    sigev.sigev_value.sival_ptr = (void*)(&timers[i]);    res = timer_create( CLOCK_REALTIME, &sigev, &timers[0]);    CYG_ASSERT( res == 0 , "timer_create() returned error");    tp.it_value.tv_sec = 0;    tp.it_value.tv_nsec = 50000000;    tp.it_interval.tv_sec = 0;    tp.it_interval.tv_nsec = 50000000;;    timer_cnt = 0;    res = timer_settime( timers[0], 0, &tp, NULL );    CYG_ASSERT( res == 0 , "timer_settime() returned error");        sem_init(&synchro, 0, 0);    do    { res = sem_wait(&synchro);    } while( res == -1 && errno == EINTR );    CYG_ASSERT( res == 0 , "sem_wait() returned error");            res = timer_delete(timers[0]);    CYG_ASSERT( res == 0 , "timerdelete() returned error");            show_times(sched_ft, nscheds, "Timer latency [many threads]");    for (i = 0;  i < ntest_threads;  i++) {        pthread_cancel(threads[i]);        pthread_join(threads[i], &retval);    }    sem_init(&synchro, 0, 0);    sem_init(&timer_sem, 0, 0);        pthread_attr_setstackaddr( &attr, &stacks[0][STACK_SIZE] );    pthread_attr_setstacksize( &attr, STACK_SIZE );    res = pthread_create( &threads[0],                          &attr,                          timer_test2,                          (void *)0        );    CYG_ASSERT( res == 0 , "pthread_create() returned error");        wait_for_tick(); // Wait until the next clock tick to minimize aberations    sigev.sigev_signo = SIGRTMIN+2;    sigev.sigev_value.sival_ptr = (void*)(threads[0]);    res = timer_create( CLOCK_REALTIME, &sigev, &timers[0]);    CYG_ASSERT( res == 0 , "timer_create() returned error");    tp.it_value.tv_sec = 0;    tp.it_value.tv_nsec = 50000000;    tp.it_interval.tv_sec = 0;    tp.it_interval.tv_nsec = 50000000;;    timer_cnt = 0;    res = timer_settime( timers[0], 0, &tp, NULL );    CYG_ASSERT( res == 0 , "timer_settime() returned error");    do    { res = sem_wait(&synchro);    } while( res == -1 && errno == EINTR );    CYG_ASSERT( res == 0 , "sem_wait() returned error");            res = timer_delete(timers[0]);    CYG_ASSERT( res == 0 , "timerdelete() returned error");            show_times(sched_ft, nscheds, "Timer -> thread post latency");    sem_post(&timer_sem);//    pthread_cancel(threads[0]);    pthread_join(threads[0], &retval);    end_of_test_group();}//--------------------------------------------------------------------------void run_all_tests(){    int i;    cyg_uint32 tv[nsamples], tv0, tv1;//    cyg_uint32 min_stack, max_stack, total_stack, actual_stack, j;    cyg_tick_count_t ticks, tick0, tick1;#ifdef CYG_SCHEDULER_LOCK_TIMINGS    cyg_uint32 lock_ave, lock_max;#endif#if defined(CYGVAR_KERNEL_COUNTERS_CLOCK_LATENCY) && defined(HAL_CLOCK_LATENCY)    cyg_int32 clock_ave;#endif    disable_clock_latency_measurement();//    cyg_test_dump_thread_stack_stats( "Startup, main stack", thread[0] );    cyg_test_dump_interrupt_stack_stats( "Startup" );    cyg_test_dump_idlethread_stack_stats( "Startup" );    cyg_test_clear_interrupt_stack();    diag_printf("\neCos Kernel Timings\n");    diag_printf("Notes: all times are in microseconds (.000001) unless otherwise stated\n");#ifdef STATS_WITHOUT_FIRST_SAMPLE    diag_printf("       second line of results have first sample removed\n");#endif    cyg_thread_delay(2);  // Make sure the clock is actually running    ns_per_system_clock = 1000000/rtc_resolution[1];    for (i = 0;  i < nsamples;  i++) {        HAL_CLOCK_READ(&tv[i]);    }    tv0 = 0;    for (i = 1;  i < nsamples;  i++) {        tv0 += tv[i] - tv[i-1];    }    end_of_test_group();        overhead = tv0 / (nsamples-1);    diag_printf("Reading the hardware clock takes %d 'ticks' overhead\n", overhead);    diag_printf("... this value will be factored out of all other measurements\n");    // Try and measure how long the clock interrupt handling takes    for (i = 0;  i < nsamples;  i++) {        tick0 = cyg_current_time();        while (true) {            tick1 = cyg_current_time();            if (tick0 != tick1) break;        }        HAL_CLOCK_READ(&tv[i]);    }    tv1 = 0;    for (i = 0;  i < nsamples;  i++) {        tv1 += tv[i] * 1000;    }    tv1 = tv1 / nsamples;    tv1 -= overhead;  // Adjust out the cost of getting the timer value    diag_printf("Clock interrupt took");    show_ticks_in_us(tv1);    diag_printf(" microseconds (%d raw clock ticks)\n", tv1/1000);    enable_clock_latency_measurement();    ticks = cyg_current_time();    show_test_parameters();    show_times_hdr();    reset_clock_latency_measurement();    run_thread_tests();    run_mutex_tests();//    run_mbox_tests();    run_semaphore_tests();    run_timer_tests();#ifdef CYG_SCHEDULER_LOCK_TIMINGS    Cyg_Scheduler::get_lock_times(&lock_ave, &lock_max);    diag_printf("\nMax lock:");    show_ticks_in_us(lock_max);    diag_printf(", Ave lock:");    show_ticks_in_us(lock_ave);    diag_printf("\n");#endif#if defined(CYGVAR_KERNEL_COUNTERS_CLOCK_LATENCY) && defined(HAL_CLOCK_LATENCY)    // Display latency figures in same format as all other numbers    disable_clock_latency_measurement();    clock_ave = (total_clock_latency*1000) / total_clock_interrupts;    show_ticks_in_us(clock_ave);    show_ticks_in_us(min_clock_latency*1000);    show_ticks_in_us(max_clock_latency*1000);    show_ticks_in_us(0);    diag_printf("            Clock/interrupt latency\n\n");    enable_clock_latency_measurement();    #endif#if defined(CYGVAR_KERNEL_COUNTERS_CLOCK_DSR_LATENCY)    disable_clock_latency_measurement();        clock_ave = (total_clock_dsr_latency*1000) / total_clock_dsr_calls;    show_ticks_in_us(clock_ave);    show_ticks_in_us(min_clock_dsr_latency*1000);    show_ticks_in_us(max_clock_dsr_latency*1000);    show_ticks_in_us(0);    diag_printf("            Clock DSR latency\n\n");    enable_clock_latency_measurement();#endif#if 0        disable_clock_latency_measurement();    min_stack = STACK_SIZE;    max_stack = 0;    total_stack = 0;    for (i = 0;  i < (int)NTEST_THREADS;  i++) {        for (j = 0;  j < STACK_SIZE;  j++) {            if (stacks[i][j]) break;        }        actual_stack = STACK_SIZE-j;        if (actual_stack < min_stack) min_stack = actual_stack;        if (actual_stack > max_stack) max_stack = actual_stack;        total_stack += actual_stack;    }    for (j = 0;  j < STACKSIZE;  j++) {        if (((char *)stack[0])[j]) break;    }    diag_printf("%5d   %5d   %5d  (main stack: %5d)  Thread stack used (%d total)\n",                 total_stack/NTEST_THREADS, min_stack, max_stack,                 STACKSIZE - j, STACK_SIZE);#endif    //    cyg_test_dump_thread_stack_stats( "All done, main stack", thread[0] );    cyg_test_dump_interrupt_stack_stats( "All done" );    cyg_test_dump_idlethread_stack_stats( "All done" );    enable_clock_latency_measurement();    ticks = cyg_current_time();    diag_printf("\nTiming complete - %d ms total\n\n", (int)((ticks*ns_per_system_clock)/1000));    CYG_TEST_PASS_FINISH("Basic timing OK");}int main( int argc, char **argv ){    CYG_TEST_INIT();    if (cyg_test_is_simulator) {        nsamples = NSAMPLES_SIM;        ntest_threads = NTEST_THREADS_SIM;        nthread_switches = NTHREAD_SWITCHES_SIM;        nmutexes = NMUTEXES_SIM;        nmboxes = NMBOXES_SIM;        nsemaphores = NSEMAPHORES_SIM;        nscheds = NSCHEDS_SIM;        ntimers = NTIMERS_SIM;      } else {        nsamples = NSAMPLES;        ntest_threads = NTEST_THREADS;        nthread_switches = NTHREAD_SWITCHES;        nmutexes = NMUTEXES;         nmboxes = NMBOXES;        nsemaphores = NSEMAPHORES;        nscheds = NSCHEDS;        ntimers = NTIMERS;    }    // Sanity#ifdef WORKHORSE_TEST    ntest_threads = max(512, ntest_threads);    nmutexes = max(1024, nmutexes);    nsemaphores = max(1024, nsemaphores);    nmboxes = max(1024, nmboxes);    ncounters = max(1024, ncounters);    ntimers = max(1024, ntimers);#else    ntest_threads = max(64, ntest_threads);    nmutexes = max(32, nmutexes);    nsemaphores = max(32, nsemaphores);    nmboxes = max(32, nmboxes);    ntimers = max(32, ntimers);#endif    run_all_tests();   }#endif // CYGFUN_KERNEL_API_C, etc.// EOF tm_basic.cxx

⌨️ 快捷键说明

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