本帖最后由 dffzh 于 2025-4-14 11:24 编辑
#申请原创#
@21小跑堂
一、【Keil】想知道“魔法棒”是什么吗? 使用Keil时,我们会经常通过以下两种方式之一操作魔法棒:
或者
从而进入以下窗口: 该窗口基于Keil5版本V5.36,Keil5以下版本会有差别; 看到这里,读者可能已经知道所谓的“魔法棒”是什么了! 其实就是用来进行相关常用配置的一个窗口的图标,形似魔术师的魔法棒!
那常用配置到底包括哪些呢?下面将通过图片+备注方式简要介绍!
菜单一:“Device”,直译为设备
菜单二:“Target”,直译为目标/对象
菜单三:“Output”,直译为输出
注意: 勾选了“Browse Information”,程序代码才能执行跳转,但代码编译速度会变慢。 菜单四:“Listing”,直译为列表
菜单五:“User”,直译为用户
菜单六:“C/C++”
菜单七:“Asm” ,直译为汇编
现在一般都是用C/C++语言开发,很少用汇编语言,因此该菜单一般不用配置。
菜单八:“Linker” ,直译为链接器
到目前为止,该菜单也没做过任何配置。 菜单九:“Debug” ,直译为调试
硬仿真即为通过仿真器+板子进行实际调试,可以通过“Settings”进行设置:
菜单十:“Utilities” ,直译为实用
到目前为止,该菜单也没做过任何配置。
二、【Keil】变量调试的方法有哪些呢?
在使用Keil进行仿真调试时,会经常需要实时查看某个变量(全局变量、局部变量等)值的变化情况,以此来判断程序是否正常运行或者变量值变化是否正常。 但是,对于全局变量和局部变量,其仿真调试的方法是不一样的,下面进行介绍。 1、全局变量 这里的全局变量包括基本数据类型(整型、浮点型等)和复杂数据类型(结构体、联合体等),也包括数组。
§ 如果需要在全速运行程序期间实时监控变量的数据变化,需要勾选“Periodic Window Update”, 如下图: 打开窗口“Watch Windows”用于存放需要监控的变量: 打开后如下: 会显示变量名称、当前值和变量数据类型; 双击“<Enter expression>”即可将变量拷贝到窗口里,比如如果需要监控main程序是否正常运行,那就可以将自定义的全局变量gRunCount放入窗口里,如下图:
注意:需要暂停运行程序才能执行拷贝操作。 默认显示制式为十六进制,如下图: 去掉勾选即可显示十进制,如下图: 重新运行程序后,当前值填充绿色,说明其值在实时更新,如下图: 如果需要监控全局结构体变量,直接拷贝到窗口里,就可以看到所有成员变量的当前值,如下图: 制式模式对浮点数据类型的设置无效。
如果需要监控全局数组,直接将数组名拷贝到窗口里即可,如下图所示: § 如果需要在全速运行程序期间通过修改某个变量(该变量值不会实时更新)的值来调试程序的运行情况,则可以直接通过输入新值到“Value”窗口里实现(不需要暂停运行程序)。比如需要修改变量WEIGHT_RANGE_MAX的值为20,则可以双击“Value”框后输入新值并按回车键即可:
2、局部变量 这里的局部变量也包括基本数据类型(整型、浮点型等)和复杂数据类型(结构体、联合体等),还包括静态变量(static)。 如果需要在程序运行期间监控局部变量的数据变化,则必须通过设置断点(Breakpoint)进行单步调试的方式执行,即不能在全速运行程序时实时查看局部变量的值变化情况。
如果将局部变量放入监控窗口里,在全速运行程序时,其值会报错,如下图: 当你在变量被使用的代码位置设置一个断点后再运行一次程序,程序运行到断点位置后,就可以看到变量的当前值: 因此,如果真的需要监控函数内部的局部变量的实时变化情况,可以将其临时更改为全局变量,待程序验证无误后再改回去即可。
三、【Keil】如何查看程序运行时间呢? 在嵌入式软件开发过程中,有时候由于产品对实时性要求比较高,此时如果程序运行比较慢的话,那我们可能就要通过一些调试手段对一些程序代码的执行时间进行分析和查看,以确定导致程序运行慢的代码位置。 在使用Keil进行仿真调试时,就有一种比较快捷的方法可以用来实时查看程序,代码,甚至是一条语句的执行时间。详细的操作方法即将揭晓。
1、配置追踪时钟 需要配置追踪时钟为内核时钟,才能保证时间的准确性。
2、打开时间显示窗口 进入仿真后,如果没有打开时间显示窗口,则需要打开: 也可以通过点击按钮打开:
3、查看一段程序的执行时间 可以在程序开始位置和程序结束位置分别设置一个断点, 单步执行两次程序,分别记录两次时间: 时间差=0.14446595-0.14407144=0.00039451s=394.51 us即为程序段执行时间。
4、查看一个函数的执行时间 在需要查看的函数调用位置设置一个断点,然后运行一次程序,记录当前时间: 然后操作单步执行一次,记录第二次时间: 时间差=0.14414995-0.14407178=0.00007817s=78.17 us即为函数bsp_init的执行时间。
5、查看语句的执行时间 如果需要查看一条或者多条语句的执行时间,比如一条for循环语句,一条memcpy操作或者一条排序操作等的执行时间等,其方法与前文描述基本一样,即通过断点操作实现。
补充: 如果你想进一步确认这种时间记录的准确度,可以在需要查看的代码前后通过翻转GPIO口电平并使用示波器测试GPIO电平保持时间的方式来验证,方法如下: 设置GPIO口输出低电平; 设置GPIO口输出高电平; { 示例代码; }
设置GPIO口输出低电平; 运行程序后,通过示波器抓取GPIO口的波形后,GPIO口高电平的持续时间即为示例代码的执行时间。 由于这种方法需要从PCB引线出来,且需要使用示波器,稍微有些麻烦,因此对嵌入式软件开发来说,可以作为一种辅助方法来用。
以上通过图片+备注+文字+个人实操的方式介绍了Keil IDE的常用配置魔法棒介绍,变量调试方法及程序运行时间查看操作,后续会进行Keil更多的实操介绍,希望对初识Keil的开发者朋友们有一些帮助!
|