青风带你学蓝牙:仿真调试错误定位.pdf
文本预览下载声明
3.3 工程项目的仿真与调试
3.3.1 仿真工具的选择与设置:
由于目前在WIN 系统中NRFgo Studio 下载协议栈仅仅支持JLINK 仿真器,
因此我们调试中也选取这款仿真器。
在 MDK 的 Options forTarget‘target1’中打开工程设置选项框,点击Debug
选择框。设置仿真器的选项。点击选择硬件仿真:jlink/J-Trace Cortex,同时勾选
Runto main( )。如下图所示,然后点击settings 设置:
如果仿真器和设备连接好后,点开settings后会弹出一个选项框,选择在
Debug框左边显示仿真器的类型,驱动版本等信息。由于nRF5x系列处理器只
提供SWD仿真接口,因此Port选择SW 模式,如下图所示。如果设备和仿真器
连接成功提示发现硬件内核的IDCODE和Device Name。
切换到 FASH Download 选项,选择相应的器件的 FLASH 大小,我们选
择 2M FLAHS
以上设置好后就可以下载并且仿真了。
3.3.2 项目仿真错误定位
为了检测我们编写的程序是否正常,在MDK keil 上通过jlink 可以实现硬件
的在线仿真。但是很多编程者编写的程序在仿真时出现跑飞或者出错状态,却不
知道如何找出错误的原因。为了解决这个问题,nRF5x 系列处理器在软件包中提
供了错误检查机制。这个机制的核心就是APP_ERROR_CHECK(err_code)函数,也
就是错误码检测方式。本节将详细讲述如何使用这种方式找出自己程序中出现错
误原因。
其实APP_ERROR_CHECK(err_code)这句话就是Nordic 为了方便使用者快速定
位到错误的地方。APP_ERROR_CHECK(err_code)函数适用于目前所有 SDK开发包。
在这里以蓝牙工程样例为例讲解仿真调试过程。
找 到 该 函 数 内 部 定 义 , 当 设 置 了 DEBUG 时 : 执 行
app_error_handler((ERR_CODE), __LINE__, (uint8_t*) __FILE__); 否 则 执 行
app_error_handler((ERR_CODE), 0, 0);
程序最终会运行进入 app_error.c 中的 app_error_handler 函数。关注两
个形参:
uint32_t line_num 和const uint8_t * p_file_name ,两个形参一个是定位错误的行
数,一个是定位错误的文件的名称。如果我们没有宏定义DEBUG,那这两个参
数全部设置为0,也就是不能定位。否则设置为__LINE__和(uint8_t*) __FILE__,
那么就可以进行错误定位了。app_error_handler 函数定义如下图所示:
为了在仿真调试时,能够快速定位错误出现的位置,我们就需要定义一下宏
DEBUG,打开工程的Options forTarget 选项框,在Define 中输入宏定义DEBUG,
注意和之前的定义通过空格或者逗号隔开。输入如下图所示:
为了验证我们的仿真器调试方法,我们设置一个错误名称定义,蓝牙数据
包最多为 31 个字节,程序中如果广播超过了31 个字节,比如蓝牙名称过长太
长或者UUID 过多, 则会造成调用了APP_ERROR_CHECK(err_code)就会出现复位
的情况,进入错误提示中。 这里我们改成一个较长的蓝牙名称,如图所示,修
改完这两个地方了以后编译烧写程序进入芯片。
点击仿真debug 选项,如下图所示,进入仿真状态:
仿真中设置多个断点。如何断点前的程序无错误,那么直接点击运行至断
点按钮,程序会运行到断点停下来,在断点处出现黄色三角号,表明之前的运行
正常。如下图所示:
如果点击运行至断点按钮,程序一直无法再断点处停下来,不出现黄色三角
标号。此时表示程序已经出错跑飞。我们点击红色x 按钮,停止运行。程序会在
错误处停下来。
程序果然已经进入到了 app_error_handler 函数的死循环中,此时可以通过
形参进行定位错误点了:
把鼠标放到形参上,点击鼠标反键,在下拉框中点击添加到窗口,使用ke
显示全部