今天测试自己做的一个串口记录器发现一个有趣的问题,当记录数据达到16M左右的时候,程序就会死在mmc卡多块写的DMA那里等待数据发送完成标志,后来反复的测了几次发现一个诡异的想象。 我是每次上电一次新建一个文件,串口设置为230400.n.8.1,sdio使用4位总线,时钟分频使用5 。记录下的文件通过STM32的USB把记录器作为U盘连接到电脑上显示。先是用串口调试助手满负荷每次发送5.3M左右的测试文件,第一个文件数据不会丢,掉电、上电;第二文件丢掉12K数据(原来我也发现这个,以为是fatfs文件系统在开始往文件里写数据的时候,先去处理文件目录所以会丢失),掉电、上电;第三个文件丢掉头12K数据。掉电上电,第四个文件在发送到13%左右的时候stm32F103会死掉。 当时我以为是因为sdio写文件不够快,导致被串口接收中断占用了太多时间,DMA传输完成标志没有检测到。所以我将sdio改为8位总线,时钟分频使用5。还是用串口调试助手满负荷每次发送5.3M左右的测试文件,第一个文件数据不会丢,掉电、上电;第二文件丢掉12K数据,掉电、上电;第三个文件丢掉头12K数据。掉电上电,第四个文件在发送到13%左右的时候stm32F103会死掉。 当我看到U盘里这么整齐的数据我就有点蒙了,每次都掉电重启的啊,怎么会出现这种情况,后来我想应该是文件长度的问题,所以我弄了个20M左右的文件来测试,发现在发送到77%的时候会死掉。自己算了一下大概也是在16M左右。后来我使用定时发送软件来测试到底是不是由于数据长度的原因导致死机的,定时周期110ms,每次写2048字节,循环发送从00到ff的数据。经过三次测试发现都是在16M左右就会死,我想如果是长度的原因,那应该跟某个数溢出造成的这种异常,我算了一下0xFFFFFF等于16777215(约等于16M),但是奇怪的是定义一个数都是32、16、8位的,从没见过24位的啊。 各位大侠,哪位见多识广,给小弟指点指点,这是为什么呢?这是fatfs文件系统的问题,还是mmc卡的问题,还是sdio,dma的问题呢? |
RE:今天发现一个有趣的问题 stm32f103数据记录器 usb sdio mmc fatfs
RE:今天发现一个有趣的问题 stm32f103数据记录器 usb sdio mmc fatfs
RE:今天发现一个有趣的问题 stm32f103数据记录器 usb sdio mmc fatfs
RE:今天发现一个有趣的问题 stm32f103数据记录器 usb sdio mmc fatfs
1、把死机堆栈拿出来看,到底死在哪个函数里,哪个地方有堆栈、或者溢出;
2、做一个函数调用轨迹跟踪,首先定位死机函数,然后再逐个细化,查找问题点。
我们定位踩内存和死机问题都是这样弄的。
RE:今天发现一个有趣的问题 stm32f103数据记录器 usb sdio mmc fatfs
2,高波特率的串口只适用于两通信芯片非常近的电路,如果传输有一定的距离,那么最大波特率保持在115200以下~
回复:今天发现一个有趣的问题 stm32f103数据记录器 usb sdio mmc fatfs
回复:今天发现一个有趣的问题 stm32f103数据记录器 usb sdio mmc fatfs
哥们, 给你提几个调试建议:
1、把死机堆栈拿出来看,到底死在哪个函数里,哪个地方有堆栈、或者溢出;
2、做一个函数调用轨迹跟踪,首先定位死机函数,然后再逐个细化,查找问题点。
我们定位踩内存和死机问题都是这样弄的。
我使用在线调试,定位到mmc卡多块写函数使用DMA模式的 while (DMA_GetFlagStatus(DMA2_FLAG_TC4) == RESET) {}这里。好像是错过了发送完成标志,但为什么我没搞清楚。
回复:今天发现一个有趣的问题 stm32f103数据记录器 usb sdio mmc fatfs
回复第 5 楼 于2013-12-27 23:00:48发表:
哥们, 给你提几个调试建议:
1、把死机堆栈拿出来看,到底死在哪个函数里,哪个地方有堆栈、或者溢出;
2、做一个函数调用轨迹跟踪,首先定位死机函数,然后再逐个细化,查找问题点。
我们定位踩内存和死机问题都是这样弄的。
我使用在线调试,定位到mmc卡多块写函数使用DMA模式的 while (DMA_GetFlagStatus(DMA2_FLAG_TC4) == RESET) {}这里。好像是错过了发送完成标志,但为什么我没搞清楚。
试试不用DMA,效率虽然低了点,看会不会死机,确定问题点再说
回复:今天发现一个有趣的问题 stm32f103数据记录器 usb sdio mmc fatfs
回复:今天发现一个有趣的问题 stm32f103数据记录器 usb sdio mmc fatfs
1,从楼主的问题上感觉像是驱动接口没有配置正确,主要查看CTRL那个接口.
2,高波特率的串口只适用于两通信芯片非常近的电路,如果传输有一定的距离,那么最大波特率保持在115200以下~
的确是驱动的问题,波特率没问题的,我测试过。
回复:今天发现一个有趣的问题 stm32f103数据记录器 usb sdio mmc fatfs
试试不用DMA,效率虽然低了点,看会不会死机,确定问题点再说
问题找到了,折腾了这么久,看了网上好多说这个的,但都没有完全的说清楚,我自己测才发现,首先SDIO时钟那里设置不能太高,一般用到4或者5,使用DMA时,SD_DATATIMEOUT延时必须加大,将原来的0xffff改为0xfffff甚至更大,这个主要是因为在DMA传输的时候如果这个值不设置大一点会在SDIO中断处理函数里出现超时错误,这样DMA结束标志位就永远收不到了,所以程序就会死在那里。使用4位总线的朋友一定要记得开硬件流控,在设置4位总线那个函数里面设置的,千万不要只是在提高时钟速度的1位总线那个地方改。
RE:今天发现一个有趣的问题 stm32f103数据记录器 usb sdio mmc fatfs
回复:今天发现一个有趣的问题 stm32f103数据记录器 usb sdio mmc fatfs
回复:【热议】今天发现一个有趣的问题 stm32f103数据记录器 usb sdio mmc fatfs