就比如我现在接手的一个项目,总是会出现串口通信错误,我也知道这是两次数据发送混乱了,但就是很难解决,为什么?因为通信是时时刻刻发生的,而你却不知道会在哪一刻发生错误。即使你一直处于在线调试状态,按照一般的调试手段,你也只能通过 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)