当发送写而没有响应时,固件崩溃

14个帖子/ 0新
最后发表
gcblair
离线
最后看到:5年1个月前
主
加入:2014-09-08 21
当发送写而没有响应时,固件崩溃

你好,

我正在尝试使用TRIET发送从平板电脑到我们的固件的数据,而无需响应。
当我发送超过1200字节时,固件就崩溃了。调试器停止,所有核心寄存器都被设置为0,并且调用堆栈为空

我们所做的是,我们发送200字节,然后读取一个特征,告诉我们如果数据到达或没有。然后我们发送下一个200个字节。
我看不到任何寄存器或处理程序可以帮助我调试这种情况。

知道如何调试或修复它吗?我们的项目正处于关键时期。

布莱恩
离线
最后看到:6年5个月前
专家 主
加入:2014-10-16 18:10
你用的是Windows 8吗?我得到了

你用的是Windows 8吗?我得到了和你一样的行为,但原因不同。我认为它是由来自未对齐内存的STRH指令引起的。这应该会导致一个硬故障,而不是一个完整的重置崩溃,而在Windows 7上工作时,我得到了硬故障。是的,编译器应该对齐内存,但有些地方出错了。

gcblair
离线
最后看到:5年1个月前
主
加入:2014-09-08 21
我用的是windows 8,是的。这是

我用的是windows 8,是的。这是一个严重的问题,因为我不可能调试它。我得到的唯一信息是问题是一致的。
我可以试着找到一台windows 7的机器-但为什么你认为我在windows 8上不会得到一个硬故障?它们之间有那么大的区别吗?

gcblair
离线
最后看到:5年1个月前
主
加入:2014-09-08 21
我试过windows 7,

我试过windows 7,结果完全一样!

布莱恩
离线
最后看到:6年5个月前
专家 主
加入:2014-10-16 18:10
很遗憾听到这个消息。这是

很遗憾听到这个消息。这只是一个猜测,因为这就是我得到的。但是,我根本不明白。但我肯定熟悉这个问题!绝对没有办法发现它也可以调试它。在我的情况下,我有DA14580连接到TERA术语,当发生这种错误时,我只能打印到屏幕上的一堆垃圾;在上传十六进制文件之前,就像一个人一样。我没有在Windows 7上发生这种情况,但这是我的案例在系统初始化时清楚地发生(在它到达App_Init()之前)。你清楚地运行了。我必须说有时我也会在Windows 8上获得硬盘。 Small changes in the organization of this struct make a big difference.

这里还有一些你可以看的东西。我假设您有一些缓冲区来接收写入的数据。检查out/lst目录中的地图。看看它是否刚好在跳转表或其他关键的arch_main之前加载。

首先找一条这样的直线
rwip_rf 0x0008071c Data 0 rom_symdef.txt ABSOLUTE . rwip_rf 0x0008071c

现在查找您的数组。在我的例子中,我所使用的结构是在系统中这些关键任务之前加载的。即使大小正确,如果排列错误,灾难也会发生(显然)。缺点是我一直无法控制系统加载我的数组的位置。我也处于内存耗尽的边缘(我正在编写一个完全托管的中心)。如果那个缓冲区(假设你有一个)位于一些关键的东西之前,比如跳转表堆,看看你能不能在你的缓冲区和那个表之间放置一个更小的缓冲区。您需要在缓冲区中使用一些东西,否则编译器只会将其优化出来(除非您在优化级别0上运行)。

我并不是说这将解决任何问题,但考虑到其他选项(不知道要做什么),它值得一试。

gcblair
离线
最后看到:5年1个月前
主
加入:2014-09-08 21
布莱恩,

布莱恩,

这就是问题所在,我没有缓冲区,它都来自堆栈。数据直接来自堆栈的gattc_write_cmd_ind_handler,我使用attmdb_att_set_value将它保存到数据库中。
在这个过程中,我完全不使用缓冲区。
谢谢你的帮助,布莱恩,希望Dialog的人能在这方面提供更多的帮助。我猜他们对SUOTA也用了同样的方法

ak_dialog.
离线
最后看到:6个月4天前
工作人员
加入:2013-12-16 15:49
你好,

你好,

这可能是由DA14580进入睡眠模式或看门狗定时器跳转引起的。

你在使用睡眠模式吗?看门狗是否使用过?

对话蓝牙支持团队。

gcblair
离线
最后看到:5年1个月前
主
加入:2014-09-08 21
你好,

你好,

看门狗和延长睡眠和深度睡眠模式都被禁用。

ak_dialog.
离线
最后看到:6个月4天前
工作人员
加入:2013-12-16 15:49
嗨,如果你看看我们的代码

嗨,如果你仔细看看我们的代码,你可以看到,为了调试的目的,NMI处理程序(nmi_handler.c)和Harfault处理程序(hardfault_handler.c)将把ARM寄存器(包括PC和SP)转储到内存中。在“崩溃”之后,你可以附加调试器并调查“最后”状态。

对话蓝牙支持团队。

gcblair
离线
最后看到:5年1个月前
主
加入:2014-09-08 21
它在调试器中崩溃

它与调试器附加的调试器崩溃了。
硬故障没有被调用,包括PC在内的所有寄存器都是空白的。
我需要尽快得到这个为客户工作,所以我很高兴给你发送我们的固件和android代码,如果它帮助

gcblair
离线
最后看到:5年1个月前
主
加入:2014-09-08 21
你好,

你好,

我怀疑这是一个堆栈问题,所以我将BLE_CONNECTION_MAX_USER增加到2,这将增加堆栈(#define NON_RET_HEAP_SIZE,#define ENV_HEAP_SIZE #define MSG_HEAP_SIZE)

我现在可以发送我的数据而不会崩溃。
但是,如果我将我发送到3200字节的数据量,当然它崩溃了。它是堆栈内部的内存问题
正如我在原来的帖子中所说,我每200个字节读取该特征,以确保数据已经写入,所以我看不出为什么应该有任何堆栈溢出问题。

你能帮助吗?

gcblair
离线
最后看到:5年1个月前
主
加入:2014-09-08 21
你好,

你好,

在这个问题上我如何得到帮助?已经5天了,你唯一的回应是检查我已经告诉你的东西在我的原帖。

gcblair
离线
最后看到:5年1个月前
主
加入:2014-09-08 21
我解决了这个问题

我解决了这个问题,我没有从处理每次写入数据的任务中返回任何东西。遗憾的是没有错误处理

RvA
离线
最后看到:1个月2周前
工作人员
加入:2014-02-07 14:10
很高兴听到这个问题是

很高兴听到问题解决了。抱歉回复晚了。