天天看點

解決STM32調試,無法進入main函數的問題

昨天調試STM32程式,以前使用的是MDK3.40的版本,把版本升了下級,升到了MDK4.10,裝好後,一運作,哈哈,新版本給人的感覺就是不一樣啊,很爽,較之前有很多改進,把自己以前的程式打開,編譯運作發現程式調試時無法進入Main函數,弄了很久,很是郁悶啊,最後還是在ourdev的壇子裡,找到了同樣問題的解決方法,多謝ourdev,以下是壇子裡面的文章,我把他貼出來了.   sdc666 : 請問高手,我在調試我的STM32F101c8t6時,遇到一個問題,因為我要調試序列槽,我在main.c中添加了#include <stdio.h> ,編譯可以通過,但是當我用jlink硬體調試時,一開始就停在了 " 0x08001460 BEAB      BKPT     0xAB";并且無法向下運作.  請問高手,這個問題的原因是什麼?怎麼解決? 謝謝!     

          _sys_open:

0x08001450 B50E      PUSH     {r1-r3,lr}

0x08001452 E9CD0100  STRD     r0,r1,[sp,#0]

0x08001456 F000FAF9  BL.W     strlen (0x08001A4C)

0x0800145A 9002      STR      r0,[sp,#0x08]

0x0800145C 4669      MOV      r1,sp

0x0800145E 2001      MOVS     r0,#0x01

0x08001460 BEAB      BKPT     0xAB

0x08001462 BD0E      POP      {r1-r3,pc}   pldjn : 應該是項目設定的問題,檢查一下你的設定.   sdc666: pldjn 你好,能詳細指點以下麼?應該怎樣設定?  這個程式是我該的,本來是沒有#include <stdio.h>,我添加序列槽後因為需要标準庫函數,是以才加上的. 是不是還要設定編譯環境?  謝謝.   pldjn :

你用J-Flash打開你的HEX檔案看看編譯的是否是對的.不用自動下載下傳使用J-flash燒進去調一下試試.   dragonwww: 我也遇到同樣問題,我是調用printf時出現的這個錯誤,我已經把putchar重定位了,不知道為何還是出錯,求解,THX!   yugen: 那是因為你使用了printf之類的庫函數,需要編寫_sys_exit()之類底層函數。照你的提示看,也許是_sys_open()沒寫。_sys_xxx之類的的隻要寫個空函數就行了。   dragonwww: to yugen:

    能否說的再仔細些,如果自己編寫個空函數應該放在哪裡?函數定義格式是什麼樣的呢?

    納悶的是以前也用過printf,沒出現這個提示啊。   PZLPDY: 5樓的應該不是這樣吧?

應該是你沒有選中微庫造成的。這個問題昨天我遇到過。在工程的設定選項裡把微庫勾上就OK了   dragonwww: to PZLPDY:

   蒼天啊,果然如你所說,把微庫勾上就OK了,奇怪了為什麼以前用的的時候沒報錯呢?以前也沒選微庫啊!   yugen: 因printf()之類的函數,使用了半主機模式。使用微庫的話,不會使用半主機模式,是以就沒有問題。

添加下面代碼,就可以使用标準庫了:

#pragma import(__use_no_semihosting)

_sys_exit(int x)

{

x = x;

}

struct __FILE

{

int handle;

};

FILE __stdout;   dragonwww: yugen是高手啊,再請教一下:

1.何為“半主機模式”?與 非半主機模式有何差別?

2.你的這段代碼需要放在那個檔案裡?自己的main函數所在的檔案嗎?

3.看到代碼實作了_sys_exit,那我提示錯誤的_sys_open()不用實作嗎?

請指教,多謝!   yugen: 你說的問題都可以在"RealView® 編譯工具庫和浮點支援指南"書中找到,網上有下,我就不複制了。書有中文的。realview編譯器有好幾本書,都有中文。

繼續閱讀