Ошибка памяти указателя - PullRequest
2 голосов
/ 18 апреля 2009

проблема

Я не могу получить данные из Flash-памяти, когда использую функцию, которая возвращает адрес нужного шаблона во Flash-памяти (упрощено в приведенном ниже примере только с 1 константой: PATTERN_P).

Код перед экспликацией

Тип patternp определяется как

typedef prog_uchar patternp[NUM_ROWS]; 

Глобальная переменная PATTERN_P - это массив типа patternp, определенный как

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

GetPattern ():

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

основной ():

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! 

}

экспликация

Как видите, код получает шаблон (в этом примере он будет возвращать PATTERN_P каждый раз ... чем я использую pgm_read_byte для получения данных из флэш-памяти. Это использует пространство AVR pgmspace (ссылка ниже). Он берет адрес и возвращает данные. Приведенный выше код работает, когда я использую прямой доступ к шаблону: & PATTERN_P [iRow], но не работает, когда я использую bufferPattern [iRow] или & bufferPattern [iRow]. Есть идеи?

Ссылка: pgm_read_byte определен в pgmspace

Ответы [ 2 ]

4 голосов
/ 18 апреля 2009

bufferPattern - указатель на массив. Когда вы пишете bufferPattern [iRow], это НЕ оценивает указатель на запись iRow из patternp; операция [] действует на указатель, а не на массив, на который он указывает. Похоже, что вы хотите написать это & ​​((* bufferPattern) [iRow]).

Это решит непосредственную проблему. Тем не менее, код немного сбивает с толку. Может случиться так, что ваш код будет упрощен путем прямой передачи массива (C не передает массивы по значению; поэтому он не будет копировать массив - вам не нужно указывать на массив, чтобы избежать этого).

1 голос
/ 18 апреля 2009

это

&PATTERN_P[iRow]

это

&(PATTERN_P[iRow])

когда ваша рабочая строка дает это:

(&PATTERN_P)[iRow]
...