当使用返回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(下面的链接)。它需要一个地址并返回数据。当我使用模板的直接访问时,上面的代码工作:&amp; PATTERN_P [iRow],但是当我使用bufferPattern [iRow]或&amp; bufferPattern [iRow]时将无法工作。有什么想法吗?
参考:pgm_read_byte在pgmspace
中定义答案 0 :(得分:4)
bufferPattern是一个指向数组的指针。当你编写bufferPattern [iRow]时,这不会评估指向patternp的入口iRow的指针; []操作作用于指针,而不是它指向的数组。你似乎想写的是&amp;((* bufferPattern)[iRow]。
这将解决眼前的问题。但是,代码有点令人困惑。通过直接传递数组可能会简化您的代码(C不会按值传递数组;因此它不会复制数组 - 您不需要指向数组以避免这种情况)。
答案 1 :(得分:1)
此
&PATTERN_P[iRow]
是
&(PATTERN_P[iRow])
当你的工作线给出时:
(&PATTERN_P)[iRow]