I am sorry, i forget to include rt_process.c

Thanks.


__________________________________________________
Do You Yahoo!?
Yahoo! Autos - Get free new car price quotes
http://autos.yahoo.com
/*
COPYRIGHT (C) 2000  Paolo Mantegazza ([EMAIL PROTECTED])

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.

This library 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
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
*/


#include <linux/module.h>

#include <asm/io.h>

#include <asm/rtai.h>
#include <rtai_fifos.h>
#include <rtai_sched.h>

//#define DISTRIBUTE

#define SEM_TYPE (CNT_SEM | FIFO_Q)

#define STACK_SIZE 500

#define NR_TASKS 30

#define LOOPS 1000

RT_TASK thread[NR_TASKS];

static int cpu_used[NR_RT_CPUS];

static SEM sem;

static volatile int change;

static void rt_task(int t) {
        while(1) {
                if (change) {
                        rt_sem_wait(&sem);
                } else {
//                      rt_sem_wait(&sem);
//                      rt_sem_signal(&sem);
                        rt_task_suspend(thread + t);
                }
                cpu_used[hard_cpu_id()]++;
        }
}

int init_module(void)
{
        volatile RTIME t;
        int i, k;

        printk("\nWait for it ...\n");
        rt_typed_sem_init(&sem, 1, SEM_TYPE);
        rt_linux_use_fpu(1);
        for (i = 0; i < NR_TASKS; i++) {
#ifdef DISTRIBUTE
                rt_task_init_cpuid(thread + i, rt_task, i, STACK_SIZE, 0, 1, 0,  i%2);
#else
                rt_task_init_cpuid(thread + i, rt_task, i, STACK_SIZE, 0, 1, 0,  
hard_cpu_id());
#endif
        }
        change = 0;
        hard_cli();
        t = rdtsc();
        for (i = 0; i < LOOPS; i++) {
                for (k = 0; k < NR_TASKS; k++) {
                        rt_task_resume(thread + k);
                        rt_busy_sleep(100);
                }
        }
        t = rdtsc() - t;
        hard_sti();
        printk("\n\nFOR %d TASKS: ", NR_TASKS);
        printk("TIME %d (ms), SUSP/RES SWITCHES %d, ", (int)llimd(t, 1000, CPU_FREQ), 
2*NR_TASKS*LOOPS);
        printk("SWITCH TIME (INCLUDING FULL FP SUPPORT) %d (ns)\n", 
(int)llimd(llimd(t, 1000000000, CPU_FREQ), 1, 2*NR_TASKS*LOOPS));
//
        change = 1;
        for (k = 0; k < NR_TASKS; k++) {
                rt_task_resume(thread + k);
        }
        hard_cli();
        t = rdtsc();
        for (i = 0; i < LOOPS; i++) {
                for (k = 0; k < NR_TASKS; k++) {
                        rt_sem_signal(&sem);
                }
        }
        t = rdtsc() - t;
        hard_sti();
        printk("\nFOR %d TASKS: ", NR_TASKS);
        printk("TIME %d (ms), SEM SIG/WAIT SWITCHES %d, ", (int)llimd(t, 1000, 
CPU_FREQ), 2*NR_TASKS*LOOPS);
        printk("SWITCH TIME (INCLUDING FULL FP SUPPORT) %d (ns)\n\n", 
(int)llimd(llimd(t, 1000000000, CPU_FREQ), 1, 2*NR_TASKS*LOOPS));
//
        return 0;
}


void cleanup_module(void)
{
        int i;
        for (i = 0; i < NR_TASKS; i++) {
                rt_task_delete(thread + i);
        }
        printk("\nCPU USE SUMMARY\n");
        for (i = 0; i < NR_RT_CPUS; i++) {
                printk("# %d -> %d\n", i, cpu_used[i]);
        }
        printk("END OF CPU USE SUMMARY\n\n");
        rt_sem_delete(&sem);
}

Reply via email to