공부하는 내용
Start!
전역변수 정의를 기술한 소스코드이며 이 코드로 인하여 MMR을 정의한 헤더 파일의 내용들이 지정된 메모리 번지와 연결이 된다.
1.
#ifdef __cplusplus
#pragma DATA_SECTION("AdcRegsFile")
#else
#pragma DATA_SECTION(AdcRegs,"AdcRegsFile");
#endif
volatile struct ADC_REGS AdcRegs;
#ifdef __cplusplus는 C++의 Name mangling과 관련된 것으로 나중에 추후 서술하겠다.
일단, C++의 cpp로 만들어 졌다면
#pragma DATA_SECTION("AdcRegsFile")을 선언하여 AdcRegsFile이라는 데이터 섹션을 만드는 것이고, 그렇지 않다면(그냥 c라면) AdcRegs를 AdcRegsFile이라는 데이터 섹션으로 관리하겠다는 것이다.
아래에 volatile struct ADC_REGS AdcRegs로, AdcRegs를 선언하였고 구조체 ADC_REGS에 대한 정보는 DSP281x_Adc.h에 기재되어 있다.
ADC_REGS는 아래와 같이 구조체로 선언되어 있다.
struct ADC_REGS {
union ADCTRL1_REG ADCTRL1; // ADC Control 1
union ADCTRL2_REG ADCTRL2; // ADC Control 2
union ADCMAXCONV_REG ADCMAXCONV; // Max conversions
union ADCCHSELSEQ1_REG ADCCHSELSEQ1; // Channel select sequencing control 1
union ADCCHSELSEQ2_REG ADCCHSELSEQ2; // Channel select sequencing control 2
union ADCCHSELSEQ3_REG ADCCHSELSEQ3; // Channel select sequencing control 3
union ADCCHSELSEQ4_REG ADCCHSELSEQ4; // Channel select sequencing control 4
union ADCASEQSR_REG ADCASEQSR; // Autosequence status register
Uint16 ADCRESULT0; // Conversion Result Buffer 0
Uint16 ADCRESULT1; // Conversion Result Buffer 1
Uint16 ADCRESULT2; // Conversion Result Buffer 2
Uint16 ADCRESULT3; // Conversion Result Buffer 3
Uint16 ADCRESULT4; // Conversion Result Buffer 4
Uint16 ADCRESULT5; // Conversion Result Buffer 5
Uint16 ADCRESULT6; // Conversion Result Buffer 6
Uint16 ADCRESULT7; // Conversion Result Buffer 7
Uint16 ADCRESULT8; // Conversion Result Buffer 8
Uint16 ADCRESULT9; // Conversion Result Buffer 9
Uint16 ADCRESULT10; // Conversion Result Buffer 10
Uint16 ADCRESULT11; // Conversion Result Buffer 11
Uint16 ADCRESULT12; // Conversion Result Buffer 12
Uint16 ADCRESULT13; // Conversion Result Buffer 13
Uint16 ADCRESULT14; // Conversion Result Buffer 14
Uint16 ADCRESULT15; // Conversion Result Buffer 15
union ADCTRL3_REG ADCTRL3; // ADC Control 3
union ADCST_REG ADCST; // ADC Status Register
};
위와같이 MMR정보를 구조체로 정의하였기 때문에 비트 단위 접근등이 용의하다. 물론 이렇게 해서는 고전 방식과 같이
#define ADCTRL1 (volatile unsigned int *)0x7100
식으로 주소를 바로 부여할 수 없기에 저기 위에처럼 데이터 섹션으로 관리한다. 이 구조체 데이터를 섹션으로 관리하고 링커에게 이 섹션을 메모리의 특정 영역에 배치하라고 하면 자연스럽게 번지 정보를 부여할 수 있는 것이다.
다음은 링커를 공부하자!
'TMS320 > Study' 카테고리의 다른 글
MMR이란? (0) | 2014.08.08 |
---|---|
cmd 파일 (0) | 2014.08.07 |
DSP281x_Device.h (0) | 2014.08.07 |
DSP281x_SysCtrl.c <좀더 자세히> (0) | 2014.08.06 |
전처리기(Precompiler) pragma (0) | 2014.08.06 |