你好,
我试图发送一些数据从平板电脑到我们的固件使用写无响应。当我发送超过1200字节的固件崩溃。调试器停止,所有核心寄存器都设置为0,调用堆栈为空
我们要做的是,我们发送200个字节,然后读取一个特征来告诉我们数据是否正确到达。然后我们发送下一个200字节。我看不到任何寄存器或处理程序,可以帮助我调试的情况。
知道如何调试或修复它吗?我们正处于项目的关键时期。
你在Windows 8上吗?我的行为和你一样,但原因不同。我相信这是由于STRH指令来自未对齐的内存。这应该会导致一个硬故障,而不是一个完全重置崩溃,而在Windows7上工作时,我得到的硬故障。是的,编译器应该对齐内存,但是有些地方出错了。
我在Windows8上是的。这是一个严重的问题,虽然,因为它是不可能的,我调试。我只知道问题是一致的。我可以试着找一台Windows7机器,但是为什么你认为我在Windows8上没有硬故障呢?他们之间有那么大的区别吗?
好的,我试了Windows7,结果完全一样!
很抱歉听到这个消息。这只是猜测,因为这就是我得到的。然而,我一点也不明白。但我对这个问题肯定很熟悉!我也完全没有办法调试它。在我的例子中,我将DA14580连接到Tera Term,当这个错误发生时,我得到的只是一堆垃圾被打印到屏幕上;就像上传HEX文件之前得到的一样。我没有在Windows7上发生过这种情况,但这是我的情况,在系统初始化时(在它到达app\u init()之前)就明显发生了这种情况。你显然已经准备好了。我不得不说,有时我也会在Windows8上遇到硬故障。这个结构的组织结构中的微小变化会产生很大的影响。
这里还有一些你可以看的东西。我假设你有一个缓冲区来接收写入的数据。检查out/lst目录中的映射。看看它是在跳转表之前加载的,还是在arch\u main中加载的。
先找一条像这样的线rwip\ U rf 0x0008071c数据0 rom_symdef.txt文件绝对的
现在寻找你的阵型。在我的例子中,我使用的结构是在系统中这些关键任务项之前加载的。即使大小是正确的,如果它被对齐错误的灾难可能会发生(显然)。缺点是我无法控制系统加载数组的位置。我也在记忆枯竭的边缘(我正在写一个完全托管的中心)。如果该缓冲区(假设您有一个)正好位于跳转表堆之类的关键对象之前,请查看是否可以在缓冲区和该表之间插入一个较小的缓冲区。您需要在该缓冲区中使用某些内容,否则编译器将对其进行优化(除非您在优化级别0下运行)。
我并不是说这能解决任何问题,但考虑到其他的选择(不知道该怎么办),这是值得一试的。
布莱恩,
就是这样,我没有缓冲区,所有的缓冲区都来自堆栈。数据直接来自堆栈的gattc\u write\u cmd\u ind\u处理程序,我使用attmdb\u att\u set\u value将其保存到数据库中。在这个过程中,我根本不使用缓冲区。谢谢你的帮助,布莱恩,希望Dialog的人能给我们更多的启示。我猜他们用的是同样的方法
这可能是由于DA14580进入睡眠模式或看门狗定时器跳了进来。
你在用睡眠模式吗?看门狗用了吗?
对话蓝牙支持团队。
看门狗和延长睡眠和深度睡眠模式都被禁用。
您好,如果您查看我们的代码,您可以看到出于调试目的,NMI处理程序(NMI\u handler.c)和Harfault处理程序(hardfault\u handler.c)将转储内存中的ARM寄存器(包括PC和SP)。在“崩溃”之后,您可以访问调试器并调查“last”状态。
它与附加的调试器一起崩溃。不调用硬故障,包括PC在内的所有寄存器都为空。我需要尽快让这个为客户工作,所以我很高兴向您发送我们的固件和android代码,如果它有帮助
我怀疑这是一个堆栈问题,所以我将BLE\u CONNECTION\u MAX\u USER增加到2,这将增加堆栈(#define NON\u RET\u HEAP\u SIZE,#define ENV\u HEAP\u SIZE#define MSG\u HEAP\u SIZE)
我现在可以发送我的数据而不会崩溃。但是,如果我将发送的数据量加倍到3200字节,它当然会崩溃。很明显,堆栈中存在内存问题正如我在最初的文章中所说的,我每200字节读取一次特征,以确保数据已经被写入,所以我不明白为什么会有任何堆栈溢出问题。
你能帮忙吗?
我怎样才能在这个问题上得到帮助?已经过去5天了,你唯一的回复就是查看我在原来的帖子中已经告诉你的一些事情。
我解决了这个问题,我没有从处理每次写入数据的任务中返回任何内容。很遗憾没有错误处理
很高兴听到问题解决了。很抱歉延迟了回复。
你在Windows 8上吗?我的行为和你一样,但原因不同。我相信这是由于STRH指令来自未对齐的内存。这应该会导致一个硬故障,而不是一个完全重置崩溃,而在Windows7上工作时,我得到的硬故障。是的,编译器应该对齐内存,但是有些地方出错了。
我在Windows8上是的。这是一个严重的问题,虽然,因为它是不可能的,我调试。我只知道问题是一致的。
我可以试着找一台Windows7机器,但是为什么你认为我在Windows8上没有硬故障呢?他们之间有那么大的区别吗?
好的,我试了Windows7,结果完全一样!
很抱歉听到这个消息。这只是猜测,因为这就是我得到的。然而,我一点也不明白。但我对这个问题肯定很熟悉!我也完全没有办法调试它。在我的例子中,我将DA14580连接到Tera Term,当这个错误发生时,我得到的只是一堆垃圾被打印到屏幕上;就像上传HEX文件之前得到的一样。我没有在Windows7上发生过这种情况,但这是我的情况,在系统初始化时(在它到达app\u init()之前)就明显发生了这种情况。你显然已经准备好了。我不得不说,有时我也会在Windows8上遇到硬故障。这个结构的组织结构中的微小变化会产生很大的影响。
这里还有一些你可以看的东西。我假设你有一个缓冲区来接收写入的数据。检查out/lst目录中的映射。看看它是在跳转表之前加载的,还是在arch\u main中加载的。
先找一条像这样的线
rwip\ U rf 0x0008071c数据0 rom_symdef.txt文件绝对的
现在寻找你的阵型。在我的例子中,我使用的结构是在系统中这些关键任务项之前加载的。即使大小是正确的,如果它被对齐错误的灾难可能会发生(显然)。缺点是我无法控制系统加载数组的位置。我也在记忆枯竭的边缘(我正在写一个完全托管的中心)。如果该缓冲区(假设您有一个)正好位于跳转表堆之类的关键对象之前,请查看是否可以在缓冲区和该表之间插入一个较小的缓冲区。您需要在该缓冲区中使用某些内容,否则编译器将对其进行优化(除非您在优化级别0下运行)。
我并不是说这能解决任何问题,但考虑到其他的选择(不知道该怎么办),这是值得一试的。
布莱恩,
就是这样,我没有缓冲区,所有的缓冲区都来自堆栈。数据直接来自堆栈的gattc\u write\u cmd\u ind\u处理程序,我使用attmdb\u att\u set\u value将其保存到数据库中。
在这个过程中,我根本不使用缓冲区。
谢谢你的帮助,布莱恩,希望Dialog的人能给我们更多的启示。我猜他们用的是同样的方法
你好,
这可能是由于DA14580进入睡眠模式或看门狗定时器跳了进来。
你在用睡眠模式吗?看门狗用了吗?
对话蓝牙支持团队。
你好,
看门狗和延长睡眠和深度睡眠模式都被禁用。
您好,如果您查看我们的代码,您可以看到出于调试目的,NMI处理程序(NMI\u handler.c)和Harfault处理程序(hardfault\u handler.c)将转储内存中的ARM寄存器(包括PC和SP)。在“崩溃”之后,您可以访问调试器并调查“last”状态。
对话蓝牙支持团队。
它与附加的调试器一起崩溃。
不调用硬故障,包括PC在内的所有寄存器都为空。
我需要尽快让这个为客户工作,所以我很高兴向您发送我们的固件和android代码,如果它有帮助
你好,
我怀疑这是一个堆栈问题,所以我将BLE\u CONNECTION\u MAX\u USER增加到2,这将增加堆栈(#define NON\u RET\u HEAP\u SIZE,#define ENV\u HEAP\u SIZE#define MSG\u HEAP\u SIZE)
我现在可以发送我的数据而不会崩溃。
但是,如果我将发送的数据量加倍到3200字节,它当然会崩溃。很明显,堆栈中存在内存问题
正如我在最初的文章中所说的,我每200字节读取一次特征,以确保数据已经被写入,所以我不明白为什么会有任何堆栈溢出问题。
你能帮忙吗?
你好,
我怎样才能在这个问题上得到帮助?已经过去5天了,你唯一的回复就是查看我在原来的帖子中已经告诉你的一些事情。
我解决了这个问题,我没有从处理每次写入数据的任务中返回任何内容。很遗憾没有错误处理
很高兴听到问题解决了。很抱歉延迟了回复。