2014-08-29 7 views
0

그래서 내 Arduino에 프로그램 메모리에 다차원 CHAR 배열을 저장하려고하는데 문제가 발생합니다. 여기에 당신은 pgm_read_word 호출을 사용한다, 다시 문자 데이터에 대한 포인터를 얻을 할 ... PROGMEM 문서 당PROGMEM을 사용할 때 무엇이 ​​누락 되었습니까?

typedef unsigned char RGBBitmap[8][8][3]; 
typedef prog_uchar ProgRGBBitmap[8][8][3]; // Have to use prog_uchar for stuff stored in progmem 

ProgRGBBitmap Mailbox[3] PROGMEM = 
{ 
    ... // some initializing data 
}; 

, 내가 가진거야. 그러나 이것을 사용하여 다시 읽으려고하면 ...

RGBBitmap * pMailbox0 = (RGBBitmap*)pgm_read_word(&Mailbox[0]); 

... 모두 내가 쓰레기가됩니다.

PROGMEM 행을 삭제하고 RGBBitmap 포인터로 작업하고 pgm_read_word를 삭제하면 작동하지만 RAM에 있습니다.

그래서 내가 무엇을 놓치고 있습니까?

+0

오늘의 큰 질문 : 어떤 컴파일러와 플랫폼을 사용하고 있습니까? 필자가 사용하고있는 컴파일러 중에'PROGMEM' 키워드가 없으며 임베디드 시스템 및 PC 용으로 쓰고 있습니다. –

+0

@ThomasMatthews http://arduino.cc/en/Reference/PROGMEM –

+0

Arduino가 키워드로 불렀습니다. 그래도 대답을하기 위해 q를 업데이트 할 것입니다. – MarqueIV

답변

0

배열은 값 블록입니다. 그들이 거기에 저장되지 않기 때문에

ProgRGBBitmap Mailbox[3] PROGMEM = {...}; 
... removing typedef is same as ... 
prog_uchar Mailbox[3][8][8][3] = {...}; 

그래서 당신은 프로그램 메모리에서 포인터를 읽을 수 없습니다 :이처럼 코드 값의 연속 블록을 정의한다. 블록은 모두 uchar입니다.

uc = (uchar)pgm_read_byte(someaddress); 

을 이제 4 차원 배열에 대한 까다로운 부분은 정확한 주소 구문을 받고있다 : 당신이 그 블록에서 값을 읽을 것, 그래서

귀하의 모든 값은 바이트.

uc = (uchar)pgm_read_byte(&Mailbox[i][x][y][c]); 

컴파일러가 포인터 연산을 삽입 할 것이다 [I] ... [C], 루프에 낭비 될 수있다. 그래서 포인터의 일부분을 미리 계산할 수 있습니다. 이렇게하면 코드 및 시계 틱이 저장됩니다.

ProgRGBBitmap* ptrOneBox = &(Mailbox[i]); // this will be pointer into block 
for(x ... 
    for(y .... 
    uc = (uchar)pgm_read_byte(&(ptrOneBox[x][y][c])); // this indexes out one byte 

포인터 및 배열을 사용하면 효과가 없을 때 미칠 수 있습니다. 디버거가없는 플랫폼에서 PROGMEM을 던지십시오.

간단한 문제로 문제를 해결하고 다시 작업하십시오.

+0

닫기지만, 꽤 아닙니다. 궁극적으로 다차원은 데이터를보고 디버깅 할 때 나에게 편의를 제공합니다. 아시다시피, 그들은 모두 메모리에 연속적으로 저장되므로 실제로 char 포인터와 포인터 산술을 통해 액세스 할 수있는 간단한 char 배열로 취급 될 수 있습니다. 편지함은 192 개의 문자 (8x8 배열의 3 가지 색상)의 특정 '그룹'으로 이동하기위한 것이 었습니다. 하지만 네가하는 말의 나머지 부분을 얻는다. 내 실수는 pgm_read_xxx가 프로그램 공간의 한 포인터를 RAM 공간에서 사용할 수있는 포인터로 변환하는 것이라고 생각했다. – MarqueIV

+0

내가 얻지 못하는 이유는 단순히 다른 사람들에게 전달할 수있는 포인터를 전달하는 대신 한 번에 하나씩 문자를 복사해야하는 이유입니다. Your For x/y (및 Z)는 시작 포인터에서 시작하여 진행하는 대신 192 바이트의 단일 바이트 읽기를 추가합니다. 그래서 내가 memcpy_PF 등을 시도했지만 Arduino에 정의되어 있지 않은 것 같습니다. 처음부터 다시 시작하려면 (그리고 주석에는 단락이 없어야합니다.) RAM의 다른 위치에 한 번에 모두 복사하려는 192 개의 문자 블록이 세 개 있습니다.어떻게 할 수 있습니까? – MarqueIV

+0

두 가지 질문이 있습니다. 힌트 : 1. Harvard 대 Von Neumann 2. memcpy_P (dest, (PGM_VOID_P) saddr, n)를 사용할 수 있습니다 (Arduino IDE 설치에서 pgmspace.html 및 pgmspace.h를 검색하십시오) – jdr5ca