在开发中Keil的一点使用技巧:使用ARM V6编译器和gun11标准;查找导致进入HardFault_Handler的函数;SAVE命令将数据导出到文件;开启FPU硬件浮点数和添加DSP库
使用ARM V6编译器和gun11标准
ARM V5编译器已经停止开发了,是时候换到V6编译器了。
-
工具栏
Options for Target - Target - Code Generation - ARM Compiler
这里可以选择指定版本的V6编译器,或是Use default compiler version 6
-
在切换至ARM V6编译器后,Options for Target设置栏里面的
C/C++
会变成C/C++(AC6)
。这时切换至C/C++(AC6)
选项卡即可在Language C
处选根据需要择使用c11
/gun11
-
Optimization
可以调整优化等级。如果不想要编译器优化可以设置成Level0 (-O0)
-
另外注意一下CUBEMX默认生成FreeRTOS函数使用的是V5编译器的标准(至少在我当前使用的版本STM32F4 Package 1.26.2是这样的)切换成V6后编译会报错。解决方法只需要替换一下CUBEMX包的文件就好。
进入芯片软件包的安装目录
...\STM32Cube_FW_F4_V1.26.2\Middlewares\Third_Party\FreeRTOS\Source\portable
将RVDS文件夹里的ARM_CM4F文件夹,替换为GCC里的ARM_CM4F文件夹即可。再重新用CUBEMX生成工程,FreeRTOS就可以通过ARMV6编译了。另外软件包升级之后也要重新替换一下。
查找导致进入HardFault_Handler的函数
致使程序进入HardFault_Handler硬件错误中断函数的原因有很多。可以调试打断点然后跳转到出问题的函数
首先在HardFault_Handler的while(1)前打调试断点
当程序执行到断点后,在Keil菜单栏点击 View - Call Stack Window
,会弹出 Call Stack + Locals
对话框
右键单机HardFault_Handler,然后选择 Show Caller Code
之后就会跳转到出错之前的函数处。 Disassembly
窗口也会用黄色高亮显示来源。
之后就是改Bug了 多查一查这部分函数调用情况,另外多注意下数组是否可能会出问题
SAVE命令将数据导出到文件
调试时,打开Command窗口(如果没有的话就在系统菜单 View - Command Window
启用)
在窗口的下方有一个输入框,在其中输入SAVE命令,回车执行
SAVE D:\test.txt 0x20000100,0x2000200
参数的涵义也不难理解:
D:\test.txt
是文件路径和文件名;
0x20000100
是待存储的起始地址;
0x20000200
是待存储的终止地址 ;
,accSize
为可选项,代表读取目标内存的字节大小。
不过最终输出的是txt文件和HEX格式的数据,后期处理和使用起来也确实稍有些麻烦。
官方SAVE命令文档 https://www.keil.com/support/man/docs/uv4/uv4_cm_save.htm
https://developer.arm.com/documentation/ka002842/latest
开启FPU硬件浮点数和添加DSP库
工具栏 Manage Run - Time Environment - CMSIS - DSP 勾选,即可完成添加DSP。不过建议用CubeMX软件包的方式添加
详细的写在另一篇博客了 https://ittuann.github.io/2021/12/25/DSP
杂项
不太好归类但是也想要说一下。
-
修改ROM起始地址
Options for Target - Target - IROM1 下修改
更新
Keil现在已经默认不在安装包里包含 Arm Compiler v5 了
如果还是想用回旧版 可以参照官方的文章来额外安装
https://developer.arm.com/documentation/107778/5-38a/MDK-Version-5-38a
https://developer.arm.com/downloads/view/ACOMP5
https://developer.arm.com/documentation/101407/0538/Creating-Applications/Tips-and-Tricks/Manage-Arm-Compiler-Versions