2014-12-03 1 views
1

IAR Embedded Workbench 버전 6.6 인 MSP430 v5.60.7에 IAR Embedded Workbench를 사용하고 있습니다. C99을 사용하고 있습니다.IAR Embedded Workbench 6 (MSP430 V5.6) 프로그램 시작 재정의

__program_start()를 __unit_test_main()이라는 자체 심볼로 덮어 쓰려고합니다. 나는 링커 설정 탭으로 가서 "기본 프로그램 엔트리 무시"상자를 체크하고 "엔트리 심볼"옵션을 선택하고 __unit_test_main을 입력했습니다. 이 컴파일 및 링크 그러나 시뮬레이터에서 실행되지 않습니다. "사용자 오류 : 0x0에 잘못된 opcode가 있습니다"라는 메시지가 나타납니다. 타겟에서 실행하려고하면 컨트롤러가 작동하지 않습니다. 컨트롤러가 저전력 모드로 전환됩니다.

PC와 SP는 모두 시작할 때 0x00으로 초기화됩니다.

그렇다면 PC와 SP를 제대로 초기화하려면 어떻게해야합니까/정의해야합니까?

#include <cstdio> 
    void __unit_test_main(void); 
    void __unit_test_main(void) 
    { 
     printf("Hello World"); 
     for(;;) 
     { 
     } 
    } 
+0

를 호출 난 당신이 그 함수의 라이브러리 함수를 호출 할 수 있는지 확실하지 않다했을 것이다. 내가 올바르게 이해했다면 초기화 작업이 아직 끝나지 않았을 때 프로그램을 인계받습니다. '.bss' 섹션은 초기화되지 않았고'.data' 섹션은 초기화되지 않았습니다. 이것은 라이브러리 함수가 필요로하는 전역 변수 ('printf'에는 어떤 것이 있다고 생각합니다)가 쓰레기 값을 가질 가능성이 있음을 의미합니다. 참고 : 이것은 추측 일 뿐이며 MSP 또는 입력 무시로 작업하지 않았습니다. – user694733

+0

__unit_test_main을 실행할 수 없습니다. CLIB와는 아무런 관련이없는 이유가 확실하지 않습니다. – Nick

답변

0

__program_start: cstartup.s43에 정의되어

내 단위 테스트의 주요 기능은 여기의에서이 파일 전체의, 지금은 간단하다. 이 파일을 프로젝트 디렉토리에 복사하고 프로젝트에 포함시켜 라이브러리 버전을 덮어 쓸 수 있습니다.

__program_start: 레이블 바로 뒤에 스택 포인터가 초기화되고 __low_level_init()이 호출되고 ?cstart_call_main이 호출됩니다. ?cstart_call_main: 라벨 (라인 339)의 주위에

는 다음이

XRSEGCSTART 
    PUBLIC ?cstart_call_main 

    EXTERN main 
    EXTERN exit 

?cstart_call_main: 
    XXCALL main 
    XXCALL exit 

당신이 가진 주요 교체 할 함수의 기호를 추가 할 수 있습니다.

일부 #ifdef 전 처리기 논리를 사용하여 조건부로 수행 할 수 있습니다.

그래서 나는

XRSEGCSTART 
    PUBLIC ?cstart_call_main 
#ifdef UNIT_TEST 
    EXTERN test_runner_main 
#else 
    EXTERN main 
#endif 
    EXTERN exit 

?cstart_call_main: 
#ifdef UNIT_TEST 
    XXCALL test_runner_main 
#else 
    XXCALL main 
#endif 
    XXCALL exit 

    PUBLIC ?cstart_end 

내가 어셈블러와 컴파일러 옵션에서 내 UNIT_TEST 기호를 정의 할 수 있었다.

또 다른 옵션

내 프로젝트에 어딘가에 기능 __low_level_init()를 구현하고 조건부로 호출 test_runner을 만드는 대신 main()

관련 문제