2

问题

使用返回 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 
};

获取模式():

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中定义

4

2 回答 2

4

bufferPattern 是指向数组的指针。当您编写 bufferPattern[iRow] 时,这不会评估为指向 patternp 条目 iRow 的指针;[] 操作作用于指针,而不是它指向的数组。您似乎想要写的是 &((*bufferPattern)[iRow])。

这将解决眼前的问题。但是,代码有点混乱。可能通过直接传递数组来简化您的代码(C 不按值传递数组;因此它不会复制数组 - 您不需要创建指向数组的指针来避免这种情况)。

于 2009-04-18T19:14:34.140 回答
1

&PATTERN_P[iRow]

&(PATTERN_P[iRow])

当你的工作线给出这个:

(&PATTERN_P)[iRow]
于 2009-04-18T19:21:14.233 回答