MPLAB C18 PIC 矩陣長度超過限制 解決方法 自訂義BANK SECTION

FAQ-10 How do I create a large object in data memory (> 256 bytes)?

By default, MPLAB C18 assumes that an object will not cross a bank boundary. The
following steps are required to safely use an object that is larger than 256 bytes:

1. The object must be allocated into its own section using the #pragma idata or
#pragma udata directive:
#pragma udata buffer_scn
static char buffer[0x180];
#pragma udata

2. Accesses to the object must be done via a pointer:
char * buf_ptr = &buffer[0];

// examples of use
buf_ptr[5] = 10;
if (buf_ptr[275] > 127)

3. A region that spans multiple banks must be created in the linker script:
– Linker script before modification:
DATABANK NAME=gpr2 START=0x200 END=0x2FF
DATABANK NAME=gpr3 START=0x300 END=0x3FF
– Linker script after modification:
DATABANK NAME=big START=0x200 END=0x37F PROTECTED
DATABANK NAME=gpr3 START=0x380 END=0x3FF

4. The object’s section (created in Step 1) must be assigned into the new region
(created in Step 3) by adding a SECTION directive to the linker script:
SECTION NAME=buffer_scn RAM=big

我测试成功,定义一个:
/*
* Step #1 The data is allocated into its own section.
*/
#pragma udata bigdata
char rLcdBuffer[32][20]; //液晶显示缓冲区 32*160
#pragma udata

修改LKR文件:
// Step #3 Create a new region in the linker script
// This is the databank that will contain the large memory object
DATABANK NAME=largebank START=0x300 END=0x5FF PROTECTED
//DATABANK NAME=gpr3 START=0x300 END=0x3FF
//DATABANK NAME=gpr4 START=0x400 END=0x4FF
//DATABANK NAME=gpr5 START=0x500 END=0x5FF

DATABANK NAME=gpr6 START=0x600 END=0x6FF

// Step #4 – Assign the large memory object’s section into the new region
SECTION NAME=bigdata RAM=largebank

未經允許不得轉載:GoMCU » MPLAB C18 PIC 矩陣長度超過限制 解決方法 自訂義BANK SECTION