1. CCS의 실행 및 Workspace 설정
CCSv6를 처음 실행하면 아래와 같이 Workspace 설정이 가능하며 별도의 장소에 설정가능하지만
가능하면 한 장소에서 하는 것이 좋은 것 같다.
CCS에서 처음 Project 시작할 경우 생성이 필요하고 기존의 Project를 가져올 경우 import가 필요하다.
거의 생성해서 가져올 경우는 드물 것이며, import로 기존 Project를 가져와서 이를 호환이 되게 하는 것이 중요할 것이다.
1.1 존재하던 Project 가져오는 방법 (Import)
기존에 작업 중이던 Project or 다른사람이 제공해주는 Proejct를 가져올 경우 아래와 같이 Import를 사용하여 Project를 가져온다.
- CCS Edit 모드 -> Project -> Import CCS Projects
- CCS Edit 모드 -> Project -> Import Legacy CCSv3.3 Projects
File->import -> Code Composer Studio 선택시
- Build Variables
- CCS Projects
- Legacy CCSv3.3 Projects
기본에 사용하던 CCSv5 or CCSv6의 Project를 가져오는 기능이며, 가져오는 도중 문제사항은 많이 발생을 한다
이부분은 우선 차례대로 확인을 해보자.
Import의 option의 기능
- import한 project를 copy 해서 workspace에서 사용하는 기능
- import한 project를 저장되어진 폴더에서 사용지만 관련된 Project를 Import를 자동으로함
2번과 같이
Automatically import referenced projects found in same search-directory
보통 PATH 변수설정이 했지만 적용이 되지 않는 경우 or 변수를 적용을 못할 경우 설정하면 적용되는 경우가 발생 함으로 이부분을 잘 설정하자
- Import Legacy CCSv3.3 Projects
CCSv3.3은 이클립스 기반이 아니기때문에 이 기능을 별도로 제공을하고 있으며, 가장 중요한 것이 이것도 호환성일 것이다.
아래 옵션은 위치가 변경이 되므로 조심하자
Copy project into workspace
Project를 Workspace로 가져온다.
1.2 기존 Project 가져오는 도중 문제사항들
상위와 같이 TI에서 제공해주는 CCS Project를 Import해서 제대로 동작이 되면 다행이겠지만,
제대로 동작이 되지 않는 경우도 발생하며, 호환성 문제뿐만 아니라 다른이유에서도 문제가 발생할 것이다
CCS의 기능은 점점 확장이 되고 버전은 변경이 될것이며, 이부분은 해결방법을 좀 정리하여 보자.
만약 실패한다면 1.3의 Empty Project를 생성하여 만든 것을 최종적으로 고려해봐야한다.
1.3 Empty Project 생성 (Import 문제 발생할 경우)
Import를 했음에도 불구하고 제대로 동작이 되지 않는다면 다음과 같이 Project를 새로생성하여 소스를 추가하는 방식으로 구성하여 만들수도 있다.
이 방법을 이용할 경우, Project를 새로생성을 하되 Empty Projects->Empty Project로 생성을 하자.
그러면, Target MPU와 동일한 구성을 가진 기본 Project는 가졌지만, Source는 가지고 있지 않다.
이제 Source를 하나씩 가져오면서 Porting을 해보자
- 1.4의 Project 새로생성 내용처럼 프로젝트를 생성후 기본 환경설정을 갖추자.
- 에러가 발생한다면, INCLUDE PATH 문제 or DEFINE 문제 , LINK 문제 다양하다.
- 상위 문제들을 천천히 해결해 나가자.
- Compiler에 따라 Linkscript와 연결되는 Macro가 다르므로 이부분도 확인해야한다.
1.4 Project 새로 생성
아래와 같이 동일한 방법으로 생성이 가능하다.
- File->New->CCS Project
- File->New->Project->Code Composer Studio
- Target에서 본인의 MPU를 선택하자.
- Connection에서 본인의 JTAG을 선택하자.
- 본인의 내부 MPU를 선택 하고 Project 명 기입하자
- Workspace 의 저장공간의 확인하자
- Compiler는 다양하게 제공하므로 GCC도 가능 , 본인의 개발환경에 따라 선택
- Project의 기본 Format의 설정 Empty Projects or Basic Example
- 상위 부분은 우측에 자세한 설명이 나온다.
- 아래는 Complier가 TI Compiler로 설정
상위부분은 Target MPU에 따라 많이 달라지만, 기본 설정은 동일하다.
그부분만 이해를 하면되겠다.
Target이 지원 되지 않는다면,
View-> CCS App Center에서 찾아보고 설치해보자.
2. Project 의 환경설정
CCS Project를 Import를 하거나, 생성하여 진행하다보면 에러가 발생하고 문제가 발생한다.
이부분은 Eclipse에도 별반 차이가 없기때문에 봐야할 부분들이다.
대부분의 문제들은 간단히 정리해보자면 아래와 같다.
- Compiler의 호환성 문제 ( Compiler Version 변경 및 외부 Compiler 별도지정 )
- Include PATH 문제 (Compiler의 옵션에서 환경변수 설정이 적용되지 않을 경우)
- DEFINE 문제 ( Compiler의 옵션에서 define 이 없을 경우)
- Link 에러문제 ( Compiler Library 문제 및 Library 순서 문제 or 외부 Library)
기존 Project를 가져오거나 or 본인이 새로 Project를 생성을 하면 아래와 같이
Project->Property를 이용하여 Compiler 관련 설정을 해줘야 한다.
자동으로 Makefile을 생성하여 관리가 되기 때문에 편하지만, 아래 설정을 정확히 이해하고, 사용해야 본인의 Project을 관리가 가능하다.
특히 상위 에러문제에 있어서 아래 방법들을 이용하여 점검을 해보자.
개발을 해보신분이라면, Compiler의 설정 및 PATH 설정관련에 대해 잘 이해하리라고 본다.
일단 빌드에 문제가 발생을 하면, 아래 View를 이용하여 Project의 문제를 정확히 파악하고
아래에서 빌드의 문제 및 관련 PATH 등을 천천히 해결해 나가자.
- View->Console : 전제 빌드 과정을 보고, 문제사항을 정확히 보자.
- View->Problem : 문제사항을 알려준다.
- View->Advice : 현재사항에 대해서 조언을 해준다.
물론 해결해 나가다 보면, Compiler의 호환성 문제 or Source 호환성 문제도 발생하지만,
이부분은 관련 Project의 정확한 개발환경을 참고하자.
아래와 같이 Project의 Property는 빌드환경의 다양한 설정을 제공을 해주기 때문에
반드시 각각의 기능의 쓰임새를 어느정도 파악을 하고 있어야 한다.
2.1 Project의 Property->Resource
프로젝트를 진행을 하면 관련 환경을 설정을 하는데 아래와 같이 살펴볼수 있다.
그리고, Text File encoding 에서 변경이 가능하며, 하지만 이 설정은 이 Project에만 한정된다.
- UTF-8 (Linux에서도 소스를 볼일이 있다면 이 인코딩으로 변경)
- MS949 (Window에서만 사용한다면 이것을 사용)
- Window->Preferences에 가서 Workspace
만약 전체 변경하고자 하면, Window->Preferences에 가서 Workspace에서 변경을 하면
Workspace에 있는 것이 다 변경이 되므로 다 적용이 된다.
- Resource->Linked Resource
Must specify a URI scheme: xxxx 에러가 발생 ( PATH 설정 문제)
보통상위의 문제가 발생할 경우, PATH를 추가하여 이 문제를 해결한다.
Link PATH를 수정 및 추가하자
만약 동적 Library를 사용한다면, 관련 PATH역시 한번 점검해봐야 한다.
- Path Variables: Linux의 PATH 변수라고 생각하면 되겠다.
- Linked Resources: 현재 Build할 File들
변수 생성은 ${VAR} 생성 가능하며 적용이 가능하며, 아래와 같이 적용이 된다.
아래는 상위 DM368의 UBL IPNC 설정 소스이며, 관련부분을 참조 확인하자
- Name : 새로추가할 Variable Name ( 변수이름)
- Location: PATH 위치
- 우측옵션
- File 구조 ( File 직접 선택)
- Folder 구조 ( 변수를 이용하면 참조가 가능)
- Variable ( 상위에서 사용되어지는 변수사용)
Linked Resources : 확인용 보고 구조는 다음과 같다.
*.cmd : TI의 Link Script이며 이부분은 본인의 설정에 맞게 잘 파악해야한다.
*.c : 본인의 Compile되고 Link되는 상황을 잘 알수 있다.
- Resource->Resource Filters
추후 Project에서 New로 추가 할 경우 이 부분이 이용가능
2.2 Project의 Property->General
General에서는 Compiler 및 빌드환경 및 Linkscript 인 cmd 파일 설정 및 기타 설정이 가능하다.
이부분을 Configruration의 설정을 이용하여 별도로 설정이 가능하며 세부저장도 가능하기에 이부분은 가장 중요하다고 말하겠다.
외부 Project를 가져왔을 경우 , 대부분 Compiler Version 문제이며, Compiler에는 include와 library를 가지고 있기 때문에 이와 관련된 에러가 발생된다.
TI에서는 TI Compiler와 GCC를 제공하고 있지만, 별도의 cygwin를 제공하지는 않는다.
아직 cygwin TEST를 해보지 않았으며, 추후 시간이 있을 경우에 이를 해보자.
(이미 cygwin64를 설치 했음)
2.2.1 Compiler 설치 및 기타 Package 설치
Complier의 Version 너무 높아 맞지 않다면 , 아래와 같이 선택하여 낮은 버전을 설치하자
- Help->Install New Software
- Work with에서 Code Generation Tools Updates 선택
- TI Compiler Updates 설정
다양한 TI Compiler Version의 설치하자
Compiler 설치방법
http://processors.wiki.ti.com/index.php/Compiler_Releases
XDAIS Package 설치 (외부 Package)
http://software-dl.ti.com/dsps/dsps_public_sw/sdo_sb/targetcontent/xdais/index.html
2.2.2 General 관련 설정
아래의 설정을 보면 분리를 해서 보면 아래와 같다.
- Configuration : Build 를 세부적으로 설정할 때 사용하며 추후 자세히 설명하겠다.
- Main Device : Device 와 JTAG 및 관련 설정
- Main Advanced setting : Compiler 설정 및 기존옵션 설정
우선 아래와 같이 Manage Configurations에 들어가서 본인이 원하는 Make의 Target 만들고 각 설정을 변경한다.
이 부분은 다음 챕터에서 Build Configuration 과 같이 자세히 사용법을 알아보자.
이제 Main의 설정을 변경을 각각 변경을 해보자
사용하게될 Target Device에 대한 설정으로 관련부분을 잘 보도록하자
이 부분은 TI의 Device 설정과 JTAG을 설정하는 곳으로 아래 PATH와 관련있으므로 잘 봐야 한다.
만약 지원이되지 않는다면,
Help->check for update
C:\ti\ccsv6\ccs_base\common\targetdb\connections
C:\ti\ccsv6\ccs_base\common\targetdb\devices
Compiler version
Compiler를 변경 및 외부 Compiler 사용방법으로
우측의 more를 클릭
현재 TI에서는 아래의 주소에 Compiler를 제공하고 있으며 기본 library와 include를 확인가능하다
C:\ti\ccsv6\tools\compiler // CCSv5 or CCSv6
C:\CCStudio_v3.3\tms470 // CCSv3.3
Output type:
Output format:
GCC를 설치해보고, 사용해 본사람이라면 a.out과 elf format의 차이를 잘알것이라고 생각한다.
두 File Format은 실행 Format 종류이며, 큰 차이는 loader에서 동적 library 지원이 되는지
안되는지 가 큰 차이점이라고 볼수 있다.
ELF Format이 많은 기능을 가지고 있어, Linux와 같이 연동하여 사용한다면 이것을 사용하겠지만,
이전 CCS에서도 마찬가지로 COFF기반의 a.out format만 지원했기때문에 가능하면 COFF로 사용해야 하는 것이 맞을 것 같다.
TI의 CCS에서는 Legacy COFF (a.out) , ELF 두개의 설정이 가능하며 TI 전용 ABI(Application Binary Interface) 별도로 사용하고 있다.
ABI는 상위 Format과 별도의 기능이며, ABI에 대해 좀 더 알고 싶다면 각 MPU의 ABI Spec보면될 것이다.
간단히 설명하자면, C와 어셈블리어간의 통신 방법 및 Compiler를 만들 경우 꼭 봐야할 것이 ABI이다.
Device endianness:
일반적으로 Power PC의 경우는 Big Endian을 사용했지만, TI는 ARM기반으로 little사용하자.
Linker Command file :
GCC로 하면 Linkscript와 동일하며아래 PATH에가면 기본 실행이 될 수 있도록 되어있으나, UBL과 같이 어셈블러와 C 및 ABI가 필요하다면 본인이 직접 CMD파일을 작성해야한다.
이부분과 같이 봐야 할 곳이 Linker의 File Search Path 부분이다.
C:\ti\ccsv6\tools\compiler\ti-cgt-arm_5.2.2\lib
2.3 Project의 Property->General 확장사용
상위에서 설명한 Configuration의 세부 사용방법에 대해 자세히 기술을 하며 한 Project에서 다양한 Build 방식을 원할 경우 아래와 같이 설정한다.
CCS or Eclipse의 Configurations은 말그대로 Build에 관련된 모든 정보들을 별도로 저장이 가능하도록 하는 것이다.
- Compiler 종류 및 Version 설정
- Compiler 와 Link 에 관련된 모든 옵션설정
- 빌드파일 및 폴더 설정
상위 정보와 Build 될 File 정보 들을 각각의 Configuration 마다 별도로 분리하여 저장가능하다.
이를 이용하여 같은 Project 내에서 다양한 Configuration을 통해 다양한 App을 만들어 낼수 있으며, Compiler를 설정 및 PATH 설정 역시 개별설정이 가능하다.
좀더 자세히 설명하면 Configuration 통해 Project에 관련된 설정을 세부별로 설정이 가능하고 이는 1개의 Project에서 다양한 기능수행이 가능해진다
.
- Build Configuration의 사용방법
- Property->General->Configuration 에서 Manage Configuration
- View->Project 창에서 마우스 우측 버튼을 Build Configuration에서 선택가능.
용어가 Manage Configuration or Build Configuration으로 사용이 되며, 이 부분 빌드환경을 저장하는 것이다.
- Build Configuration 사용의 예
Project를 생성하거나 기존에 존재하는 Project를 수정할 경우 다음과 같은 상황들이 흔히 발생한다.
- Project는 많은부분은 공유하고 상층부분 서로다르게 2 or 3개 이상로 분리하고 싶을 경우
- Project는 동일하지만, #define 을 서로 다르게 적용하고 싶을경우 (--cmd-file or --define 이용 )
- 서로다른 Compiler 환경을 구축하고 싶을 경우
https://www.youtube.com/watch?v=YIAHYbRDrLw
Property->General에서 Configuration 이 존재하며, Manage Configuration을 설정하면
아래와 같이 Configuration을 설정이 가능하다.
이는 Project를 가르키고 우측마우스의 Build Configuration->Manage와 동일하다.
New를 이용하여 아래와 같이 새로추가해보자
빌드를 할 경우 두 가지 모드 or 그 이상으로 각각의 Configuration으로 빌드가 가능하다.
아래와 같이 Build Configurations->Set Active 설정한 다음 Build Project를 진행을 하면된다.
- 각 개별 Build Configuration File 과 Folder 관리방법
각각의 Build Configuration 별로 다르게 특정파일 및 폴더를 제외하고 추가하고자 하고
각각의 Build Configuration 별로 각각에 Build 에 관련된 옵션을 다르게 저장이 가능하다.
- 제외시키는 방법 : Exclude From Build 사용하여 특정 File을 Build에서 제외
- 추가하는 방법 : New->File or Folder
파일을 제외시키는 방법
Project 창에서 아래와 같이 마우스 우측 버튼에서 간단히 선택가능 (Exclude from Build)
추가하는 방법
동일하게 Project창에서 우측마우스로 New-> File or Folder 선택
아래와 같이
Advanced를 선택한 후
Linked Folder 및
Linked File 생성이 가능한다.
이때 아래의 우측
Variables을 이용하면 상위 설명했던 PATH에 정의된
Variables을 이용하여 찾게 만들수 있어 편리하다.
Linux로 생각하면 Makefile에 PATH를 정의하여 만들어 두고, 이를 이 변수를 이용하여 추가
한다고 생각하면 되겠다.
- Browser : 직접 탐색기에서 찾아 등록 (절대PATH 이기에 추천을 안함)
- Variables : Property->Resource->Linked Resources
- Resource Filter : Property->Resource->Resource Filters
- 각 개별 Build Configuration 관련설정 방법
기존프로젝트의 각 환경설정을
별도의 설정이 가능하여 큰 장점이 있다.
아래 부분은 상위 부분을 보면 쉽게 이해가 간다.
- Exclude From Build로 현재 Project에서 File을 제외
- (--include_path,-I) 변경 (아래 참조)
- (--define,-D) 변경 (아래 참조)
- (--cmd_file,-@) (아래 참조)
--cmd_file 은 Compiler에게 옵션을 직접준다는 의미 이기때문에, 다양하게 본인이 직접 줄수 있을 것이다. (TI Compiler Manual 참조)
하지만 거의 --define xxxxx 1 으로 만 사용하는 것 같다.
3. Project의 Property->Build
Build의 구성은 상위 Property->General에서 설정에 따라 변경이 되기때문에 주요 설명을 간단히 하고 넘어가겠다.
주로 ARM 계열 Compiler 일 것이지만, DSP or MSP430를 사용한다면 각각에 맞는 Compiler로 변경
- MPU Compiler
- MPU Linker
- MPU Hex Utility
상위에서 설명한 Build Configuration에 맞게 세부 설정이 가능하다 아래에 보면 make 및 Build Location 도 각각의 Target에 맞게 설정이 가능하다.
Makefile의 실제 target 세부설정도 가능
- Build 하기전에 실행해야 할 것
- Build 후 실행해야 할 것
상위 것들을 설정이 가능하다 (일반적으로 batch file을 별도로 생성해서 위에 추가해서 넣는다.)
현재 나의 경우는 UBL을 ELF로 한 다음 아래 옵션을 별도로 추가하여 UBL의 bin 파일 생성했다.
"${PROJECT_ROOT}/postBuildStep_BOOT_NAND.bat" PROJECT_ROOT ${PROJECT_ROOT}\.. !
- postBuildStep_BOOT_NAND.bat 분석
상위 batch file을 분석을 해보면 argument로 PROJECT 변수와 변수 값을 받아 설정한다.
이 부분은 :process_arg를 보면 argument는 두개가 필요하며, 이는 %PROJECT_ROOT%에 필요한 설정이다.
hex470.exe를 이용하여 ubl2bin.cmd linkscript를 이용하여 a.out file에서 binary로 생성하는 것이다.
Linux에서 사용했던 uboot bin file 만드는 것과 동일하다.
@echo off
pushd ..\..\
setlocal
:process_arg
if "%1"=="" goto end_process_arg
set name=%1
set value=
:process_arg_value
if NOT "%value%"=="" set value=%value% %2
if "%value%"=="" set value=%2
shift
if "%2"=="!" goto set_arg
if "%2"=="" goto set_arg
goto process_arg_value
:set_arg
set %name%=%value%
shift
shift
goto process_arg
:end_process_arg
echo. > temp_postBuildStep_BOOT_NAND.bat
echo hex470.exe %PROJECT_ROOT%\UBL2BIN.cmd -o=%PROJECT_ROOT%\ubl_486arm_360ddr_ipnc_dm368.bin %PROJECT_ROOT%\NAND\UBL_DM36x_NAND_IPNC.out >> temp_postBuildStep_BOOT_NAND.bat
call temp_postBuildStep_BOOT_NAND.bat
del temp_postBuildStep_BOOT_NAND.bat
endlocal
popd
나의 경우도 상위 설정도 되어있지 않았으며, 본인이 직접 전체구조를 이해해서 수정하면서 실행하면 될 것 같다.
hex470.exe는 compiler 안에 있으며 이를 PROJECT_ROOT에 넣고 이를 해결하자
가능하다면 모든것을 PROJECT_ROOT PATH 기반에서 다 맞춰서 실행하도록 하자.
상위 Resource->Linked Resource->Path Variables 와 동일하게 설정 가능하며, 이 변수는 String ,Directory , PATH 설정이 가능하다
Build 시 사용되는 환경변수라고 생각하면 될 것이며, 주로 PATH를 설정한다고 보면된다.
아래와 같이 Library Link 순서도 편집이 가능하다
https://www.youtube.com/watch?v=mN6SCwyxwbU&feature=em-subs_digest
아래와 같이 다른 Project를 연결하여 동작이 가능하다
3.1 Build->MPU Compiler
Build 내부에서는 ARM Compiler or MSP430 Compiler의 옵션을 맘대로 설정 가능하다
본인의 경우는 ARM을 이용하기 때문에 ARM이지만, MPU가 달라지면 이부분 역시 달라질 것이며,Compiler에 따라 설정도 변경이 될 것이다.
하지만 근본적으로 문제를 해결하는 방법들은 동일하니 크게 문제될 것이 없다.MPU에 따라 동일한 옵션들은 거의 유사할 것이다.
예를들자면 아래와 같다.
- header 찾는 주소
- define 하는 옵션
- Linker option
아래는 ARM Comiler의 예제이며 아래와 같이 전체 옵션을 반드시 확인하자
- ARM Compiler->Processor Options
아래에서 abi 관련 설정 및 floating point 관련 설정 부분을 확인 가능하다
이 부분은 ARM에 관련 설정이니 반드시 확인하고 넘어가야한다.
- *.h 못찾는 에러문제해결 (--include_path,-I)
Make 내부안을 수정하여 원하는대로 수정하면 좋겠지만, 그렇게 고치기에는힘들경우,
아래와 같이 GCC or TI Compiler의 옵션인 -I 부분을 찾아 관련부분 PATH들을 연결시켜주자.
- define 선언문제 (--define,-D)
GCC or TI Compiler의 옵션이용하여 직접 #define 을 전체 적용을 해보자.
이 방법은 가능하면 간단한 것만 사용하자.
선언할 것이 많이 있다면, 다음 command 로 사용하자
- Command File (--cmd_file,-@) ( Compiler Option)
추가된 File을 읽어 Compiler에게 File 안에 적용된 Option을 주는 기능이다.
이 기능을 사용하려면 Compiler의 Manual을 제대로 숙지해야겠지만,
간단하게 사용하는 법으로는 상위 #define도 정의하고 File로 구성한 다음 추가하여 적용이 가능하다.
만약 #define 할 것이 많다고 한다면, 상위 방법보다 이 방법이 더 편할 것이며, Configuration과 같이 저장이 되어서 편할 것이다.
ARM Compiler 내부에는 다양한 기능을 제공해서 일단 기본 옵션만 알아두지만,
아래의 기능들은 본인도 좀더 공부를 해봐야 알겠으며, 일단 관련링크만 연결해둔다.
- ULP Advisor
- MISRA-C:2004
ULP Advisor
http://processors.wiki.ti.com/index.php/ULP_Advisor
MISRA_C
https://en.wikipedia.org/wiki/MISRA_C
http://www.trace32.com/wiki/index.php/MISRA-C%EB%A5%BC_%EC%9D%B4%EC%9A%A9%ED%95%9C_%EC%95%88%EC%A0%84%ED%95%9C_%EC%BD%94%EB%93%9C_%EC%9E%91%EC%84%B1
3.2 Project의 Property->Build->MPU Linker
ARM Linker의 File Search Path에 -l 옵션을 보자 ( static library )
아래는 library를 찾는 option이다.