본문 바로가기
DSP, MCU/TMS320F2838x (C28x)

TMS320F28388D ] FLASH Build 와 RAM Build 같이 사용하는 .cmd 파일 만들기

by eteo 2022. 12. 1.

DATA SHEET_TMS320F2838X.pdf
8.69MB

 

메모리 맵을 보며 .cmd 파일을 재작성하였다. 

 

 

 

 

지금보니 CLA 또는 DMA Access가 되는 램 블록이 있고 안되는 블록이 있네. 그래서 만약 DMA를 사용한다면 buffer를 GSRAM에 배치한다고 #pragma 를 통해 지시해주어야 한다.

 

// Place buffers in GSRAM
#pragma DATA_SECTION(sData, "ramgs0");
#pragma DATA_SECTION(rData, "ramgs1");

 

 

아무튼.. 램빌드와 플래시빌드 시 실행구문은 #if defined(_FLASH)를 통해 구분해 두었고, 메모리 정의 부분에는 블록/섹터 별로 나누어져 있는게 보기 어지러워서 합쳐서 정의하였다. 

 

물론 메모리 정의 부분에서 이렇게 합치지 않아도, 섹션 배치 부분에서 꺽쇠와 OR 연산자를 통해 여러 블록에 배치하도록 할 수 있다.

 

예를들면,

ex.    .const           : > RAMLS5 | RAMLS6

꺽쇠가 1개인 것은 옆에 있는 블록들 중에서 첫번째 블록부터 해당 블록에 통째로 배치할 수 있는지 확인하고 안되면 그 다음 블록에 통째로 배치하게 된다.

 

ex.    .ebss            : >> RAMLS5 | RAMLS6

꺽쇠가 2개인 것은 첫번째 블록부터 차곡차곡 배치하다가 공간이 부족하면 그 다음 블록에 이어서 배치하게 된다.

 

#if defined(_FLASH)
	#define DATA		RAMLS | RAMD | RAMG1
	#define CODE		FLASH
	#define STACK		RAMM
	#define BEGIN		FLASH_BEGIN
#else
	#define DATA		RAMLS | RAMD | RAMG1
	#define CODE		RAMLS | RAMD | RAMG1
	#define STACK		RAMM
	#define BEGIN		RAM_BEGIN
#endif

MEMORY
{
   /* BEGIN is used for the "boot to SARAM" bootloader mode   */
   RAM_BEGIN        : origin = 0x000000, length = 0x000002		// : 0x0000 0000 ~ 0x0000 0001

   /* Part of M0, BOOT rom will use this for stack */
   BOOT_RSVD        : origin = 0x000002, length = 0x0001AF     	// : 0x0000 0002 ~ 0x0000 01B0

// BLANK   		    : origin = 0x0001B1, length = 0x00000F   	// : 0x0000 01B1 ~ 0x0000 01B9

/* on-chip RAM block part of M0 + whole M1 */
   RAMM             : origin = 0x0001C0, length = 0x000638		// : 0x0000 01C0 ~ 0x0000 07F7, approx. 16bit * 1K

// RAMM1_RSVD       : origin = 0x0007F8, length = 0x000008      /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */// 0x0007F8 ~ 0x0007FF

   RAMLS            : origin = 0x008000, length = 0x004000		// : 0x0000 8000 ~ 0x0000 BFFF, 16bit * 16K

   RAMD             : origin = 0x00C000, length = 0x001000		// : 0x0000 C000 ~ 0x0000 CFFF, 16bit * 4K

   RAMG1            : origin = 0x00D000, length = 0x007000     	// : 0x0000 D000 ~ 0x0001 3FFF, 16bit * 28K

   RAMG2            : origin = 0x014000, length = 0x007000		// : 0x0001 4000 ~ 0x0001 AFFF, 16bit * 28K

   RAMGS            : origin = 0x01B000, length = 0x001FF0   	// : 0x0001 B000 ~ 0x0001 CFEF, approx. 16bit * 8K

// BLANK			: origin = 0x01CFF0, length = 0x000008   	// : 0x0001 CFF0 ~ 0x0001 CFF7
// RAMGS15_RSVD     : origin = 0x01CFF8, length = 0x000008      /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */

   CMTOCPU          : origin = 0x038000, length = 0x000800		// : 0x0003 8000 ~ 0x0003 87FF, 16bit * 2K, CPUx
   CPUTOCM		    : origin = 0x039000, length = 0x000800		// : 0x0003 9000 ~ 0x0003 97FF, 16bit * 2K, CPUx

   CPU1TO2		    : origin = 0x03A000, length = 0x000800		// : 0x0003 A000 ~ 0x0003 A7FF, 16bit * 2K
   CPU2TO1		    : origin = 0x03B000, length = 0x000800		// : 0x0003 B000 ~ 0x0003 B7FF, 16bit * 2K

   CANAMSG  		: origin = 0x049000, length = 0x000800		// : 0x0004 9000 ~ 0x0004 97FF, 16bit * 2K
   CANBMSG		    : origin = 0x04B000, length = 0x000800		// : 0x0004 B000 ~ 0x0004 B7FF, 16bit * 2K

   /* Flash sectors */
   /* BEGIN is used for the "boot to Flash" bootloader mode   */
   FLASH_BEGIN      : origin = 0x080000, length = 0x000002

   /* on-chip Flash */
   FLASH            : origin = 0x080002, length = 0x03FFF0     // : 0x0008 0002 ~ 0x000B FFF1, apporx. 16bit * 256K
// BLANK			: origin = 0x0BFFF2, length = 0x00000E	   // : 0x000B FFF2 ~ 0x000B FFFF

   RESET            : origin = 0x3FFFC0, length = 0x000002

}

SECTIONS
{
   codestart        : > BEGIN, ALIGN(8)

   .reset           : > RESET, TYPE = DSECT /* not used, */

   .cinit           : > CODE, ALIGN(8)
   .const           : >> CODE, ALIGN(8)
   .switch          : >> CODE, ALIGN(8)
   .init_array      : >> CODE, ALIGN(8)
   .text            : >> CODE, ALIGN(8)

   .stack           : > STACK

   .sysmem          : > DATA
   .bss:output      : >> DATA
   .bss             : >> DATA
   .data            : >> DATA
   
   .bss:cio         : > DATA

   MSGRAM_CPU1_TO_CPU2 > CPU1TO2, type=NOINIT
   MSGRAM_CPU2_TO_CPU1 > CPU2TO1, type=NOINIT
   MSGRAM_CPU_TO_CM    > CPUTOCM, type=NOINIT
   MSGRAM_CM_TO_CPU    > CMTOCPU, type=NOINIT

#if defined(_FLASH)
       .TI.ramfunc : {} LOAD = CODE,
                        RUN = DATA,
                        LOAD_START(RamfuncsLoadStart),
                        LOAD_SIZE(RamfuncsLoadSize),
                        LOAD_END(RamfuncsLoadEnd),
                        RUN_START(RamfuncsRunStart),
                        RUN_SIZE(RamfuncsRunSize),
                        RUN_END(RamfuncsRunEnd),
                        ALIGN(4)

#else
    .TI.ramfunc : {} >> DATA
#endif



/*
#if defined(_FLASH)
*/
/*
	.TI.ramfunc : {}
		LOAD = CODE,
		RUN = DATA,
        LOAD_START(RamfuncsLoadStart),
        LOAD_SIZE(RamfuncsLoadSize),
        LOAD_END(RamfuncsLoadEnd),
        RUN_START(RamfuncsRunStart),
        RUN_SIZE(RamfuncsRunSize),
        RUN_END(RamfuncsRunEnd),
        ALIGN(4)
        */
        /*
#else
       .TI.ramfunc : {} >> DATA
#endif
*/

}


/*
//===========================================================================
// End of file.
//===========================================================================
*/

 

 

그리고 까먹지 말아야될 중요한 사항은 cmd 파일에 #if defined() 구문을 썼으면 Predefined Symbols 가 아니라 Linker - Advanced Options - Command File Preprocessing 에 정의해 주어야 제대로 처리가 된다.