공부하는 내용
rts 라이브러리가 가지는 의미, 역할
Start!
프로젝트에 우클릭 메뉴로 들어가는 Properties의 General에서 제일 하단의 Run Time Suppor Library를 선택할 수 있다.
DSP281x_CodeStartBranch.asm 에 의해 호출되는 이 라이브러리는 Library가 의미하는바와 같이 '공통적으로 쓰일 수 있는 함수를 모아 놓은 파일'일 것이다. 그리고 rts는 Runtime, 실행시를 의미한다.
우리가 개발할 때, C코드로 작성하는데 이것이 아무런 준비도 없이 실행될까? 포인터 등 각종 기법을 사용한 이 코드가 실행되기 위해서는 이를 위한 적절한 환경 및 준비가 필요할 것이다.(초기화된 데이터, 포인터, 전역변수 등등) 그런데 이러한 작업은 플랫폼에 관계없이 모든 C프로그램의 공통적인 부분이기에 Library화 해놓는다. 이것이 rts인 것이다.
이러한 rts2800_~.lib는 C언어로 작성된, 프로그램을 실행시키기 전에 실행되는 함수들의 집합 이라고 할 수 있다.
rts2800.lib 는 24계열의 DSP에
rts2800_ml.lib 는 28계열
rts2800_fpu3232.lib 는 FPU(Floating Point Unit)가 내장된 28계열에서 사용하며
더 빠른 부동소수점 연산을 위해서는 rts2800_fpu32_fast_suplement.lib를 함께 컴파일 한다.
여기까지가 대략적인 의의이고 좀 더 자세히 알고싶다면 아래로!
---------------------------------------------------------------------------------------------------------
rts 라이브러리의 역할은 아래와 같다. 핸드북보다 조금 길게 설명한다.
1.Stack확보 및 Stack Pointer 설정
Stack은 메모리의 일종으로 우리가 사용하는 C함수간의 데이터 전송시에 이용된다.(함수 A에서 함수 B에 변수를 전달 한다던가)
이 때, 우선 Ram 영역에 Stack 메모리를 확보(할당)하는 작업을 해 두어야 하는데 이를 Run Time Support Library가 해준다.
C언어를 좀 해보신 분들은 포인터의 개념을 잘 알고 있을 것이다. 간단하게 주소 개념으로 설명하자면, 우리가 코딩한 함수나 데이터는 어딘가에 저장되어 있을 것이고 이 데이터에 접근하려면 이들이 어디에 저장되어 있는지 알아야 한다. 즉 '어디에 저장되어 있는가'를 나타내는 주소를 저장하는 변수가 포인터라고 할 수 있다. Stack Pointer는 이 Stack메모리의 주소를 저장하고 있을 것이다. 그리고 이의 설정 역시 Run Time Support Library가 한다.
2.연산 비트 설정
math.h가 요구하는 연산을 정확하게 처리하기 위해서, CPU내부의 각종 상태 비트들을 설정한다.
자세히는 아직 모르겠지만, math.h에서 미리 구성해놓은 연산(상수, 삼각함수 포함하여)을 좀 더 효율적이고 정확하게 처리하기 위한 비트설정을 미리 해두고 실제 우리가 함수를 사용할 때는 바로 그 비트들에 접근하여 연산한다고 생각하면 되겠다.
3.데이터 초기화
상수변수의 초기화를 코드 실행 전에 해준다.
무슨 말인가 하면 우리가 전역변수 등에 int x = 3; 이라는 선언을 했다고 했을 때, 이는 main의 실행 전에 이루어져야 하는 작업이다. 또한 이 x라는 변수는 Run Time중에 변경 가능한 값이다. 즉, 휘발성 이라는 것이다. 따라서 Ram과 같은 휘발성(volatile)메모리에서 운용 되어야 한다.
rts는 플래시 메모리에 저장된 x=3이라는 상수 변수를, 적절한 램 영역에 x=3 이라고 초기화 해준다.
주의
이러한 변수의 초기화를 굉장히 많이 해줄 때 주의할 사항이 있다. 만약 DSP281_CodeStartBranch.asm에서 Watchdog의 사용여부를 설정하는 것이 아니라, main()함수에서 이를 설정한다면, 문제가 생길 수 있다. rts가 상수 변수의 초기화를 하는데, 8비트 카운터인 Watchdog이 2^8인 256을 헤아리는 동안 CPU가 적절한 동작을 하지 않는다면, Watchdog이 CPU에 이상이 있다고 판단하여 CPU를 리셋시킬 수 있다. 따라서 Watchdog의 사용설정을 main에서 한다면 이 상수변수 초기화를 짧게 해주어야 하거나, 차라리 어셈블리 내에서 설정하는것이 나을 수도 있다.
※개인적인 의견이지만 어셈블리에서 사용을 정지시키고 상수변수 초기화 후 main()에 들어와서 다시 사용하도록 해야하지 않을까?
추가
.C2000에서 lib파일을 만들기 위한 소스 코드가 rts.src이다.
.핸드북을 보면 CodeStartBranch에서 _c_int00 이라는 코드가 있다. rts.src 코드의 시작점이 _c_int00이다. 즉, DSP281x_CodeStartBranch.asm에 의해서 rts.src가 fms(rts2800_ml.lib)를 사용할 수 있게 해주는 것이다. 그리고 rts.src는 마지막에 call _main을 수행하여 main 함수를 호출한다.
.call _main의 '_'는 C코드와 어셈블리 코드가 상호 호출하는 레이블을 구분하기 위한 기호이다. 따라서 '_'기호를 보면 어셈블리와 C에서 상호 사용되는 것이라고 이해하면 된다.
'TMS320 > Study' 카테고리의 다른 글
[28346]부트와 간단한 예제 (0) | 2014.07.22 |
---|---|
[28346]작업환경 구성하기 (0) | 2014.07.21 |
CMD파일 (0) | 2014.07.18 |
GlobalVariableDefs.c (0) | 2014.07.17 |
TMS UserGuide (0) | 2014.07.17 |