c - 指针内存错误

标签 c embedded avr

问题

当使用返回闪存中所需模式地址的函数时,我无法从闪存获取数据(在下面的示例中进行了简化,仅使用 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

最佳答案

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

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

关于c - 指针内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/763936/

相关文章:

php - 使用 SWIG 创建 PHP C/C++ 扩展模块

c - pic16f877a uart嵌入式c代码

memory - 如何在 MPLAB 中增加内存块的大小?

embedded - 什么是嵌入式系统? Mobile可以被视为嵌入式产品吗?

makefile - Atmel Studio 中的外部 makefile 无法构建。 Windows 错误 0xc0000142

c - 如何优化公式?

c - 与缓存行对齐并了解缓存行大小

c - 重新分配指针后分配的内存

c - 将 simulavr 与 avr-gdb 一起使用时抛出奇怪的异常

C:使用单个#define 传递两个逗号分隔的值