2013-07-09 73 views
1

我正在用C++開發我的STM32F3探索板,並使用std :: deque作爲隊列。在嘗試調試我的代碼(直接在設備上使用ST鏈接或在模擬器中)後,代碼最終在斷點處停止,甚至在main()中輸入我的代碼之前。然而,SystemInit()配置板很好..push_back()導致程序在進入main()之前停止

我已經將此行爲追溯到使用push_back()(和push_front)作爲註釋從代碼解決問題。通過不知不覺,我發現在使用它之後,執行在斷點指令BKPT處停止,並且在恢復執行後不會進一步移動。這個指令是_sysopen()調用的一部分,與呼叫路徑:

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

什麼令我着迷是調用_initio,如果不使用的push_back其丟失,因爲沒有__rt_lib_init_atexit_1。介紹push_back也會使代碼大小從10 kB變爲34 kB。

這可能是一些不良配置的結果,或者我應該嘗試另一個IDE?我沒有想法。

+0

你能展示一些實際的C++代碼嗎?刪除一行防止出現故障並不一定意味着該錯誤在該行中。 – Antonio

+0

@Antonio當然,看看:https://gist.github.com/BetaRavener/5957167。 取消註釋任何push_back行都會導致此問題。 – Raven

+0

scale_buffer的聲明怎麼樣? – Antonio

回答

2

我有同樣的問題。我知道它與所謂的'semihosting'有關,我應該使用我的項目文件'retarget.c'來構建它,該項目文件包含作爲目標特定驅動程序級函數 (「_sys_xxxx()」)的 函數的定義許多版本的'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) 
... 

我解決了這個編輯原始「的retarget.c」所以,在它定義的函數將 覆蓋的Keil-MDK庫的人。新的「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」連接器的滿意,我的程序運行W/O問題。 也許這也會對你有所幫助。

+0

這是一個繼續使用Keil的解決方案,但是由於這個問題我後來切換到Eclipse並且構建用ARM特定的工具鏈:https://launchpad.net/gcc-arm-embedded。 – Raven

+0

@francek謝謝。幫助過我。 – Flip

0

嘗試通過檢查scale_buffer包含調用.back().front()之前的任何元素(scale_buffer.empty()):你可能讀,寫一些垃圾,這使得雙端隊列無效,準備地面,當你調用一個崩潰push_back()

+0

問題是我不能打回/前面。如果我(push_back註釋掉)我最終與HardFault中斷,所以這不是解決方案 – Raven

+0

@Raven什麼是scale_buffer.empty()的返回值? – Antonio

+0

邏輯上,如果我不推動任何東西,那麼是真的(實際上也是)。男人我不是初學者。 – Raven

相關問題