Keil/MDK(0):使用过程中的一些设置/问题
目录0. 概述1. 背景颜色设置0. 概述1. 背景颜色设置Keil 保护视力背景颜色设置
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一文中遇到了这个问题。搜索到的相关回答先放在这里:
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编译器官网下载、安装:点击进入。
更多推荐
所有评论(0)