完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
HALO,在大学里,我正在开发一个数据记录器,它存储GPS原始数据,通过GPRS调制解调器将数据发送到服务器。我使用的是PIC32 MX795F512L。在我的项目中,我正在克服最严重的错误。直到看门狗定时器重置uController,一切正常工作数小时或数天。我能够将问题跟踪到某种缓冲区溢出-地址错误异常。在某些情况下,在代码的某个地方,某些数据被写入错误的地址,并覆盖了其他数据,从而导致在另一时间重置wdt。如果错误仅在数小时或数天后实时发生,您将如何尝试找到错误的代码段?任何想法都值得赞赏!谢谢你,亚历克斯
|
|
相关推荐
13个回答
|
|
|
如果你知道哪一个异常被触发,你可以假定有某种处理程序吗?使用调试器,或者转储寄存器以找出触发异常的地址,检查调用堆栈以找出正在执行的代码(lr寄存器保存当前返回地址)等等。
|
|
|
|
|
|
当你发现bug时,它们是你用来掩盖红脸尴尬的吗?
|
|
|
|
|
|
嗨,每次uController“启动”时,我都会读“原因寄存器(CP0寄存器13,选择0)”,对于我愚蠢的问题感到抱歉,但是在uController的本质中,我完全没有经验。我试图弄清楚如何使用异常处理程序。
|
|
|
|
|
|
你使用RTOS吗?他们中的大多数有能力检查堆栈溢出,系统堆栈和任务栈。这是通过用模式填充堆栈来完成的,这样你就可以看到这个模式已经被覆盖了多少。它们还允许您检查任务状态和分配的内存。您可以向malloc中添加一个瘦包装器并释放它,然后计算分配的数据并将其添加到每个日志中。这样,您就可以看到分配的数据块是否不断增加或停留在预期的数量。/ Ruben
|
|
|
|
|
|
你使用RTOS吗?他们中的大多数有能力检查堆栈溢出,系统堆栈和任务栈。这是通过用模式填充堆栈来完成的,这样你就可以看到这个模式已经被覆盖了多少。它们还允许您检查任务状态和分配的内存。您可以向malloc中添加一个瘦包装器并释放它,然后计算分配的数据并将其添加到每个日志中。通过这种方式,您可以看到所分配的数据块是否继续增加或保持在预期的数量上。/Ruben或者更多,通过语法检查器(如PCLint)运行代码,PCLint知道XC32语法。它将分析您的代码,并找出所有它不太正确的地方,并导致这种神秘的问题。
|
|
|
|
|
|
哈罗,我已经编写了我自己的异常处理程序。到目前为止,很好。现在我有总线错误例外,这取决于我在代码中的变化,在不同的广告上。我已经搜索并检查了所有的间隙。仅使用一个带有SRS FSRLSL的IPL 7设置为7。仍然有这些总线错误。终端上的一个示例输出是:ErroEPC从一个案例到另一个案例的变化。BavaDress大部分在同一个领域,但老实说,我不知道如何使用BADADADR信息。它告诉我,向量指向哪里,但是它没有告诉我为什么它指向错误。我说的对吗?非常感谢你的帮助。
|
|
|
|
|
|
我想我有一个可以隐藏错误的云。在我的代码中,我有一个我的传感器每隔1-30秒传送大约300个随机六字节的数据。为了收集数据,我使用一个UART中断例程,它把数据保存在BufferGlobal中并计数。每次我把数据保存在sd卡上的文件中,我都会再次通过via擦除缓冲区。也可以买一些东西????当我清除这个缓冲区时,我会如何覆盖其他代码?
|
|
|
|
|
|
你需要展示你所有的代码。显示的两个片段引用完全不同的数组。
|
|
|
|
|
|
缓冲区是字节缓冲区。如果你使用它通过指针存储单词,你可能会遇到问题。1。缓冲区必须与所使用的数据项的大小对齐。2.指针必须是指向适当的16或32位值的指针。
|
|
|
|
|
|
EPC持有触发异常的指令的地址。没有其他上下文保存总线错误。根据地址可以确定正在执行的代码行,如果异常处理代码保存了GPR,则可以尝试找出它试图访问的内存以及为什么要访问内存。对齐问题将导致地址错误异常。
|
|
|
|
|
|
对不起,我不精确的问题。当我声明并初始化一个全局:链接器在RAM中保留100字节。如果我现在保存一个字节数组“Hallo World”在我的程序的开头,该数组将永远保持不变,直到重新启动?还是有可能,在程序的某个时候,由于优化器或其他原因,内存/地址被共享,并且它的内容可能被共享地址的其他变量部分覆盖?下面是我的程序中的相关代码片段:GPS流到PIC32的字节数。每当接收到一个字节时,定时器1标志被清除。一旦Byte流停止,定时器1就启动并设置一个标志,该标志表明流已经结束,并且所接收的字节可以被处理并保存到sd卡上的文件中。之后,我调用重置缓冲区。我怀疑,在程序的某个时候,函数调用:覆盖其他变量,因为在内存中共享相同的地址。当需要使用这个“重写”变量时,它会导致错误。
|
|
|
|
|
|
用于全局变量或静态变量的内存将不用于其他变量。用于自动变量的内存是从堆栈分配的,当变量超出范围时将重新使用。
|
|
|
|
|
|
如果缓冲区被定义为全局变量,那么没有其他变量可以占用它的地址空间。不确定这是导致问题的原因,但是……您还应该设置、清除硬件寄存器中的可以在中断(具有不同优先级)和主代码之间共享的反转位,尤其是中断标志,带有PIC32的SET、CLR和IV偏移。IFS0CLR=IIFS0T1IFIM掩模代替IFS0BIT。T1IF=0。由于...位=n不是原子性的,所以很难找到很少出现的bug。还要确保isrs的IPL设置与中断源的设置匹配。
|
|
|
|
|
只有小组成员才能发言,加入小组>>
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
473 浏览 0 评论
5793 浏览 9 评论
2334 浏览 8 评论
2224 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3530 浏览 3 评论
1123浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
1095浏览 1评论
我是Microchip 的代理商,有PIC16F1829T-I/SS 技术问题可以咨询我,微信:A-chip-Ti
873浏览 1评论
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
475浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 01:29 , Processed in 0.794278 second(s), Total 66, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
675