8帖/ 0新
最后一篇
离线
最后一次露面:3年10个月前
加入:2014年9月2日09:54
调试下载出错的问题

官网下载的SDK5.04没改动过,编译ble_app_security工程,调试下载出现以下问题:

如果(DEVELOPMENT_DEBUG)
{
wdg_freeze();//停止WDOG
SetBits16(SYS_CTRL_REG,DEBUGGER_ENABLE,1);//使调试器能够重新连接

*(挥发性无符号长*)(STATUS_BASE)= hardfault_args [0];// R0
*(挥发性无符号长*)(STATUS_BASE + 0×04)= hardfault_args [1];// R1
*(挥发性无符号长*)(STATUS_BASE + 0×08)= hardfault_args [2];// R2
*(挥发性无符号长*)(STATUS_BASE + 0x0C)= hardfault_args [3];// R3
*(挥发性无符号长*)(STATUS_BASE + 0×10)= hardfault_args [4];// R12
*(挥发性无符号长*)(STATUS_BASE + 0×14)= hardfault_args [5];// LR
*(挥发性无符号长*)(STATUS_BASE +为0x18)= hardfault_args [6];// 个人电脑
*(挥发性无符号长*)(STATUS_BASE +为0x1C)= hardfault_args [7];// PSR
*(挥发性无符号长*)(STATUS_BASE + 0x20的)=(无符号长整数)hardfault_args;//堆栈指针

*(挥发性无符号长*)(STATUS_BASE + 0X24)=(*((挥发性无符号长*)(0xE000ED28)));// CFSR
*(挥发性无符号长*)(STATUS_BASE + 0×28)=(*((挥发性无符号长*)(0xE000ED2C)));// HFSR
*(挥发性无符号长*)(STATUS_BASE + 0x2c上)=(*((挥发性无符号长*)(0xE000ED30)));// DFSR
*(挥发性无符号长*)(STATUS_BASE +的0x30)=(*((挥发性无符号长*)(0xE000ED3C)));// AFSR
*(挥发性无符号长*)(STATUS_BASE + 0x34)=(*((挥发性无符号长*)(0xE000ED34)));// MMAR
*(挥发性无符号长*)(STATUS_BASE + 0x38)=(*((挥发性无符号长*)(0xE000ED38)));// BFAR

如果((GetWord16(SYS_STAT_REG)DBG_IS_UP)== DBG_IS_UP)
__asm( “BKPT#0 \ n”);//调试下载死在这里
别的
{
而(1);
}
又试了下SDK5.04的其他工程。app_sleepmode编译调试下载没出现这个问题,一切正常这个问题是咋回事?

关键词:
设备:
Gongyu_Dialog
离线
最后一次露面:1周4天前
加入:2016年4月27日07:07
我在演示板上跑,没问题啊。是怎么出现问题的

我在演示板上跑,没问题啊。是怎么出现问题的?广播包能看到吗?

离线
最后一次露面:3年10个月前
加入:2014年9月2日09:54
不知道怎么出现的,有时候也会出这种问题,换一块板又好了

不知道怎么出现的,有时候也会出这种问题,换一块板又好了

Gongyu_Dialog
离线
最后一次露面:1周4天前
加入:2016年4月27日07:07
我想是不是没接闪?bond_db

我想是不是没接闪?bond_db_init函数需要和闪光灯进行交互

Gongyu_Dialog
离线
最后一次露面:1周4天前
加入:2016年4月27日07:07
出问题的时候,你把*(挥发性无符号

出问题的时候,你把*(挥发性无符号长*)(STATUS_BASE + 0×14)= hardfault_args [5];// LR
*(挥发性无符号长*)(STATUS_BASE +为0x18)= hardfault_args [6];// 个人电脑

这两个值拿到,回到地图文件,看看落在哪个函数里

离线
最后一次露面:3年10个月前
加入:2014年9月2日09:54
谢谢。

谢谢。
这几个寄存器:
LR 0xFFFFFFF9
PC 0x200005F0
SP 0x20009738
地址在地图上没找到啊。

Gongyu_Dialog
离线
最后一次露面:1周4天前
加入:2016年4月27日07:07
需要拿的是之前保存的LR和PC,直接从地址“状态

需要拿的是之前保存的LR和PC,直接从地址“STATUS_BASE + 0×14”里找。而不是停在NMI_HandlerC里直接从寄存器获取的值。
*(挥发性无符号长*)(STATUS_BASE + 0×14)= hardfault_args [5];// LR
*(挥发性无符号长*)(STATUS_BASE +为0x18)= hardfault_args [6];// 个人电脑

从映射文件里找,地址只会落在某个函数里的范围。所以能确定是哪个函数引起的“。
如果要找对应行,需要在汇编文件里找。

用的fromelf .RC ./***.axf> code.asm生成汇编

(fromelf.exe可以在\ Keil_v5 \ ARM \ ARMCC \ BIN里面找到)

离线
最后一次露面:3年10个月前
加入:2014年9月2日09:54
谢谢帮助。

谢谢帮助。