태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

지난 편에 이어서 오늘은 TI TMS320F28x C 언어로 개발을 위해 제공하는 프로그램(~.c, ~.h) 구조를 이해할 있도록  간단한 C 프로그램의 구조에서 시작하여 함수와 헤더, 정의와 선언, 함수가 다른 시트에 있을  호출방법에 대해서 알아 보겠습니다. 또한 테크닉이 더해진 헤더파일의 구조를 소개함으로 향후 프로그램 관리에 도움이 있도록 하였습니다.

 

C언어로 표현된 간단한 알고리즘

필자가 생각하기에는 프로그램만 간단하다면 하나의 시트에 알고리즘을 모두 작성하 것이 가장 속도도 빠르고 좋은 구조라고 생각합니다. 그러나 알고리즘이 조금만 복잡해지거나, 일부 알고리즘이 반복되면 코드의 길이가 길어져서 여간 코드를 이해하기 어려운 것이 아닙니다. 또한 만큼 관리도 어렵게 됩니다.

 

 

C 언어의 얼굴! 함수 도입

함수를 도입하여 알고리즘 부분을 캡슐화하였습니다. 그리고 메인함수에서 알고리즘 함수를 호출하여 수행하였습니다. 주의할 것은 C언어에서는 함수를 호출하기 전에 정의또는 선언이 필요하다는 것을 알고 계시죠? 만일 함수를 메인함수 아래에서 정의하면 메인함수 위에 함수를 선언하고 사용하여야 하겠습니다.( int func(void); ) 하지만 표준이 그렇다는 것이고 컴파일러 제조사에 따라서 함수가 정의만 되면 이것을 생략할 수 있는 컴파일러도 있습니다. TI 사의 컴파일러도 그런 유연한 부류인 것 같습니다.

 

함수의 분리

함수를 도입하였더니 메인 함수가 너무 길어 졌습니다. 그래서 함수를 메인함수와 다른 시트로 분리하였습니다. 그런데  분리하면서 메인 시트쪽에 선언이라고 해서 붙는 코드들이 있습니다. 그것은 나름의 이유가 있는데 예를 들어 "extern int func(void);"은 해당 함수가 다른 시트에 있고 실행파일을 만드는 링크과정에서 제공할테니 메인시트를 컴파일할 때 에러를 내지 말아라 라고 컴파일러에게 알려 주는 것이라 해석할 수 있습니다. 만일 개발자가 컴파일러에게 이렇게 약속하고 프로젝트에 func3.c를 포함시키지 않으면 약속을 어긴것이 되고 링커에서 에러가 발생합니다. 한가지 알아 두어야 할 내용은 동일한 이름의 전역 함수나 변수의 정의는 한번 밖에 할 수 없습니다. 그러나 이것은 여러 시트에서 불러 사용될 수 있으니 선언은 여러군데에 있을 수 있겠습니다.

 

함수의 친구-헤더의 탄생

메인함수 시트도 그렇고 함수 시트도 그렇고 머리부분(서두)이 지저분해 보입니다. 또한 정의나 선언이 서두에 더 추가되면 그 복잡도는 더해 지겠지요. 그래서 헤더라는 이름을 붙여서 시트를 분리하여 프로젝트에서 관리하게 되었는데, 이 구조가 가장 일반적인 C 언어 프로그램의 구조입니다.

 

개발자의 실수 방지 

프로그램이 크다보면 헤더(~.h)도 많고 소스(~.c)도 많아 집니다.  개발을 하다 보면 여러군데서 헤더를 포함하여 중복 정의가 되었다고 에러가 발생하는데 여간 골치아픈 것이 아닙니다. 물론 이런 경우는 프로그램의 구조가 썩 좋다고 할 수 없겠지요.  마이컴계의 선배님들은 이런 개발자 실수를 방지하도록 헤더의 구조를 만들어 놓았습니다. C언어에서 제공하는 지시자(Directive)를 이용하여 그 내용이 코드상에 두번 이상 포함되지 않도록 하였습니다. 예를들어 아래 "#ifndef DSP2833x_FUNC5_H  ~  #endif"는 컴파일러에게 컴파일 하기전에  만일 DSP2833x_FUNC5_H가 정의되어 있지 않으면 #endif 까지의 내용을 포함하고 그렇지 않으면 포함하지 말고 컴파일하라고 알려 주는 것입니다. "#define DSP2833x_FUNC5_H"는 뭘까요? 이것은 다음번에 같은 내용이 포함되지 않도록 DSP2833x_FUNC5_H를 정의해 버리는 것입니다. 주의할 것은  지시자는 같은 시트에서만 효력을 가집니다.

 

한 걸음 더 나아가서

지금까지의 내용을 이해하셨다면 TI에서 제공하는 C 소스와 H 헤더 파일들의 구조에 대해서 분석(?)하실 수 있는 기본 툴은 가지신 것입니다.  물론 시간을 투자해서 공부를 하셔야 합니다. 그럼 전설적인(?) 선배님들이 프로젝트를 관리하기 위해서 사용한 헤더 파일구조에 대해서 살펴 보겠습니다. 아래에서 헤더를 보면 extern 이라는 것이 붙어 있는 것 이외에는 메인헤더의 내용이나 함수 헤더의 내용이 비슷합니다.  아시겠지만 내용을 살펴보면, 같은 시트내에 정의가 있는 함수를 사용하려면 extern이 없이 선언하고 다른 시트에 정의되어 있는 함수를 사용하려면 extern을 붙여서 선언하는 것입니다. 변수도 마찬가지구요. 유의할 것은 변수는 정의와 선언이 함께 이루어진 것이라 볼 수 있겠습니다.

 아래는 대 선배님들이 만들어 놓은 헤더를 사용한 방법입니다. 함수의 정의가 필요한 시트에서는 "#define DSP2833x_FUNC6_H"를 선두에 세우고 헤더를 포함하고, 함수를 사용하고자 선언이 필요 할 때는 그냥 헤더를 포함하여 함수를 사용하는 것입니다. 참 간단하지요.

 

자, 그러면 헤더의 구조는 어떨까요? 두개의 헤더 파일을 하나의 헤더 파일로 통합하고 사용방법도 간단히 하였습니다.  내용은 헤더의 구조를 잘 분석 해 보세요. ^^;

 

그런데 필자가 살펴 본 바로는 TI의 C컴파일러는 그 문법이 엄격하지 않아 함수가 정의만 되어 있으면 선언 없이도 사용가능하였습니다. 그렇지만 알고리즘을 표준에 따라 전개하면 동일 알고리즘을 다른 마이컴에서 구현할 때 에러 없이 깔끔히 쉽게 완성할 수 있겠습니다.

지금까지 TI TMS320F28x C언어 구조에 대해서 살펴 보았습니다

 

[광 고]

싱크웍스는 TI, TMS320F28x를 시작하시는 데 도움이 되는 체계적인 교육프로그램을 준비하고 있습니다.

펌웨어 설계 강좌(3일, 72만원)-부가세별도

강의 내용

· TMS320F28x 개요 및 개발환경 이해

· CPU 구조

· 링크

· MMR과 칩 초기화

· 리셋 및 부트

· 인터럽트

· 프로젝트 이해와 작성법

· 플래시 부트 및 플래시메모리에서 속도 최적화

시스템 설계 강좌(3일, 72만원)-부가세별도

강의 내용

· ePWM/eCAP/eQEP

. ADC

· DMA

· 통신 (SPI/I2C/SCI/CAN)

. H/W 설계

. FlASH API

모터제어 강좌(1일, 24만원)-부가세별도

강의 내용

.TMS320F28X 소개

.TMS320F28X의 모터제어용 주변회로

.BLDCM 제어기법과 TI 모터컨트롤 라이브러리

.PMSM 벡터제어 전략과 기타 제어 기법들

Posted by yeunhun

댓글을 달아 주세요

티스토리 툴바