Hi Gilles,

i added this in configure of xenomai so i pass --enable-arm-mach=imx25

imx25)        arch=5
            tsc_type=__XN_TSC_TYPE_FREERUNNING;;

Furthermore in plat-mxc/include/mach/mxc.h explain which are cpumx2 and imx25 is NOT mx2
#define cpu_is_mx2()    (cpu_is_mx21() || cpu_is_mx27())

i don't understand a things.
Does the tsc necessary to calculate correct timer period, or can i disable tsc and xenomai continue work correctly ?

However i cannot use tsc in my simple application. I resend the simple C application that doesn't work.


Il 10/04/2012 13:25, Gilles Chanteperdrix ha scritto:
On 04/10/2012 12:39 PM, Roberto Bielli wrote:
Hi Gilles,

i tried your code but th behavior is the same.

Then i tried a linux base app and works correctly.
The tsc physical address passed to user-space looks wrong.

void __ipipe_mach_get_tscinfo(struct __ipipe_tscinfo *info)
{
        info->type = IPIPE_TSC_TYPE_FREERUNNING;
        if (cpu_is_mx1()) {
#ifdef CONFIG_ARCH_MX1
                info->u.fr.counter = (unsigned *) (TIM1_BASE_ADDR + MX1_2_TCN);
#endif
        } else if (cpu_is_mx2()) {
#ifdef CONFIG_ARCH_MX2
                info->u.fr.counter = (unsigned *) (GPT1_BASE_ADDR + MX1_2_TCN);
#endif
        } else if (cpu_is_mx3() || cpu_is_mx25() ) {
#if defined CONFIG_ARCH_MX3 || defined CONFIG_ARCH_MX25
                info->u.fr.counter = (unsigned *) (GPT1_BASE_ADDR + MX3_TCN);
#endif
        }
        info->u.fr.mask = 0xffffffff;
        info->u.fr.tsc =&tsc->full;
}

Here cpu_is_mx2() will return true, and we will not go to cpu_is_mx25().

Are you using the tsc in user-space?

If you are passing --enable-arm-mach=mx2 to xenomai configure
script, you are using the tsc in user-space, and it is a wonder
how it works.



--
+------------------------------------------------------------------------------------------------+
                                                        
Roberto Bielli
Sviluppo Software                                       
Axel S.r.l.                                     
                                                        
Via Del Cannino, 3                              
21020 Crosio Della Valle                        
Varese - Italy                                  
                                                        
Telefono: +39 0332 949600                       
Fax:      +39 0332 969315                       
                                                        
E-mail:   roberto.bie...@axelsw.it      
Web Site: www.axelsw.it

+------------------------------------------------------------------------------------------------+

Si precisa che le informazioni contenute in questo messaggio sono riservate e 
ad uso esclusivo del destinatario.
Qualora il messaggio in parola Le fosse pervenuto per errore, La preghiamo di 
eliminarlo senza copiarlo e di non inoltrarlo a terzi,
dandocene gentilmente comunicazione. Grazie.
Informativa sul trattamento dei dati personali (D. Lgs. 196/2003).
I dati utilizzati per la spedizione del presente messaggio sono utilizzati da 
Axel S.r.l., titolare del trattamento,
per l'invio delle comunicazioni dei diversi settori aziendali, non essendo 
autorizzata la divulgazione a terzi.
Potrete rivolgere alla seguente mail richieste di verifica, rettifica o 
cancellazione dei Vostri dati: i...@axelsw.it

This e-mail and any attachments is confidential and may contain privileged 
information
intended for the addressee(s) only. Dissemination, copying, printing or use by 
anybody
else is unauthorised. If you are not the intended recipient,
please delete this message and any attachments and advise the sender
by return e-mail.Thank you.                     
                                                        
+------------------------------------------------------------------------------------------------+

#include <stdio.h>
#include <stdint.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <string.h>

#include <stdlib.h>
#include <stdio.h>
#include <sys/mman.h>   /* for MCL_CURRENT and MCL_FUTURE */
#include <rtdm/rtdm.h>
#include <native/task.h>
#include <nucleus/trace.h>

#define GPIO6_ON                *Gpio2ValAddr |= 1 << 6
#define GPIO6_OFF               *Gpio2ValAddr &= ~(1 << 6);

static RT_TASK rt_task_desc;
static RT_TASK tsk2ms;

        //dati per la gestione memoria mappata
static unsigned long * Gpio2ValAddr = NULL;

volatile int cnt2ms = 0;
volatile int cntmain = 0;
volatile int x;

void funct2ms( void * params )
{
        for(;;)
        {
                GPIO6_ON;
                rt_task_sleep( 2000000 );
                ++ cnt2ms;
                GPIO6_OFF;
        }
}

int main(int argc, char *argv[])
{
        int count = 0;
        int traceOn = 0;
        int fd, ret;

        // no memory-swapping for this programm
        ret = mlockall(MCL_CURRENT | MCL_FUTURE);
        if( ret )
        {
                perror("ERROR : mlockall has failled");
                exit(1);
        }


        fd = open( "/dev/mem", O_RDWR | O_SYNC );
        printf( "FD=%d", fd );
        fflush( stdout );

        Gpio2ValAddr = (unsigned long  *)mmap(  NULL, 0x1000, PROT_READ | 
PROT_WRITE,  MAP_SHARED, fd, 0x53FD0000 );
        GPIO6_ON;
        GPIO6_OFF;

        rt_task_create( &tsk2ms, "task2ms",0, 99, 0 );
        rt_task_start( &tsk2ms, funct2ms, NULL );
        
        ret = rt_task_shadow(&rt_task_desc, NULL, 1, 0);
        if( ret != 0 )
        {
                fprintf(stderr, "ERROR : rt_task_shadow: %s\n", strerror(-ret));
                exit( 1 );
        }

        for(;;)
        {
                for( x=0; x < 1000000; x++ );
                for( x=0; x < 1000000; x++ );
                //xntrace_user_freeze(0, 0);
                for( x=0; x < 1000000; x++ );
                for( x=0; x < 1000000; x++ );
                rt_task_sleep( 10000000 );
        }

        return 0;
}
_______________________________________________
Xenomai-core mailing list
Xenomai-core@gna.org
https://mail.gna.org/listinfo/xenomai-core

Reply via email to