organisation mémoire des pic ???
Répondre à la discussion
Affichage des résultats 1 à 6 sur 6

organisation mémoire des pic ???



  1. #1
    invite9426e977

    organisation mémoire des pic ???


    ------

    salut,
    je suis en train de réaliser un projet utilisant un recepteur GPS.
    je communique en SIRF (binaire).
    je souhaite utiliser une structure pour stocker et lire les données facilement.
    donc j'ai créé une structure correspondant aux données envoyées.
    je copie le buffer de réception dans la structure.

    pour les test, j'utilise un buffer que j'ai remplis dans le code.

    voici le début de la structure :

    Code:
    typedef struct
    {
    	unsigned char 	messageID;
    	unsigned short 	nav_valid;
    	unsigned short 	nav_type;
    	unsigned short 	ext_week_number;
    	unsigned long int 	time_of_week;
    	unsigned short 	utc_year;
    	unsigned char 	utc_month;
    	unsigned char 	utc_day;
    ...
    et ce que j'y met :
    Code:
    0xA0, 0xA2, 0x00, 0x5B, 0x29, 0x00, 0x00 , 0x02 , 0x04 , 0x04 , 0xE8 , 0x1D , 0x97 , 0xA7 , 0x62 , 0x07 , 0xD4 , 0x02 , 0x06 , 0x11


    voila le code :
    Code:
    void parseSIRF(unsigned char* val, int len)
    {
    	sirf_41* message;
    	int i = 0;
    
    	while(i + 4 < len && (val[i] != 0xA0 || val[i + 1] != 0xA2 || val[i + 2] != 0x00 || val[i + 3] != 0x5B || val[i + 4] != 0x29))      // détection du début de séquence SIRF du message 41
    	 	i++;
    
    	if (i + 95 < len)
    	{
    		message = malloc(sizeof(sirf_41));
    		memcpy(message, &(val[i+4]), 91);
    		
    		i = message->nav_valid;
    	}
    	else
    		return(0);
    	
    }
    passons le problème du au big endian(micro) et little endian (comm)
    j'ai plusieurs problème :

    quand je teste la longeur de la structure (avec sizeof), j'obtiens 94 alors qu'elle doit faire 91 octets, d'ou viens ce problème.

    mais surtout, quand je lis les champs, je suis décalé, messageID est correct, mais le reste n'est pas bon, je suis décalé, j'obtiens 0x0002 pour nav_valid au lieu de 0x0000.

    le microcontroleur est un 24f08ka101, je suis en simulation.

    -----

  2. #2
    invitef86a6203

    Re : organisation mémoire des pic ???

    En C les structures sont souvent alignées sur un type, il est possible que les char soit en fait des int dans la structure ou des char avec un octet suplémentaire d'alignement.

  3. #3
    invite9426e977

    Re : organisation mémoire des pic ???

    est-tu sur de toi car en prog on utiliser les structures pour écrire dans les fichiers... et si la structure changeais en fonction des programmes, on pourrais pas.
    et ça me ferais bien chi**....

  4. #4
    invite9426e977

    Re : organisation mémoire des pic ???

    visiblement tu as raison :

    Code:
    	unsigned char 	messageID;
    	unsigned short 	nav_valid;
    = 4 octets
    Code:
    	unsigned char 	messageID;
    = 1 octet
    Code:
    unsigned short 	nav_valid;
    = 2 octets.


    y a t-il une solution pour ce que je sohaite faire ?

  5. A voir en vidéo sur Futura
  6. #5
    invitef86a6203

    Re : organisation mémoire des pic ???

    Citation Envoyé par nordiste Voir le message
    est-tu sur de toi car en prog on utiliser les structures pour écrire dans les fichiers... et si la structure changeais en fonction des programmes, on pourrais pas.
    et ça me ferais bien chi**....
    Lorsqu'on sauve une structure complète a partir d'un pointeur , on doit faire sizeof(struct ...) sinon on risque de la tronçonner !

    cours de base de l'ANSI C K&R

    lorsqu'on relie avec la même struct déclarée il retrouve les bons éléments

  7. #6
    RISC

    Post Re : organisation mémoire des pic ???

    Salut,

    La solution passe je pense par l'utilisation de l'attribut "packed" (voir le manuel du compilateur C30).

    Il faut cependant faire TRES ATTENTION à l'utilisation de cet attribut qui peut provoquer des exceptions s'il est mal utilisé, notamment dans un accès non aligné (prendre soin d'écrire un exception handler au cas où...)

    Dans la rubrique "Differences Between MPLAB C30 and ANSI C" on peut lire :

    Code:
    packed
    The packed attribute specifies that a variable or structure field should have the
    smallest possible alignment – one byte for a variable, and one bit for a field, unless you
    specify a larger value with the aligned attribute.
    Here is a structure in which the field x is packed, so that it immediately follows a:
    
    struct foo
           {
            char a;
            int x[2] __attribute__ ((packed));
            };
    
    Note: The 16 bits devices requires that words be aligned on even byte boundaries, so care must be taken when using the packed attribute to avoid runtime addressing errors.
    a+

Discussions similaires

  1. Organisation programme PIC 16f887
    Par invitede334bfc dans le forum Électronique
    Réponses: 2
    Dernier message: 02/06/2010, 12h01
  2. [Exercice] Organisation et rôles des neurones
    Par invite9f13d763 dans le forum Biologie
    Réponses: 0
    Dernier message: 19/04/2009, 13h41
  3. Organisation des voeux
    Par invite16a38319 dans le forum Orientation après le BAC
    Réponses: 7
    Dernier message: 25/02/2009, 01h35
  4. Organisation des nombres premiers
    Par invitea29d3201 dans le forum Mathématiques du supérieur
    Réponses: 25
    Dernier message: 06/11/2008, 10h24
  5. organisation des electron de la couche(L)
    Par hterrolle dans le forum Physique
    Réponses: 10
    Dernier message: 13/11/2006, 18h34
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...