完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我正在努力解决一个已经耗费了我两天生产工作的问题。对于那些对试图复制这个问题感兴趣的人来说,我已经将完整的项目附加在一个.zip文件夹中。所附项目中的代码是整个项目的精简版本,包含与所讨论的问题相关的代码。LVES通过UART接收数据并根据接收到的数据执行某些功能。软件FIFO缓冲区用于临时存储接收的数据以进行处理(因为硬件FIFO对于接收数据的速率来说太小了)。通过使用中断例程,使用接收的数据填充软FIFO。在尝试构建项目时(在调试和发布模式下),我遇到了一个非常特殊的问题。首先,我认为下面描述的问题是由于硬件问题(错误的PICkit3),但是即使我使用模拟器而不是PICkit3,问题仍然存在。然后,我研究了可能的MPLAB X问题,但是相同的问题仍然存在于MPLAB X的多个版本中(我已经用v4.05、v4.15和v4.20对此进行了测试)。我也在Windows 7和Windows 10中进行了测试,结果完全相同。在进一步的研究之后,我将其缩小到软FIFO和main.c中的main()函数。NG(对于PICtiT3和模拟器),整个构建过程只是悬而未决。通过终止“cc1.exe”进程,必须在Windows任务管理器中手动销毁。经过两个多小时的尝试和构建之后,我认为得出这样的结论是相当安全的,即它根本不会完成构建。问题的明显原因似乎与如何定义和声明variablefifoFlagBufEmptyis有关。如果我将“volatile”指定符从其定义中删除:则项目构建完美,调试器开始执行代码。如果将“volatile”指定符放回去,则生成将再次挂起并且永远不会完成。更奇怪的是,当我在while块中注释掉以下两行中的任何一行时:项目完全生成并开始正常执行(就像我删除“volatile”指定符一样)!我完全没有理由解释为什么会这样。最令人沮丧的问题是我在另一个使用另一个PIC(PIC32MX664F128H)的项目中拥有与软FIFO完全相同的定义和使用,而且它在那里工作得很好。谁能帮我解决这个问题,并指出为什么会发生这种情况?
|
|
相关推荐
7个回答
|
|
我不确定您为什么有这些确切的问题,但是您似乎没有正确地使用易失性限定符。在中断服务内修改并在服务外读取的任何变量都必须标记为易失性。SOFT_FIFO结构中的变量都没有标记易失性,只有单独的标志,这意味着您的代码最有可能无法正确运行。
|
|
|
|
谢谢你的回答。我没有意识到,StftFIFO结构中的成员也需要标记为易失性。这可能解释了我正在追寻的完全不同的错误。不过,我想我已经找到了罪魁祸首。变量从不初始化,只声明在主()中。出于某种原因,编译器不喜欢这个。如果我只是初始化这个变量(例如,0),那么它就构建好了!了解这里到底出了什么问题还是很有意思的。
|
|
|
|
这可能是因为你从来不以任何有意义的方式使用变量。没关系,但是可能触发了编译器优化器的一些异常部分,这有点儿错误。
|
|
|
|
我不知道为什么编译器会挂断。但是,看看你处理FIFO的方式,我认为GeByTE()不具有中断安全性。请记住,当内存位置在C中被修改时,编译器会生成读修改写代码。如果在读和写同一个变量之间出现中断,新的数据可能会丢失。这并不是一个很好的解决方案,而且我确信还有更优雅的方法,尽管如此,尝试一下,看看它是否改进了什么。
|
|
|
|
谢谢你的评论,AsCH0866。你提出了一个非常有趣和重要的观点。因此,换句话说,您所建议的实质上是在调用getByte()之前禁用所有中断,然后直接重新启用所有中断?感兴趣的是,如果当中断被禁用时发生了会引起中断的事件(比如通过UART接收字节),会发生什么?这也不会导致新数据在中断中断时丢失吗?还是在中断重新启动后立即触发中断?
|
|
|
|
我认为在PIC32 MX250F128B中的FIFO接收缓冲器是8级深的。因此,只要不禁用中断太长时间,您应该能够在禁用中断时恢复所有数据。如果已经填充了所有8个缓冲区,并且第9个字节进入,那么您将得到一个缓冲区溢出错误(UxSTA寄存器中的OERR位)。RX ISR的一个很好的实现应该读取UxRXREG,保存数据,直到UXSTA寄存器中的URXDA位是清晰的。使用你的代码作为一个例子,我可能会做这样的事情:
|
|
|
|
它不需要是所有中断,只涉及特定共享变量中的中断。
|
|
|
|
只有小组成员才能发言,加入小组>>
5244 浏览 9 评论
2035 浏览 8 评论
1955 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3209 浏览 3 评论
请问电源和晶体值之间有什么关系吗?PIC在正常条件下运行4MHz需要多少电压?
2260 浏览 5 评论
779浏览 1评论
672浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
598浏览 1评论
PIC Kit3出现目标设备ID(00000000)与预期的设备ID(02c20000)不匹配。是什么原因
682浏览 0评论
579浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 11:26 , Processed in 1.381000 second(s), Total 60, Slave 54 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号