2009-02-09 9 views
2

마이크로 칩 PIC MPLAB (MCC18) 컴파일러는 메모리를 256 개의 청크 (0x100)로 분할합니다.어떻게 MPLAB에서 메모리 블록의 크기를 늘릴 수 있습니까?

256 바이트보다 큰 배열을 만들려면 어떻게해야합니까? 나는 그래서 더 큰 버퍼를 할당 할 수 있도록 MCC18을 강제 할 수 중 하나 #pragma

#pragma udata segment_name 
char buffer[256]; 
#pragma udata 

와 별도의 세그먼트를 만드는 데 필요한

char buffer[256]; 

그냥 256에 얻는 방법? 또는 두 개의 메모리 세그먼트를 결합 할 수 있습니까?

답변

2

아마 더 많은 지식을 가진 사람이 나에게 잘못을 알릴 것입니다.하지만 원하는대로 할 수 있다고 생각하지 않습니다. 장치의 메모리가 256 바이트의 세그먼트로 분할 된 경우 AFAIK 배열을 가질 수 없습니다. 그렇게했다면 배열을 인접한 메모리로 취급 할 수 있도록 모든 종류의 고리를 뛰어 넘어야 할 것입니다. 배열을 어느 세그먼트에 속해야하는지 파악하기 위해 사용하는 각 인덱스를 확인한 다음 오프셋과 액세스를 계산해야합니다 또는 포인터 연산을 사용하여 배열에 액세스하는 경우, 액세스하려는 항목을 알아 내야합니다. 이는 컴파일 타임에 알 수 없거나 알 수없는 것일 수도 있습니다. 나는 그것이 어떤 메모리 위치가 은행에서 공통적으로 사용되는 방식 때문에 모든 상황에서 사용할 수있는 단일 메모리 모델을 가지고 있지 않다고 생각한다 (프로그램 카운터가 그러한 위치에 있다고 생각한다). 전형적인 PIC 아키텍처에 대한 지식과 써드 파티 C 컴파일러에 대한 경험. MPLAB 자체에 대한 많은 경험이 없으므로 소금 한 알로 대답을하십시오.

포인터 배열을 할당 한 다음 각 포인터를 저장할 데이터 형식의 새 인스턴스로 초기화하면 제한을 피할 수 있습니다 (구조체 또는 더 큰 것으로 가정 함). 포인터보다), 메모리가 연속적 일 필요가 없으므로. 그러나 PIC의 동적 메모리 할당은 비용이 많이 들기 때문에 좋은 옵션이 아닙니다.

+0

"FAR"포인터 개념이있을 수 있습니다. –

5

붙여 넣기 대답에서 :

http://forum.microchip.com/printable.aspx?m=39357

그냥 케이스에 멀리 간다.

In Three Easy Steps Step 1: Assign the variable into a named section in source code:

#pragma udata big_scn 
char big_array[0x180]; 
#pragma udata 

Step 2: Create the larger region in the linker script: Before:

DATABANK NAME=gpr3 START=0x300 END=0x3FF 
DATABANK NAME=gpr4 START=0x400 END=0x4FF 

After:

DATABANK NAME=big_scn START=0x300 END=0x47F PROTECTED 
DATABANK NAME=gpr4 START=0x480 END=0x4FF 
SECTION NAME=big_scn RAM=big_scn 

Step 3: Reference only through a pointer:

char *big_array_ptr = &big_array[0]; 
big_array_ptr[0x100] = 5; 
while(big_array_ptr[x] != 20) 

참고 : 포인터를 사용하는 대신 배열을 직접 참조 할 수 있다고 생각합니다. 나를 위해 일하는 것 같습니다.

같은 정보는 다음 문서에서 찾을 수 있습니다

MPLAB C18 C Compiler Getting Started Guide

페이지 (104)

+0

죽을 수있는 링크 대신 해결책을 제시해 주셔서 감사합니다. – Robert

+0

이런 일을한다면 학생 대신 유료 C18 컴파일러를 사용하는 것이 더 중요하다는 점에 유의하십시오. 상황에 따라 은행 입금을 최적화 할 수 있습니다. –

0

나는이 방법을 사용할 거라고 비슷한 문제가 있습니다 http://www.hobbytronics.co.uk/c18-large-data-arrays
그러나 때! 프로젝트에 아무런 변경없이 링커를 추가하고 프로젝트를 컴파일했습니다.이 오류가 발생했습니다.
// $ Id : 18f2550.lkr, v 1.3 2005/03/24 04:17:19 craigfranklin Exp $
// 파일 :
18f2550 다음 PIC18F2550 프로세서

LIBPATH . 

    //CODEPAGE NAME=vectors START=0x0   END=0x29   PROTECTED 
    CODEPAGE NAME=page  START=0x0   END=0x6FFB 
    CODEPAGE NAME=boot  START=0x6FFC   END=0x7FFF   PROTECTED 
    CODEPAGE NAME=idlocs  START=0x200000  END=0x200007  PROTECTED 
    CODEPAGE NAME=config  START=0x300000  END=0x30000D  PROTECTED 
    CODEPAGE NAME=devid  START=0x3FFFFE  END=0x3FFFFF  PROTECTED 
    CODEPAGE NAME=eedata  START=0xF00000  END=0xF000FF  PROTECTED 

    ACCESSBANK NAME=accessram START=0x0   END=0x5F 
    DATABANK NAME=gpr0  START=0x60   END=0xFF 
    DATABANK NAME=gpr1  START=0x100   END=0x1FF 
    DATABANK NAME=gpr2  START=0x200   END=0x2FF 
    DATABANK NAME=gpr3  START=0x300   END=0x3FF 
    DATABANK NAME=usb4  START=0x400   END=0x4FF   PROTECTED 
    DATABANK NAME=usb5  START=0x500   END=0x5FF   PROTECTED 
    DATABANK NAME=usb6  START=0x600   END=0x6FF   PROTECTED 
    DATABANK NAME=usb7  START=0x700   END=0x7FF   PROTECTED 
    ACCESSBANK NAME=accesssfr START=0xF60   END=0xFFF   PROTECTED 

    SECTION NAME=CONFIG  ROM=config 
    SECTION NAME=bank1  RAM=gpr1 
    SECTION NAME=usbram4 RAM=usb4 
    SECTION NAME=usbram5 RAM=usb5 
    SECTION NAME=eeprom  ROM=eedata 


오류 18f2550.lkr
// 샘플 링커 스크립트.lkr : 5 : 경고 : (374) 기본 유형이 누락되었습니다. int assumed 18f2550.lkr : 5 : 오류 : (314) ";" 예상치
whay? 모든 것이 사실입니다!
mplabx v 2.0 및 Mplab xc8 v 1.31