메모리 맵을 보며 .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 에 정의해 주어야 제대로 처리가 된다.
'임베디드 개발 > TMS320F2838x (C28x)' 카테고리의 다른 글
TMS320F28388D ] 타이머, Timer Interrupt 사용하기 (0) | 2022.12.05 |
---|---|
TMS320F28388D ] Watchdog Timer 사용하기 (1) | 2022.12.03 |
CCS ] 링커 커맨드(.cmd) 파일에 ALIGN(x) directive를 넣는 이유 (0) | 2022.12.01 |
TMS320F28388D ] printf 사용하기 위한 설정 (0) | 2022.11.30 |
CCS, Code Composer Studio ] 재사용 용이한 Portable Project 만들기 (device_support 와 driverlib 모두 사용) (2) | 2022.11.27 |