0. 概述

本文主要记录一些开发过程中,在keil环境上进行的设置,不涉及具体芯片,不定期更新。
在这里插入图片描述
keil各版本下载:点击进入
2032年注册机下载:点击进入

一、界面显示、操作相关

1.1 背景颜色设置

keil默认是白色背景:在这里插入图片描述
看久了比较刺眼睛,可以设置成相对护眼的颜色。方法如下:
在这里插入图片描述
这里搞一个自定义颜色:
在这里插入图片描述
除了下图标出的两项,需要依次进行设置:
在这里插入图片描述
参考链接:Keil 保护视力背景颜色设置

1.2 界面混乱出错

有时界面会出现问题,编译、下载栏一栏显示成了打开、保存。点击会正常编译、下载,但非常怪异,重新打开keil并不能解决:
在这里插入图片描述
可以通过reset解决:
在这里插入图片描述
最好选择restart,reset并不能解决:
在这里插入图片描述

1.3 双击工程无法打开map文件

在这里插入图片描述
重新选择一下map文件的路径就好了

1.4 部分函数无法跳转 - 未解决

在这里插入图片描述

二、编译相关

2.1 设置编译生成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文件,更方便取用。

bin文件变成了bin文件夹 – 未解决

attribute一文中遇到了这个问题。搜索到的相关回答先放在这里:

  1. 添加链接描述:测试生成的bin文件非常大,120M
  2. 添加链接描述
  3. 添加链接描述

2.2 生成预编译文件 - 查看宏定义的展开

程序中经常使用到宏定义来实现一些简单的计算公式,减少函数调用跳转。有时考虑不周,宏定义展开后可能会导致一些异常,这种异常比较难以查找。
又或者Protothread,为了便于理解,最好查看展开后的代码。
宏定义替换是在预编译阶段,keil中可以通过设置,生成宏展开后的.i文件:
在这里插入图片描述
此时工程目录Listings文件夹下只有两个文件:
在这里插入图片描述
重新编译工程,即可.i生成:
在这里插入图片描述
这里以Protothread为例,源文件tasknbbus.c中:
在这里插入图片描述
查看PT_BEGIN宏定义如下:
在这里插入图片描述
我们打开tasknbbus.i文件,找到bms_nbbus_entry函数,可以看到:
在这里插入图片描述
更方便理解Protothread实现机制。

2.3 编译提示object file renamed from

编译时出现如下提示
在这里插入图片描述
在keil中的project目录中,删除重名的文件。在工程文件夹中也删除了源文件。clean之后rebuild,仍然无效。
在这里插入图片描述
百度了一下(点击进入),将涉及的文件全部设置为不编译:
在这里插入图片描述
设置后进行编译,工程报错不必理会。编译完成后,再重新将文件加入到编译,再次编译。测试了下,不管用。可能每个人的情况还是有些差异的。最终按照评论解决,直接删除Objects文件夹,然后rebuild。

2.4 *** Target ‘ ‘ uses ARM-Compiler ‘V6.14‘ which is not available

使用一个参考工程时无法编译:
在这里插入图片描述
查看选择了更高版本的6.16:
在这里插入图片描述
也可以安装6.14,参考链接:手把手教你升级Keil MDK的ARM编译器

支持更多编译等级

在这里插入图片描述

2.5 预编译命令: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环境没啥关系。
在另一篇STM32打印log的6.3节同样有提到。

2.6 IROM1限制flash失败 – 未解决

在这里插入图片描述
28K = 0x7000
在这里插入图片描述
.\ChargeBox\ChargeBox.axf: Error: L6407E: Sections of aggregate size 0x10 bytes could not fit into .ANY selector(s).
在这里插入图片描述

三、仿真、下载相关

3.1 更换芯片后无法下载

原本是STM32的工程,修改为N32后,无法下载:
在这里插入图片描述
APP程序是可以的,IAP工程切换芯片后出现的问题。对比两个工程的配置,是一样的。问题出现在哪里呢?想起来IAP切换为N32后,没有自动填充芯片,是我手动添加的:
在这里插入图片描述
重新设置一次芯片为N32,自动填充了芯片描述,再次下载就正常了。

3.2 分析偶现问题–不重启进行仿真

有时程序出现问题,想要仿真查找下原因。但keil默认点击仿真会对MCU进行复位重启。那么如何保护现场,不重启进行仿真呢?
一共需要进行四处设置。取消三个地方的勾选:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

创建一个load.ini文件,内容只有一句话:

LOAD %L INCREMENTAL

然后在keil魔术棒中加载这个文件:

在这里插入图片描述
设置就完成了。这时就可以使用jlink连接出现问题的设备,点击仿真进行查看了(务必要先在正常设备上测试,避免失误破坏掉现场)。MCU并不会复位,但是我们可以正常打断点、查看寄存器或者变量,进而分析问题。

参考链接:stm32 keil下不重启进行仿真寻找bug原因

3.3 无法运行

在这里插入图片描述
重新下载boot

四、其他

4.1 预定义宏

STM32打印log的6.3节有提到。

FILE,__LINE__宏我们一般用来输出调试信息,以便于检查输出文件的信息位置,其值是一个字符串。
例如:printf(“File:%s,Line:%s,value=%d\n”, FILE,LINE,number);
通过这个信息输出,我们就清楚的知道,在哪一个文件哪一行,变量number此时的数值是多少。
DATE,__TIME__宏,一般组合起来使用,输出一个工程编译信息。
例如:printf(“File:%s,Line:%s \n”, __ DATE , TIME __,);
通过这个信息输出,我们就知道该文件是什么日期和时间编译的。

4.2 *** Target ‘S32k_app1’ uses ARM-Compiler ‘V5.06 update 6 (build 750)’ which is not available.

编译以前的工程:
请添加图片描述

安装ARM-Compiler ‘V5.06 update 6 (build 750)’:点击进入
ARM编译器官网下载、安装:点击进入

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐