본문 바로가기

[Microchip]/dsPIC

dsPIC33 large const 메모리 할당 - PSV 사용하기

dsPIC33 large const 메모리 할당 - PSV 사용하기


dsPIC33보드를 이용하여 EXP-ARM TFT LCD에 이미지를 출력하려고 const 데이터를 할당받았는데 에러가 발생한다.
하드웨어 구조상 32k 이상 할당이 안된다고 한다.
해결책이 없을까?

dsPIC에서 const 데이터는 코어 구조상 32byte까지 할당 가능하다. 대용량의 코드 데이터(constant)를 할당 받으려면 PSV를 이용하면 된다고 한다. 물론 psv를 할당해도 32kbye단위로 설정 가능하다.(그냥 const로 설정하면 32k 이상 할당 할 수가 없다.)
32KB 영역(0x8000 ~ 0xFFFF)을 페이지 별로 할당하여 사용할 수 있다고 한다.


C30컴파일러 에서는 __attribute__((space(psv))) 로 설정할 수 있다.
사용할 때는 PSVPAG = __builtin_psvpage(&arry) 으로 설정해서 사용하면 된다.


186T TFT LCD 이미지는 32K가 넘어 가므로 이미지를 두부분으로 나누고 각각 PSV영역에 할당해서 이미지 출력할때 각각 출력하는 형식을 취했다.

const unsigned int __attribute__((space(psv))) Image4[]={
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
:
}

const unsigned int __attribute__((space(psv))) Image5[]={
0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
:
}


void Disp_Image_PIC()
{
   unsigned int i,j,k=0;
   int temp;

    Set_Entry_Hor();
// Set_Entry_Ver();
    Set_Write_Gram();
 
//첫번째 PSV 할당
   PSVPAG = __builtin_psvpage(&Image4);
   CORCONbits.PSV = 1;
 
    for(i=0; i<LCD_XLINE_SIZE/2; i++)
    {
      for(j=0; j<LCD_YLINE_SIZE; j++)
      {
        Lcd_Data(Image4[k]);
        k++;
      }
    }

//두번째 PSV 할당
   PSVPAG = __builtin_psvpage(&Image5);
   k=0;
    for(i=0; i<LCD_XLINE_SIZE/2; i++)
    {
      for(j=0; j<LCD_YLINE_SIZE; j++)
      {
        Lcd_Data(Image5[k]);
        k++;
      }
    }

 PSVPAG=temp; // Restore auto_psv page
}





 

반응형