2013-07-09 5 views
1

내 STM32F3 디스커버리 보드 C++로 개발 및 표준 : : 대기열로 양단 큐를 사용하고 있습니다. 내 코드를 (ST-link 또는 시뮬레이터가있는 장치에서 직접) 디버깅하려고하면 main()에 내 코드를 입력하기 전에 코드가 결국 중단 점에서 멈 춥니 다. 그러나 SystemInit() 보드 잘 구성합니다.와 push_back()는 입력하기 전에 중지 할 프로그램을 일으키는 주()

코드에서 주석으로 문제를 해결할 때 push_back() 및 push_front 사용하여이 동작을 추적했습니다. disassmebly 통해 그것을 사용 후 중단 점 명령 BKPT 실행을 중지하고 실행을 다시 시작한 후에 더 이상 이동하지 않는 것으로 나타났습니다. 이 명령은 호출 경로, _sysopen() 호출의 일부입니다 : 더 __rt_lib_init_atexit_1이 없기 때문에 어떤 흥미 롭하기와 push_back를 사용하지 않을 경우 누락 된 _initio에 호출,이다

__main -> __scatterload -> __scatterload_null -> __rt_entry -> __rt_lib_init -> __rt_lib_init_atexit_1 -> _initio -> freopen -> _sysopen 

. push_back을 도입하면 코드 크기도 10kB에서 34kB가됩니다.

이 나쁜 구성의 결과 일 수도 있고 내가 다른 IDE를 시도해야한다? 나는 아이디어가 없어.

+0

당신은 실제 C++ 코드의 무언가를 보여줄 수 있습니까? 한 행을 제거하면 오류가 발생하지 않는다는 사실은 반드시 그 행에 오류가 있음을 의미하지는 않습니다. – Antonio

+0

@Antonio 물론,보세요 : https://gist.github.com/BetaRavener/5957167. push_back 행을 주석 해제하면이 문제가 발생합니다. – Raven

+0

scale_buffer 선언은 어떻게됩니까? – Antonio

답변

2

나는 똑같은 문제가 있었다. 나는 내가 목표 특정 드라이버 수준의 기능 입니다 같은 기능의 정의 '_sys_xxxx를() (포함 내 프로젝트 파일'retarget.c '를 구축해야 소위'세미 호스팅 '과 함께 할 수있는 뭔가가 배운 'retarget.c'의 많은 버전은 Keil-MDK의 일부이며 웹에서도 찾을 수 있습니다. 그래서 내가 그랬어하지만 다음과 유사한 던져 오류를 링커 :

Error: L6200E: Symbol _sys_open multiply defined (by arm_xxx_lib.o and retarget.o) 
Error: L6200E: Symbol _sys_close multiply defined (by arm_xxx_lib.o and retarget.o) 
... 

내가 그것을 정의 기능 카일 - MDK 라이브러리에있는 사람을 무시할 수 있도록 원래의 'retarget.c'를 편집하여이 문제를 해결했다. 새로운 'retarged.c'는 다음과 같습니다.

#include <stdio.h> 
#include <rt_misc.h> 

#pragma import(__use_no_semihosting_swi) 

#include <rt_sys.h> 

extern void $Super$$_sys_open(void); 

FILEHANDLE $Sub$$_sys_open(const char *name, int openmode) 
{ 
return 1; /* everything goes to the same output */ 
} 

extern void $Super$$_sys_close(void); 
int $Sub$$_sys_close(FILEHANDLE fh) 
{ 
return 0; 
} 

extern void $Super$$_sys_write(void); 
int $Sub$$_sys_write(FILEHANDLE fh, const unsigned char *buf, 
       unsigned len, int mode) 
{ 
//your_device_write(buf, len); 
return 0; 
} 

extern void $Super$$_sys_read(void); 
int $Sub$$_sys_read(FILEHANDLE fh, unsigned char *buf, 
      unsigned len, int mode) 
{ 
return -1; /* not supported */ 
} 

extern void $Super$$_ttywrch(void); 
void $Sub$$_ttywrch(int ch) 
{ 
char c = ch; 
//your_device_write(&c, 1); 
} 

extern void $Super$$_sys_istty(void); 
int $Sub$$_sys_istty(FILEHANDLE fh) 
{ 
return 0; /* buffered output */ 
} 

extern void $Super$$_sys_seek(void); 
int $Sub$$_sys_seek(FILEHANDLE fh, long pos) 
{ 
return -1; /* not supported */ 
} 

extern void $Super$$_sys_flen(void); 
long $Sub$$_sys_flen(FILEHANDLE fh) 
{ 
return -1; /* not supported */ 
} 

extern void $Super$$_sys_exit(void); 
long $Sub$$_sys_exit(FILEHANDLE fh) 
{ 
return -1; /* not supported */ 
} 

이 버전의 'retarget.c'링커가 만족되었으며 내 프로그램이 실행되지 않습니다. 아마도 도움이 될 것입니다.

+0

Keil을 계속 사용할 때이 솔루션을 사용할 수 있지만 나중에 이클립스와 건물로 전환했습니다. ARM 관련 툴체인 : https://launchpad.net/gcc-armembedded. – Raven

+0

@francek 감사합니다. 나를 도와 주었다. – Flip

0
scale_buffer이 .back().front() 호출하기 전에 모든 요소 ( scale_buffer.empty())이 포함 된 경우 확인하여

보십시오 : 당신은 아마 읽고 양단 큐가 유효하지 않게 일부 쓰레기를 작성하는 당신이 전화 충돌에 대 한 땅을 준비, push_back()

+0

문제는 내가 앞/뒤로 전화하지 않는다는 것입니다. 그리고 내가 방해 하드 폴트와 끝까지 (와 push_back 주석) 것, 그래서 이것은 scale_buffer.empty의 반환 값()가 무엇 솔루션 – Raven

+0

@Raven없는 경우? – Antonio

+0

논리적으로 아무 것도 누르지 않으면 true (사실 너무). 나는 초보자가 아니다. – Raven