2014-07-09 11 views
0

상황 :
TI MSP430에 단위 테스트가 임베드되었습니다. 단위 테스트는 gcc로 컴파일 된 리눅스 호스트에서 실행됩니다. 이 프로젝트는 다소 크고 주로 레거시 코드입니다.
마이크로 컨트롤러 레지스터에 대한 호출을 가로 채기

문제 : 읽고 다른 사람들과 같은 PCIN_L, PCOUT_L 및 PCDIR_L 같은 레지스터에 기록
있다는 것을 그들이 선언되지 않은 있습니다 말하는 오류가 발생합니다 컴파일 할 때. 이는 호스트에서 실행될 때 그러한 레지스터가 존재하지 않기 때문에 사실입니다.
이전에는 사용할 수없는 함수 (심볼)에 대한 호출을 가로 채고 가짜 함수로 호출을 리디렉션하여 미리 정의 된 값만 반환하는 방법을 배웠습니다. 이것은 링커 옵션 -Wl --wrap,someSymbol을 사용했습니다.

Makefile: 
LDFLAGS=-Wl --wrap,AbsentFunction 
SOURCES=WrappedFunctions.c 

WrappedFunctions.c: 
int __wrap_AbsentFunction(int val_a) 
{ 
    return val_a; 
} 

AbsentFunction-__wrap_AbsentFunction에 어떤 통화를 리디렉션합니다. 그러나 나는 행운을 빕니다.

Makefile: 
LDFLAGS=-Wl --wrap,PCDIR_L 
SOURCES=WrappedSymbols.c 

WrappedSymbols.c: 
char __wrap_PCDIR_L; 

질문 :
는 내가 기능에 그랬던 것처럼 레지스터 비슷한 할 수 있습니까? 프로젝트 코드에 변경 사항을 도입하지 않는 것이 좋습니다.

+0

실제 코드에서 레지스터가 어떻게 액세스되는지 정확하게 보여주십시오. – unwind

+0

레지스터를 읽거나 쓰는 작은 보조 기능을 작성하십시오. 당신은 그들을 감쌀 수 있습니다. –

+0

@unwind, MSP430c54c.h에서
은'#DEFINE P6DIR (PCDIR_H) external_link.h에서 ''#DEFINE의 PA_PINS_AS_OUTPUT | external_link.c IN (P6DIR = 0x30의) 'PA_PIN_AS_OUTPUT;' – Enok82

답변

0

당신은 단순히 같은 선언을 포함하는 "가짜"프로세서 헤더를 생성하여 휘발성 데이터로 메모리 매핑 된 프로세서 주변 장치 레지스터를 선언 할 수 빌드 할 코드.

더 나은 방법은 주변 장치 액세스가 하드웨어에 직접 전달되는 것이 아니라 함수 API를 통해 이루어 지도록 하드웨어 추상화 계층을 작성한 다음 하드웨어 동작을 에뮬레이트하는 "가짜"API를 생성하는 것입니다.

+0

컴파일러에서 MSP430x54x.h 헤더 파일 중 어느 것이 사용해야합니까, 광산 (위의 선언 포함) 또는 원본을 말 할 수 있습니까? 아니면 원래 코드에'#if defined UNITTEST'를 넣어야합니까? ... 당신의 추상화 API는 Hans가 위와 똑같은 해결책입니까? – Enok82

+0

@ Enok82 : 가장 간단한 해결책은 두 개의 별도 MSP430x54x를 사용하는 것입니다.h 파일을 다른 디렉토리에 저장하고 단위 테스트 빌드에 다른 포함 파일 검색 경로를 제공합니다. – Clifford

+0

작동 중입니다. 나는 'extern'을 제거해야했다. 두 개의 MSP430x54x.h 헤더 파일을 가지고'gys -isystem/myincludes/-c foo.c'처럼'-isystem dir' gcc 옵션을 사용하여 내 자신의 것으로 전환했습니다. 사용할 수있는 다른 옵션으로'-I'는'-isystem'과 같고'-iquote'는 <> 대신 ""를 사용하여 포함하는 로컬 헤더 파일입니다. ... 대단히 감사합니다! – Enok82

0

MSP430 장치의 레지스터 이름은 모두 장치 관련 헤더 파일에 선언되어 있습니다. 반드시 이러한 레지스터의 동작을 쉽게 모방 할 수는 없지만 레지스터를 프로그램에 액세스 할 수있는 메모리 위치에 매핑하는 동일한 파일을 작성할 수 있습니다.

포트 레지스터의 비트 단위 기능을 모방 한 다음에는 직렬 포트 상태 레지스터와 나머지는 상당히 착수 될 것입니다.

extern volatile uint16_t PCDIR_L ; 

그들은 물론 주변 장치 레지스터처럼 행동하지 않습니다하지만이 허용됩니다

+0

그 해결책은 Clifford가 제안한 것과 비슷한 형태로 보일 것입니까? – Enok82

+0

예 그럴 것 같습니다 –