Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

tableau grande taille PIC24
pucpood
Membre
Membre
Messages : 3
Enregistré en : septembre 2023

#1 Message par pucpood » mar. 21 nov. 2023 11:46

Bonjour,

Pour situer mon niveau : j'ai fait de la programmation bas niveau en assembleur 68000 et 8086 pendant mes études il y a plus 20 ans (ça fait mal...).
J'ai repris en 2022 avec un projet sur PIC24FJ1024GB610. Voilà.
Après avoir trouvé des sujets qui tournent autour du pot, je n'ai toujours pas les idées claires sur la gestion de la RAM sur mon PIC. Soit les sujets ne traitent pas exactement mon cas, soit c'est en Anglais et ma compréhension reste approximative.

Dans mon programme en C, je déclare en global un tableau :

Code : Tout sélectionner

char dummyElements [150][19];//150 chaînes de 18 caractères 


Ça compile sans problème. Mais lorsque je remplis le tableau ça plafonne à compteur = 26 :

Code : Tout sélectionner

for ( compteur compteur 150 compteur ++)
        
nbEcrits sprintf (dummyElements [compteur], "%03d"compteur); 

L'exécution se déroule sans plantage (par un coup de chance ?) et nbEcrits a toujours la bonne valeur.
J'ai essayé :

Code : Tout sélectionner

__eds__ char dummyElements [150][19__attribute__ ((edspage)); // même comportement sans le 'page' 

mais ça plante à la compilation sur :

Code : Tout sélectionner

sprintf (dummyElements [compteur], "%03d"compteur); 

error: passing argument 1 of 'sprintf' from pointer to non-enclosed address space

J'imagine que sprintf n'a pas le droit d'accéder à l'espace mémoire où a été installé le tableau ...

Comment allier la place pour un tel tableau avec une possibilité d'accès "universelle" ?

Merci de l'éclairage que vous pourrez m'apporter.

Laurent

tableau grande taille PIC24
Clodine
Membre
Membre
Messages : 1
Enregistré en : novembre 2023

#2 Message par Clodine » mer. 22 nov. 2023 08:22

Salut,
Je vois que tu as un problème avec la gestion de la RAM sur ton PIC24FJ1024GB610. Tu veux déclarer un grand tableau en mémoire et y accéder avec la fonction sprintf. Mais tu rencontres des erreurs de compilation ou d'exécution.
Pour résoudre ton problème, tu as deux options :

• Soit tu gardes ta déclaration de tableau sans le préfixe eds et l'attribut eds, mais tu fais attention à ne pas dépasser la taille d'une banque. Tu peux utiliser le pragma section pour spécifier la banque où tu veux placer ton tableau. Par exemple, tu peux écrire : #pragma section ram "gpr1" pour placer ton tableau dans la banque 1.

• Soit tu utilises le préfixe eds et l'attribut eds, mais tu modifies ton appel à sprintf pour utiliser un pointeur eds. Par exemple, tu peux écrire : sprintf ((char _eds *)dummyElements [compteur], "%03d", compteur);

J'espère que ces explications te seront utiles. Si tu as besoin d'autre chose, tu peux me le demander. Je suis là pour t'aider.
A bientôt !

tableau grande taille PIC24
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#3 Message par satinas » mer. 22 nov. 2023 10:52

Bonjour, après écriture comment lisez-vous le contenu des chaînes ?

tableau grande taille PIC24
Claudius
Avatar de l’utilisateur
Passionné
Passionné
Messages : 260
Âge : 69
Enregistré en : septembre 2015
Localisation : ELANCOURT (78 - YVELINES)
Contact :

#4 Message par Claudius » mer. 22 nov. 2023 13:41

Bonjour,

Cf. Grand tableau PIC24 sur FUTURA et accessoirement sur Grand tableau PIC24 sur ABCelectronique ;-))

tableau grande taille PIC24
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#5 Message par satinas » mer. 22 nov. 2023 13:47

Bonjour Claudius, c'est pour cela que j'ai mis 2 jours à répondre :-)

tableau grande taille PIC24
pucpood
Membre
Membre
Messages : 3
Enregistré en : septembre 2023

#6 Message par pucpood » jeu. 23 nov. 2023 08:35

Clodine a écrit :Salut,
Je vois que tu as un problème avec la gestion de la RAM sur ton PIC24FJ1024GB610. Tu veux déclarer un grand tableau en mémoire et y accéder avec la fonction sprintf. Mais tu rencontres des erreurs de compilation ou d'exécution.
Pour résoudre ton problème, tu as deux options :

• Soit tu gardes ta déclaration de tableau sans le préfixe eds et l'attribut eds, mais tu fais attention à ne pas dépasser la taille d'une banque. Tu peux utiliser le pragma section pour spécifier la banque où tu veux placer ton tableau. Par exemple, tu peux écrire : #pragma section ram "gpr1" pour placer ton tableau dans la banque 1.

• Soit tu utilises le préfixe eds et l'attribut eds, mais tu modifies ton appel à sprintf pour utiliser un pointeur eds. Par exemple, tu peux écrire : sprintf ((char _eds *)dummyElements [compteur], "%03d", compteur);

J'espère que ces explications te seront utiles. Si tu as besoin d'autre chose, tu peux me le demander. Je suis là pour t'aider.
A bientôt !


Bonjour Clodine et merci pour cette réponse très précise. J'ai légèrement modifié la syntaxe du cast pour qu'elle passe : (__eds__ char *) . Malheureusement ça coince toujours sur le sprintf.
Je ne sais donc toujours pas comment tirer parti d'un stockage dans l'EDS, mais mon problème initial est résolu, tu verras comment dans le post qui va suivre.

tableau grande taille PIC24
pucpood
Membre
Membre
Messages : 3
Enregistré en : septembre 2023

#7 Message par pucpood » jeu. 23 nov. 2023 08:45

Claudius a écrit :Bonjour,

Cf. Grand tableau PIC24 sur FUTURA et accessoirement sur Grand tableau PIC24 sur ABCelectronique ;-))


Eh oui ! Quand je jette une bouteille à la mer, je ne fais pas semblant !

La réponse à mon problème de départ se trouve ICI, merci @umfred !


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Bing [Bot] et 8 invités