死循環在BEAB BKPT 0xAB彙編的解決辦法

今天調試STM32時發現一直停在
0x20002460 BEAB BKPT 0xAB(我用的是RAM調試),上網搜資料找到了解決辦法。
 
原文:
 
之前使用printf 都很順利, 程序能夠很天然地經過 串口 輸出字符串,最近使用printf時,程序老是進不去,就是連MAIN 函數都不會執行了,只要把printf屏蔽了, 軟件就能夠正常運行
使用的是 STM32 芯片
仿真的時候程序就是一直在:
0x08002628 BEAB      BKPT     0xAB0,
動都不動

這個問題的解決辦法是:
在項目 設置中 選擇 target選項卡 而後選擇 USE Mcrolib 這樣就能夠了
就是說要用printf函數時要用"Use MicroLIB"庫,即: C 微庫(microlib)

還有一種方法:
標準庫函數的默認輸出設備是顯示器,要實如今串口或LCD輸出,必須重 定義標準庫函數裏調用的與輸出設備相關的函數,printf輸出到串口,只需將putc裏面的輸出指向串口就行,另外在使用標準庫函數時必須避免半主機 模式,方法是在main 文件里加 代碼:_sys_exit(int x)  
{  
x = x;  
}  


  可是在使用時務必注意,正常狀況下以上兩種方法都能解決問題,若是仍是解決不了就要檢查你的程序中有什麼其餘的代碼影響了,
    個人狀況是,單獨打印徹底正常,一加到個人其餘程序中就會停在
0x08002628 BEAB      BKPT     0xAB0, 這個地方,後來才發現,個人main.c中

有一個條件 編譯
#ifdef  USE_FULL_ASSERT
以下:


  1. #ifdef  USE_FULL_ASSERT
  2. /**
  3.   * @br
  4.   ief  當程序出錯時,返回出錯的文件名及在源程序中的行號.
  5.   * @param file: 指向文件名的指針
  6.   * @param line: 在源程序中的行號
  7.   * @retval : None
  8.   */
  9. void assert_failed(uint8_t* file, uint32_t line)
  10. {
  11.   /* 用戶能夠在此根據須要添加內容,例如報告出錯的文件名和行號,
  12.      ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  13.   /* 無限循環 */
  14.   while (1)
  15.   {
  16.   }
  17. }
  18. #endif

而我把下面一段代碼放錯位置了
  1. /*******************************************************************************
  2. * Function Name : PUTCHAR_PROTOTYPE
  3. * Description : Retargets the C library printf function to the USART.
  4. * Input : None
  5. * Output : None
  6. * Return : None
  7. *******************************************************************************/
  8. PUTCHAR_PROTOTYPE
  9. {
  10. /* Write a character to the USART */
  11. USART_SendData(USART1, (u8) ch);

  12. /* Loop until the end of transmission */
  13. while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET) {
  14. }

  15. return ch;
  16. }
把上面的代碼放在了 #ifdef  USE_FULL_ASSERT ................................. #endif 中間了,而 USE_FULL_ASSERT  又沒有定義過,因此出現了無法解決的問題,在這裏提醒你們注意,遇到問題必定要認真的檢查了!
相關文章
相關標籤/搜索