DSP

TMS320C6748 을 활용한 DSP _ CCS v9 (LAB0)

알 수 없는 사용자 2019. 9. 11. 16:13
반응형

<이 내용은 강원대학교 전자공학과 실시간 신호처리 과목에서 진행된 내용을 기반으로 작성되었습니다.>

 

 

사용 보드는 TMS320C6748 이다. 해당 보드를 위한 IDECSS v9(Code Composer Studio v9)을 사용하였다.

따라서 CSS v9 설치 시 다음과 같이 체크하여야 한다.

 

이 외에 다른 것은 모두 기본 설정을 따른다.

또한 quickStartOMAPL1x_rCSL-2.0-Setup.exe를 통해 해당 프로그램을 설치하였다.

이때 locationC:\ti 에 설치하였다.

프로그램의 설치가 모두 끝났으면 CCS v9을 실행시킨다. CCS는 기본적으로 이클립스와 유사한 형태를 지니고 있다. 따라서 이클립스를 사용해봤다면 쉽게 사용할 수 있을 것이다.

가장 먼저 프로젝트를 만들어준다. 프로젝트는 Project -> New CCS Project를 클릭하면 된다.

우리는 TMS320C6748을 사용하므로 다음과 같은 세팅값으로 프로젝트를 생성한다.

Hello World 출력문이 들어있는 Basic Examples를 통해 작동 여부를 확인해 보는 것도 좋은 선택이다.

프로젝트를 생성했다면 한가지 사항을 더 진행하여 두자.

 

프로젝트를 우클릭 한 뒤, Propertise -> Build -> C6000 Compiler -> Advanced Options -> Language Options 에 들어가 C DialectC99 mode로 변환시켜놓자.

 

C6748.cmd

앞으로 진행하는 것은 firmware 개발이다. 개발에 사용된 TMS320C6748 보드는 안에 아무것도 들어있지 않기 때문에 일종의 baremetal 개발이라고도 할 수 있다. , 빈 깡통에 개발하는 것이다.

 

그런데 보드를 연결하고 Hello World 예제를 실행시키면 콘솔을 통해 String 값이 출력되는 것을 볼 수 있다. baremetal인데 코드는 어디로 다운된 것일까? 모든 코드는 번지수가 할당이 되어야 한다. 그런데 우리가 쓰는 프로세서에 대한 아무런 정보도 없는데 어떻게 작동하는 것일까?

 

보드에는 128M의 용량이 있다. 하지만 메모리 주소값을 모르기 때문에 임베디드 시스템을 만들 때는 그 정보가 주어져야 한다. 그 파일이 바로 C6748.cmd 이다. 이 파일을 한번 뜯어보도록 하자.

 

해당 파일은 두개의 파트로 나누어져 있다. 하나는 Memory, 다른 하나는 Sections이다.

메모리는 물리적인 메모리에 대한 설명이다.

자세히 보면 같은 메모리의 맵핑이 두 군데로 되어있다. 이유는 DMA를 할 때 위의 주소번지는 읽어오지 못해서 그렇다. SHRAM L3메모리이며 DDR2는 실제로는 128MB가 달려있다. 만약 128MB보다 더 큰 파일 쓰면 링킹에러는 뜨지 않지만 작동을 안 할 수 있다.

, 이 아키텍쳐들의 실제 주소값을 정리해둔 것이다.

 

Sections는 코드의 저장 공간에 대한 커스텀마이징을 할 수 있게 해준다. 원하는 메모리 공간에 원하는 코드를 저장하는 길잡이라고 볼 수 있다. 지금은 모든 코드를 SHRAM(L3메모리)에 저장하였다. L2는 사용하지도 않은 것이다.

메모리의 할당에 따라 속도차이는 50배 이상 차이 날 수 있다. 따라서 자신이 쓰는 코드가 무겁지 않다면 SHRAMDSPL2RAM으로 변경하자. (필자는 변경하였다.)

 

섹션에 대한 소개를 분류별로 짧게 하겠다.

.text : 실행 코드

.stack : 스택 - 스택은 보통 굉장히 자주 사용하는 영역이다. local variance가 쓰이는 곳. 그래서 속도가 빠른 메모리에 넣는 것이 좋다.

.bss, .far : 글로벌 메모리이다. array나 전역변수들. .bss direct 접근 가능. 하지만 32kb까지만 쓸 수 있음. .far은 용량제한 없음.

.bss는 용량 제한이 정확하게 잡혀있기 때문에 cpu단에서 명령어를 줄 때 16bit 명령어로 한번에 어드레스를 줄 수 있다.

.sysmem 힙 메모리 사용할 때 섹션이다. maloc같은 경우. 메모리를 설정할 수 있는 것.

나머지는 생략.

 

.map

firmware 개발 시 중요한 것들 중 하나가 바로 map file이다. 프로그램을 디버깅 하고 나면 Debug 디렉토리 하단에 .map 파일이 생성된 것을 볼 수 있다.

map 파일을 통해 메모리 시작번지와 크기를 볼 수 있다. Hello World 파일은 다 SHRAM에 들어간 것을 볼 수 있다. (만약 위의 .cmd파일을 변경하였다면 변경된 곳으로 들어갔을 것이다.)

메모리와 관련하여 만약 당신이 힙(Heap) 메모리나 스택(Stack) 메모리의 사이즈를 조절하고 싶다면 다음과 같이 들어가 조절 할 수 있다.

필요하다면 말이다.

필자는 위에서 언급하였듯이 .cmd 상의 파일을 DSPL2RAM으로 변경하였다.

변경 한 뒤 map파일을 확인해 보면 다음과 같이 바뀌어 있는 것을 볼 수 있다.

Gel

 

Tools -> GEL files 을 통해 gel파일을 찾을 수 있다.

gel에서는 클럭을 설정하고 ddr설정을 해준다. gel파일은 하드웨어를 초기화 해주는 것을 기술하는 파일이다. 이 파일은 TargetConfiguration 파일에서 gel파일을 찾아가서 OnTargetConnect()를 실행시킨다. 해당 함수와 같은 부분들은 나중에 최종 제품 나갈 때는 초기화 부분이 결국 코드화 되어 들어가야 한다. 그래서 보통 직접 초기화 함수를 만들어서 C로 짠다. 하지만 소프트웨어 엔지니어에게 외주를 맡길 때나 기본적인 세팅용으로 편리하게 자주 쓰인다.

 필자는 따로 제품화 시키는 것이 아니므로 그냥 쓰도록 하겠다.

 

Gel  파일의 모습

 

+ 추가사항

return 0 exit(0)의 차이는??

return 0이랑 거의 같은 역할을 한다. 0을 리턴해주는 것. 0 return은 프로그램의 정상 종료를 의미하고 비정상은 -1을 리턴한다.

그런데 exit은 조금 더 기능이 있다. exit_handler를 만들어 놓고 atexit를 통해 인자를 넘겨주면

exit를 만날 때마다 실행된다는 점이 바로 그것이다.

 

 

quickStartOMAPL1x_rCSL-2.0-Setup.exe
7.77MB
dsplib_c674x_3_4_0_0_Win32.exe
3.83MB

반응형