死循环在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  又没有定义过,因此出现了无法解决的问题,在这里提醒你们注意,遇到问题必定要认真的检查了!
相关文章
相关标签/搜索