keil MDK使用过程中遇到的问题及解决办法
1. 程序卡死在 BX R0(汇编卡死在 BEAB BKPT 0xAB)处
- 原因:程序中可能使用了printf()函数而没有勾选使用微库(或未定义printf函数就直接使用了)
- 解决方法:如果需要微库的方式实现的printf()函数,把微库勾选上
若不需要printf()函数,将程序中的printf()函数清除。
2. 程序卡死在B.处
- 原因:程序中有中断没有处理,或者在C/C++混合编程时,中断函数写在.cpp文件中了
- 解决方法:查找是否有中断函数没有处理,将其中断服务函数加上
若中断函数写在.cpp文件中,中断函数两端加extern“C”的声明,如下:
#ifdef __cplusplus
extern "C" {
#endif
/* 此处写中断服务函数*/
#ifdef __cplusplus
}
#endif
3.keil屏蔽某一特定的警告
- 在工程选项中C/C++模块的 Misc Controls 中增加: --diag_suppress=num(num为警告部分#号后面的数字)
4.在调试过程中变量不时时更新
勾选上view菜单栏下的最后一项:periodic window update
5.处理单精度转双精度的警告
使用STM32F4时编译器提示
..\..\Code\App\main.c(803): warning: #1035-D: single-precision operand implicitly converted to double-precision
解决方法:
- 在变量后面添加f,如:
float delta_s = lsdb_robot_speed[0] * 0.1f;
- 或者把
Target->Floating point Hardware
关掉(未测试)