Keil/MDK:使用过程中的一些设置
Posted 何事误红尘
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Keil/MDK:使用过程中的一些设置相关的知识,希望对你有一定的参考价值。
目录
- 0. 概述
- 1. 背景颜色设置
- 2. 设置Keil生成bin文件
- 3. 界面出错
- 4. 生成预编译文件
- 5. object file renamed from
- 6. *** Target ‘ ‘ uses ARM-Compiler ‘V6.14‘ which is not available
- 7. 双击工程无法打开map文件
- 8. 部分函数无法跳转
- 9. 更换芯片后无法下载
- 10. warning: #14-D: extra text after expected end of preprocessing directive
- 11. 分析偶现问题--不重启进行仿真
0. 概述
本文主要记录一些keil环境上的设置,不涉及具体芯片,不定期更新。
1. 背景颜色设置
keil默认是白色背景:
看久了比较刺眼睛,可以设置成相对护眼的颜色。方法如下:
这里搞一个自定义颜色:
除了下图标出的两项,需要依次进行设置:
参考链接:Keil 保护视力背景颜色设置。
2. 设置Keil生成bin文件
以前设置后工程,使用路径方式。互相编译工程,还需要改keil的安装路径。使用下面的写法,就不用纠结路径了。
fromelf.exe --bin -o "$L@L.bin" "#L"
或者使用:
$K\\ARM\\ARMCC\\bin\\fromelf.exe ".\\ChargeStation\\ChargeStation.axf" --bin --output "..\\Bin\\ChargeStation.bin"
在工程目录下的Bin文件夹下存放bin文件,更方便取用。
3. 界面出错
有时界面会出现问题,编译、下载栏一栏显示成了打开、保存。点击会正常编译、下载,但非常怪异,重新打开keil并不能解决:
可以通过reset解决:
最好选择restart,reset并不能解决:
4. 生成预编译文件
程序中经常使用到宏定义来实现一些简单的计算公式,减少函数调用跳转。有时考虑不周,宏定义展开后可能会导致一些异常,这种异常比较难以查找。
又或者Protothread,为了便于理解,最好查看展开后的代码。
宏定义替换是在预编译阶段,keil中可以通过设置,生成宏展开后的.i文件:
此时工程目录Listings文件夹下只有两个文件:
重新编译工程,即可.i生成:
这里以Protothread为例,源文件tasknbbus.c中:
查看PT_BEGIN宏定义如下:
我们打开tasknbbus.i文件,找到bms_nbbus_entry函数,可以看到:
更方便理解Protothread实现机制。
5. object file renamed from
编译时出现如下提示
在keil中的project目录中,删除重名的文件。在工程文件夹中也删除了源文件。clean之后rebuild,仍然无效。
百度了一下(点击进入),将涉及的文件全部设置为不编译:
设置后进行编译,工程报错不必理会。编译完成后,再重新将文件加入到编译,再次编译。测试了下,不管用。可能每个人的情况还是有些差异的。最终按照评论解决,直接删除Objects文件夹,然后rebuild。
6. *** Target ‘ ‘ uses ARM-Compiler ‘V6.14‘ which is not available
使用一个参考工程时无法编译:
查看选择了更高版本的6.16:
也可以安装6.14,参考链接:手把手教你升级Keil MDK的ARM编译器
7. 双击工程无法打开map文件
重新选择一下map文件的路径就好了
8. 部分函数无法跳转
9. 更换芯片后无法下载
原本是STM32的工程,修改为N32后,无法下载:
APP程序是可以的,IAP工程切换芯片后出现的问题。对比两个工程的配置,是一样的。问题出现在哪里呢?想起来IAP切换为N32后,没有自动填充芯片,是我手动添加的:
重新设置一次芯片为N32,自动填充了芯片描述,再次下载就正常了。
10. warning: #14-D: extra text after expected end of preprocessing directive
编译程序时出现一下警告:
警告:#14-D:预处理指令预期结束后的额外文本。查看警告的位置:
容易看出,else后面,不应该有其他东西了,应该写为:
#ifdef IOTBOX_TYPE_SCOOTER
#include "nbbus_scooter_parser.h"
#else
#include "nbbus_can_parser.h"
#endif
警告就消除了。但这与初衷并不一致,后续可能有很多个TPYE,分别对应不同的头文件,正确的用法应该是:
#if defined (IOTBOX_TYPE_SCOOTER)
#include "nbbus_scooter_parser.h"
#elif defined (IOTBOX_TYPE_EBIKE_B100)
#include "nbbus_can_parser.h"
#endif
这个警告,算是C语言基础不够扎实吧,与keil环境没啥关系。
11. 分析偶现问题–不重启进行仿真
有时程序出现问题,想要仿真查找下原因。但keil默认点击仿真会对MCU进行复位重启。那么如何保护现场,不重启进行仿真呢?
一共需要进行四处设置。取消三个地方的勾选:
创建一个load.ini文件,内容只有一句话:
LOAD %L INCREMENTAL
然后在keil魔术棒中加载这个文件:
设置就完成了。这时就可以使用jlink连接出现问题的设备,点击仿真进行查看了(务必要先在正常设备上测试,避免失误破坏掉现场)。MCU并不会复位,但是我们可以正常打断点、查看寄存器或者变量,进而分析问题。
参考链接:stm32 keil下不重启进行仿真寻找bug原因。
以上是关于Keil/MDK:使用过程中的一些设置的主要内容,如果未能解决你的问题,请参考以下文章