본문 바로가기
개발/TI_TMS320

TI: FLASH 에서 실행, DELAY_US 문제

by 즐기며 2025. 10. 21.

TI TMS320 입문 연재 입니다.

 

>.  CCS, C2000Ware, sprc191 (sprc097) 설치, compile

>.  XDS100, XDS200 로 CCS Debug 하기    

>.  FLASH 에서 실행, DELAY_US 문제                       == 본글

>.  UniFlash 로 (CCS 없이) FW Download 하기(Driver 설치)  

>.  C2Prog 로 (CCS 없이) FW Download 하기 

>.  C2000Ware Sample code 를 다른곳으로 가져 가기  

>.  CCS v20 Project 만들기  

>.  CCS,  다른 ( 옛날 ) Compiler (CGT) 버전 설치  

>.  TMS320 F28069 CCS SCI(UART) source  

>.  TMS320 F28069 CCS PWM source     

>.  TMS320 F28069 CCS ADC source   


>>. 
 TMS320 error: program will not fit into available memory  

>>.  Code Composer Studio(CCS) 빌드과정, CMD 파일     

==========================================

 ( 최초 만들기: 251021 ,   마지막 바꾸기 : 251021 )

본글 목차  

 

1. FLASH 에서 실행 하게 설정

2. 실행

3. DELAY_US 문제

==========================================

 

 

1. FLASH 에서 실행 하게 설정

FW 가 RAM에서 실행 될지 FLASH 에서 실행 될지는 ~\common\cmd\~.cmd 파일에 정의 되어 있읍니다.

여기서는 TT TMS320F28069 를 쓰므로,  

> RAM 에서 실행 할때는 28069_RAM_lnk.cmd 를 사용 하였는데

> FLASH 에서 실행 할때는 28069_RAM_lnk.cmd 를 빼고(excluded), F28069.cmd 을 포함 시킵니다.

 

 

2. 실행

> Project  > Build Projects 하면 빌드가 되고

 

> Run > Debug Projects 하면 실행 되고, 

 

> Run > Flash Project 하면  보드에 다운로드 됩니다.  이후 Reset(껏다 켬) 을 하면 다운로드 된것이 돌아 갑니다. 

 

 

3. DELAY_US 문제

1) 근데, 막상 실행을 시켰는데, 먹통이 될 때가 있읍니다.  

바보가 되는 이유는 여러가지가 있겠지만, 여기서는 그중 1가지를 다룹니다. 

디버그를 따라 가다 보면, DELAY_US() 에서

C28xx: Breakpoint Manager: Error enabling this function: This task cannot be accomplished with the existing AET resources.

와 같은 에러가 나는 경우 입니다.

 

2) DELAY_US 는 디파인으로,  DSP28x_usDelay() 로 되어 있고,

#define DELAY_US(A)  DSP28x_usDelay(((((long double) A * 1000.0L) / (long double)CPU_RATE) - 9.0L) / 5.0L)

 

3) DSP28x_usDelay 를 찾어 보면,  F2806x_usDelay.asm 에 아래와 같은 코드 가 있읍니다.

;//  *IMPORTANT*
;//  IF RUNNING FROM FLASH, PLEASE COPY OVER THE SECTION "ramfuncs"  FROM FLASH
;//  TO RAM PRIOR TO CALLING InitSysCtrl(). THIS PREVENTS THE MCU FROM THROWING 
;//  AN EXCEPTION WHEN A CALL TO DELAY_US() IS MADE. 
;//
       .def _DSP28x_usDelay
       .sect "ramfuncs"

        .global  __DSP28x_usDelay
_DSP28x_usDelay:
        SUB    ACC,#1
        BF     _DSP28x_usDelay,GEQ    ;; Loop if ACC >= 0
        LRETR

 

4) 이 코드를 보면

;//  IF RUNNING FROM FLASH, PLEASE COPY OVER THE SECTION "ramfuncs"  FROM FLASH
;//  TO RAM PRIOR TO CALLING InitSysCtrl(). THIS PREVENTS THE MCU FROM THROWING 
;//  AN EXCEPTION WHEN A CALL TO DELAY_US() IS MADE. 

라고, 즉 Flash 에서 실행 할때는 InitSysCtrl() 부르기 전에 ramfuncs 을 복사 하라는 말 입니다.

 

 

 

5) ramfuncs 을 복사

ramfuncs 을 복사 하는 아래 코드

	// Initialize Internal FLASH Memory Control Registers 
	memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (Uint32)&RamfuncsLoadSize);
	InitFlash();

를  InitSysCtrl(); 앞에 넣으면 됩니다.

 

근데 , 꼭 그 앞이 아니고,   InitPieCtrl(); 다음에 넣어도. 돌아 가네요

int main(void)
{
    unsigned int n=0,n2=0;

    InitSysCtrl();
 
    EALLOW; // 보호된 레지스터 접근 허용
    Gpio_set();
    EDIS;    // This is needed to disable write to EALLOW protected registers

    DINT;
    InitPieCtrl();
 
    // Initialize Internal FLASH Memory Control Registers
    memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (Uint32)&RamfuncsLoadSize);
    InitFlash();
 
    // Disable CPU interrupts and clear all CPU interrupt flags
    IER = 0x0000;
    IFR = 0x0000;

 

> 참고로 memcpy 를 쓰기 위해서는 

#include <string.h>             // for memcpy

 

가 있어야 합니다.

 

6) ramfunc 으로 설정

> 빌드 뒤  ~.map 파일을 보면

ramfuncs   0    003e8000    00000004     RUN ADDR = 00008000
                  003e8000    00000004     F2806x_usDelay.obj (ramfuncs)

와 같이 ramfunc 설정은 잘 되어 있읍니다.

즉 F2806x_usDelay 은 추가 설정이 필요 하지 않읍니다.

 

하지만, 혹시 다른 함수가 RAM 에서 돌아 야 할 경우는 아래와 같이 설정 하시면 됩니다.

#pragma CODE_SECTION(sciaRxFifoIsr, "ramfuncs");

 

 

이 코드는 sciaRxFifoIsr 을 RAM 에서 실행 하라는 뜻 입니다.

 

 

===========================

다음 글은

  UniFlash 로 (CCS 없이) FW Download 하기(Driver 설치)     

입니다.

 

============================

수고 하셨읍니다.

도움이 되셨으면, 댓글 부탁합니다. 댓글 하나에 힘이 됩니다.

고맙읍니다.