문제

일부 외부 HW에 의존하는 임베디드 C 프로젝트를 진행하고 있습니다. 이 부품에 액세스하는 코드를 스텁하고 싶습니다. 따라서 HW를 사용하지 않고도 시스템을 시뮬레이션 할 수 있습니다. 지금까지 나는 약간의 매크로를 사용했지만 이로 인해 제작 코드에서 약간 변경해야합니다.

예시:

stub.h
#ifdef _STUB_HW
#define STUB_HW(name) Stub_##name
#else /*_STUB_HW*/
#define STUB_HW(name) name
#endif /*_STUB_HW*/

my_hw.c
WORD STUB_HW(clear_RX_TX)()
{ /* clear my rx/tx buffer on target HW */ }

test_my_hw.c
#ifdef _STUB_HW
WORD clear_RX_TX()
{ /* simulate clear rx/tx buffer on target HW */ }

이 코드를 사용하면 전처리 기 태그로 스터브를 켜거나 끕니다. _STUB_HW

내 prod 코드를 변경하지 않고 많은 ifdef를 피할 필요없이 이것을 압류하는 방법이 있습니까? 그리고 피할 수 있다면 Prod와 테스트 코드를 동일한 파일로 혼합하지 않을 것입니다. 생산 코드에서 가능한 한 많이 유지할 수있는 한 테스트 코드가 어떻게 보이는지 상관하지 않습니다.

편집하다:

전체 파일을 교체하지 않고 함수를 선택/이름을 바꾸는 것이 좋을 경우 좋을 것입니다. 모든 기능을 시작하는 것처럼 nRF_## 그리고 새로운 이름을주고 삽입합니다 test_nRF_## 에게 nRF_## 입안이라면

도움이 되었습니까?

해결책

actualdriver.c와 stubdriver.c는 정확히 동일한 함수 이름을 포함하는 두 파일을 만듭니다. 생산 코드를 다른 객체와 연결하는 두 개의 빌드를 만들면 이름 지정 충돌이 없습니다. 이런 식으로 생산 코드에는 테스트 나 조건부 코드가 포함되어 있지 않습니다.

다른 팁

Gerhard가 말했듯이 일반적인 헤더 파일 "Driver.h"와 실제 및 스터브 기능이 포함 된 별도의 하드웨어 계층 구현 파일을 사용하십시오.

Eclipse에는 두 개의 대상이 있으며 사용하지 말아야 할 Driver.c 파일을 "빌드에서 제외하고"적절한 것이 빌드에 포함되어 있는지 확인하십시오. 그런 다음 Eclipse는 빌드 시간에 makefile을 생성합니다.

지적해야 할 또 다른 문제는 고정 크기 정수를 정의하여 코드가 오버 플로우 관점에서 동일하게 작동하는지 확인하는 것입니다. (코드 샘플에서 비록 당신이 그렇게하는 것을 볼 수 있습니다.)

나는 위에 동의합니다. 이에 대한 표준 솔루션은 HW의 "드라이버"인 불투명 추상 기능 호출 세트를 정의한 다음 주 프로그램에서 호출하는 것입니다. 그런 다음 두 가지 다른 드라이버 구현, 하나는 HW, 하나는 SW 용을 제공합니다. SW 변형은 적절한 방식으로 HW의 IO 효과를 시뮬레이션합니다.

목표가 더 낮은 수준 (즉, 각 하드웨어 액세스가 전체 기능이 아닌 시뮬레이션되는 코드를 작성하는 경우 약간 까다로울 수 있습니다. 그러나 여기서는 다른 "write_to_memory"및 "read_from_memory"함수 (또는 대상 속도가 필수적인 경우 매크로)를 정의 할 수 있습니다.

기능 이름을 변경할 필요는 없습니다. 두 개의 다른 배치 파일 만 있거나 파일 만들기 또는 IDE 빌드 대상 (사용중인 도구에 따라 다름).

마지막으로, 많은 경우 더 나은 기술적 솔루션은 다음과 같은 본격적인 대상 시스템 시뮬레이터를 찾는 것입니다. QEMU, 동시, Systemc, , 대단한, 또는 유사한. 이를 통해 항상 동일한 코드를 실행할 수 있으며 대신 소프트웨어 관점에서 실제 하드웨어처럼 작동하는 하드웨어 모델을 빌드합니다. 훨씬 더 큰 투자가 필요하지만 많은 프로젝트의 경우 노력의 가치가 있습니다. 기본적으로 대상 및 호스트를 위해 다른 빌드를 갖는 불쾌한 문제를 제거하고 배포 빌드 옵션과 함께 항상 크로스 컴파일러를 사용하도록합니다. 많은 임베디드 컴파일러 스위트에는 기본적인 시뮬레이션 기능이 내장되어 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top