Question

Le problème

Je ne peux pas obtenir les données de la mémoire flash lorsque vous utilisez la fonction qui renvoie l'adresse du motif souhaité dans Flash (simplifié dans l'exemple ci-dessous avec seulement 1 constante: PATTERN_P).

Une partie du code avant explicitation

est définie La patternp du type à

typedef prog_uchar patternp[NUM_ROWS]; 

La variable globale PATTERN_P est un tableau de type patternp, définie comme

const patternp PATTERN_P PROGMEM = {
   0b11110000 ,
   0b10010000 ,
   0b10010000 ,
   0b10010000 ,
   0b11110000 ,
   0b10000000 ,
   0b10000000 ,
   0b10000000 
};

getPattern ():

const patternp * getPattern()
{
      //... 
      return &PATTERN_P;
}
main ()

const patternp *bufferPattern = getPattern();

uint8_t rowPatternData[NUMBER_ROW_PER_MATRIX];
const patternp *bufferPattern = getPattern(s[iLetter]);  
for(int iRow = 0; iRow<NUMBER_ROW_PER_MATRIX; iRow++)
{  
    rowPatternData[iRow]=pgm_read_byte( &PATTERN_P[iRow] );   // <--- WORK!
    rowPatternData[iRow]=pgm_read_byte( bufferPattern[iRow] ); // Not Working! 

}

Explications

Comme vous pouvez le voir, le code obtenir le motif (dans cet exemple, il retournera PATTERN_P chaque fois que ... que je ne l'utilise pgm_read_byte pour obtenir les données de la mémoire Flash. Utiliser le pgmspace AVR (lien ci-dessous). il faut une adresse et renvoie les données le code ci-dessus travail lorsque j'utilise l'accès direct d'un modèle:. & PATTERN_P [iRow], mais ne fonctionnera pas quand je l'utilise bufferPattern [iRow] ou & bufferPattern [iRow] Toute idée <.? / p>

Référence: pgm_read_byte est défini dans pgmspace

Était-ce utile?

La solution

bufferPattern est un pointeur sur un tableau. Lorsque vous écrivez bufferPattern [iRow], cela n'évalue pas à un pointeur vers iRow d'entrée de patternp; l'opération agit sur le pointeur, pas le tableau [] il pointe. Ce que vous semblez vouloir écrire est & ((* bufferPattern) [iRow]).

qui résoudra le problème immédiat. Cependant, le code est un peu déroutant. Il se peut que votre code serait simplifié en passant le tableau directement (C ne passe pas par la valeur des tableaux, donc il ne sera pas copier le tableau - vous n'avez pas besoin de faire un pointeur vers le tableau pour éviter cela).

Autres conseils

&PATTERN_P[iRow]

est

&(PATTERN_P[iRow])

lorsque votre ligne de travail donne ceci:

(&PATTERN_P)[iRow]
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top