查看原文
其他

KEIL 调试的 ini 文件有什么用?

鱼鹰Osprey 鱼鹰谈单片机 2021-02-01


导读:相信不少道友在使用 KEIL 软件的时候,看到过添加 .ini 文件的过程,那个时候往往是为了解决一个问题,按照教程一步一步设置的,但是,你真的有理解过文件内这些语句的含义吗?

就像关注鱼鹰的公众号时回复的那段话一样,“按着正确的步骤的确可以得出正确的结果,但如果加以改动,仍然得出正确的结果,这其中的原因是什么?……”,我们只是在按部就班的设置,但是从没想过为什么要这么做。而当你花时间去了解背后的原因时,你就会发现,原来背后隐藏着一个大宝藏。

说实话,鱼鹰也只是一个普通人,当初在完成了自己想要的功能时,就没有再去深究背后的原理。所以这么多年以来,鱼鹰都没有去研究背后的东西,直到工作之后,越来越觉得目前掌握的调试手段太过单一,因为到目前为止,我所掌握的调试手段基本上是静态分析,根本无法进行动态分析,所以一直想找到一个合适的动态分析方法。

在初学者眼里,我掌握的调试手段很多,也写了多篇关于调试的文章,但是我却一直都知道自己调试手段的局限性、单一性,碰到复杂的问题还是很难解决。

就比如我现在接手的一个项目,总是会出现串口通信错误,我也知道这是两次数据发送混乱了,但就是很难解决,为什么?因为通信是时时刻刻发生的,而你却不知道会在哪一刻发生错误。即使你一直处于在线调试状态,按照一般的调试手段,你也只能通过 Watch、Memory 之类的调试手段获得一些发生通信错误的那一刻的数据,但是之前的数据却早已淹没在时间长河里,你不知道在发生通信错误之前发生了什么,而往往通信错误之前的历史数据才是重中之重。

所以如何记录调试过程中的历史数据就显得至关重要了。为什么我对 ITM 调试情有独钟,就是因为它能把历史数据都记录下来,而不是简单的记录当前数据。如果说通过 Watch、Memory 得到的数据是一个点,那么通过 ITM 的记录就是一条线了,而多个数据的记录就变成了面。有点有面才是完整的调试过程

但是偏偏不凑巧的就是,虽然知道了 ITM 调试,但是公司用的 CMSIS-DAP 调试器根本不支持这个功能,这就让我很是为难。明明掌握着强大的调试功能,却因为硬件原因不能使用,也是无奈了。

正因为如此,机缘巧合之下开始认真学习 KEIL 的调试知识,发现里面别有一番天地。了解了它们,发现调试变得简单了许多。

废话不多说,接下来进入正题:ini 文件的使用。

说起来,本文的重点不应该是 ini 文件,而是文件内的内容,文件只是一个载体,你可以输入任何文件名,只要你的文件后缀是.ini 就行,而这个后缀也只是因为 KEIL 能识别才这样写,事实上它和.txt 文件没啥区别。

怎么用?就如前面的文章所说,按需要添加你的文件即可。

通过添加按钮你也可以知道,它识别的文件类型就是.ini,所以你别把它看的太神秘,最为重要的是文件的内容。

那么文件内该写什么内容比较好呢?

这个就随你需要了,它相当于一个额外的.c 文件,可以实现如单片机程序的绝大多数事情,比如读取 IO,读取寄存器,读取内存,操作寄存器,写入内存等等,更多详细的内容我在前面的章节说过,看官方的在线帮助文档即可。

这个.ini 文件不会下载到单片机中,而是由 KEIL 运行处理的,所以并不会占用单片机的内存。

如果你将.ini 文件添加到初始化文件中:

那么在 KEIL 进入调试模式的时候,会自动加载这个文件,并执行里面的内容,也就是说它是先于单片机程序执行的。这个你可以通过 Command 窗口了解到:

也就是说使用 .ini 文件和和你手工在 Command 窗口输入命令没啥区别,但是使用文件的话你可以将你常用的命令保存下来,每次进入调试模式的时候就会自动加载这些命令了,不需要重复输入相同的命令。

但是要注意的是,因为这些命令只有在进入调试模式下才会加载,所以如果你的命令功能需要在离线(脱离调试器)情况下正常使用,那么你的功能需要在单片机代码上实现才行。

当你添加文件后,你可以点击项目这个按钮进行编辑:


当然你也可以直接像打开 txt 文件一样打开这个文件。

而你会发现,和写 C 程序一样,你也可以使用 // 来进行必要的注释,当然 /**/ 也是可以的。

前面我说过,ini 类似于一个 c 文件,那么它应该能进行编译才对,还真的可以。这个知识点相信很少人知道,就是在调试模式下,有一个菜单,通过它你就能打开一个窗口:

窗口如下:

当你编写完毕之后,就可以使用那个按键编译,编译结果将显示在下面的小框里面,注意如果有多个错误,需要一个一个排除;另外还要注意的是,指针的使用必然会报错,因为它毕竟不是真正的 C 语言代码,并不支持指针。

还有要注意的就是,编译也相当于运行命令,它们是先后执行的,比如说你的.ini 文件用命令定义了一个按键,那么在你点击编译之后,立马就会跳出一个按键,就是因为执行了这个命令导致的。

关于.ini 文件应该算是比较系统的讲解了一下,内容不多,但是对调试很有帮助,希望好好掌握。

下周预告:KEIL 中的配置向导(Configuration Wizard)


推荐阅读:

为什么说你一定要掌握 KEIL 调试方法?

打了多年的单片机调试断点到底应该怎么设置? | 颠覆认知

KEIL调试那些事儿之基础调试(一)

KEIL 调试那些事儿之窗口展示——变量(二)


-THE END-



如果觉得文章对你有帮助,欢迎转发、分享给朋友,感谢你的支持!


如果对本文有问题,欢迎留言!即使没有问题也可以留下走心评论。


如需转载请联系我。


微信公众号「鱼鹰谈单片机

每周一更单片机知识

长按后识别图中二维码关注


    这位道友,请留步,点完再走可好

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存