Data Analysis for Investment & Control

[DSP 성능 향상] 플래시 모드 성능 높히기 - 인터럽트 벡터 램에 복사하기 본문

Robotics/Hardware

[DSP 성능 향상] 플래시 모드 성능 높히기 - 인터럽트 벡터 램에 복사하기

아슈람 2010. 10. 6. 14:39
반응형
Copying Sections from Flash to RAM - Copying the Interrupt Vectors(non-DSP/BIOD projects only)

이 글은 TI에서 제공하고 있는 문서 "Running an Application from Internal Flash Memory on the TMS320F28xxx DSP" (문서 번호 SPRA958I)를 참고하여 작성된 것임을 알려드립니다.


Perpheral Interrupt Expansion(PIE) 모듈은 F28xxx 디바이스의 인터럽트 요청을 관리합니다. 전원이 켜지면, 모든 인터럽트 벡터들은 비휘발성 메모리(예를들어, Flash)에 위치하게 되는데, 코드의 디바이스 초기화 과정에서일부분 PIEVECT RAM에 복사가 됩니다. PIEVECT RAM은 RAM의 특정한 한 부분인데, F28xxx 디바이스 기준으로 0x000D00 번지부터 시작해서 256 X 16 블록의 영역에 위치하고 있습니다.

인터럽트 벡터들을 플래시로 링크시키는 몇 가지 방법이 존재하는데, 프로그램이 동작할 때, 인터럽트 벡터들이 PIEVECT RAM에 복사되게 됩니다. 한 가지 접근 방법은 128개의 32-bit 벡터들을 담고 있는 함수 포인터들의 constant C-structure를 생성하는 것입니다. 만약 DSP28xx peripheral structures를 사용한다면, DSP28xxx_PieVect.c 파일에 이미 생성되어 있는 PieVectTableInit를 불러오게 된다. 이 구조는 const type qualifier를 사용하여 선언되기 때문에, 컴파일러에의해 .econst 섹션에 위치하게 됩니다. 런타임 시, 이 구조를 PIEVECT RAM으로 복사하기 위해서 간단한 한가지가 필요합니다. C-compiler runtime support library는 메모리 복사 함수인 memcpy()를 통해 이 과정을 수행할 수 있습니다. 이 함수는 아래와 같습니다.


/********************************************************************
* User's C-source file
********************************************************************/

/********************************************************************
* NOTE: This function assumes use of the DSP28xxx Peripheral Header
* File structures (see References [21-26]).
********************************************************************/


#include <string.h>

void main(void)
{
/*** Initialize the PIE_RAM ***/
    PieCtrlRegs.PIECTRL.bit.ENPIE = 0; // Disable the PIE
    asm(" EALLOW"); // Enable EALLOW protected register access
    memcpy((void *)0x000D00, &PieVectTableInit, 256);
    asm(" EDIS"); // Disable EALLOW protected register access
}


위의 예제 코드는 특별하게 0x000D00 번지에서부터 PIE RAM이 시작할 수 있게 하기 위해서 하드 코딩 되어 있습니다. 만약 이런 방식이 마음에 들지 않는다면, 초기화되지 않은 더미 변수를 생성하기 위한 DATA_SECTION pragma와 이 변수를 PIE RAM에 링크 시키도록 할 수 있습니다. 더미 변수의 이름은 하드 코딩된 주소의 위치를 사용할 수 있습니다. 예를 들면, 어떤 DSP28xxx device peripheral structures를 사용할 때, PieVectTable이라 부르는 초기화되지 않은 구조가 생성되고 PIEVECT RAM에 연결됩니다. 이전 코드는 memcpy() 함수를 이용하여 아래와 같이 대체 시킬 수 있습니다.

    memcpy(&PieVectTable, &PieVectTableInit, 256);

길이가 256이라는 사실을 주의하세요. memcpy 함수는 16-bit words로 복사합니다. (바꿔 말하면, 128개의 32-bit words가 복사된다는 말입니다)
반응형
Comments