Keil/MDK:使用过程中的一些设置

Posted 何事误红尘

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Keil/MDK:使用过程中的一些设置相关的知识,希望对你有一定的参考价值。

目录

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:使用过程中的一些设置的主要内容,如果未能解决你的问题,请参考以下文章

如何将keil(MDK)的文件方便的转为IAR

如何将keil(MDK)的文件方便的转为IAR

怎么让keil MDK 不把把宏定义给优化掉了

我安的keil中找不到想要的芯片,啥原因?如何设置keil中的芯片类型?KEIL MDK 与keil c51有啥区别?

开发工具Keil MDK升级至V5.29,有哪些改进?

使用keil5(MDK)软件的一些记录