龙空技术网

【案例分析】STM32F4使用RT-Thread时出现因为串口异常导致死机

问个芯 423

前言:

现时同学们对“stm32的gps模块程序突然不能用了”大概比较珍视,朋友们都需要剖析一些“stm32的gps模块程序突然不能用了”的相关资讯。那么小编在网络上汇集了一些对于“stm32的gps模块程序突然不能用了””的相关内容,希望小伙伴们能喜欢,各位老铁们快快来了解一下吧!

RT- Thread创建的串口驱动有bug

问题详细描述

前段时间工作中,使用了rt Thread创建了F4的工程,待所有板级驱动和业务写完后开始测试产品。其中F4芯片一路串口接GPS模块,进行7*24h长期测试,测试过程中出现死机情况。再次测试仍会复现。

板级配置和驱动代码是我根据芯片和原理图创建,官方板级样例并没有该芯片和类似board包。在板级醒目创建完成后。开发业务框架给应用工程师接口。板级框架测试涉及串口,4G模块,网络通信,任务间通信,曾测试3*24小时,当时没发现死机或者其他情况。

问题具体分析

板级配置如下:

除界面配置外,还需更改board.c适配公司板卡外设,这里不做赘述。总之外设驱动和网络库在板级驱动测试中没有显现问题。应用工程师仅需用C标准库写业务逻辑,其后测试发现死机问题。开始逐步排查。

rtThread给出msh环境可在线调试系统问题,输出系统运行信息。此外尝试在各个任务中加入一些打印信息协助测试查找问题。最后发现GPS定位模块任务无输出,并占用大量资源,出现类似死锁问题,导致产品假死。

定位模块处理任务主要处理串口数据并转发给其他任务,开始排查串口问题初步怀疑串口可能乱码导致业务处理程序崩溃,开始检查电平匹配,电容电阻等,均未发现错误。这也验证了业务框架测试时未发现问题。

下一步打算检查固件驱动库代码。一般的不会认为RT-Thread官方给出的串口驱动部分代码有问题,但长时间未找到原因,就开始在驱动代码进行检查。

整体浏览串口处理样例,其系统串口处理程序为中断和信号量搭配使用,从串口读取一个字节的数据,没有读取到则等待接收信号量,串口数据帧的首尾判断根据GPS数据进行设定。根据代码追踪,最后发现问题,输出函数stm32_putc的timeout存在问题。

问题解决方案

更改库代码:做如下修改;

drv_usart.c 520行左右:

drv_usart.c 660行左右:

总结和建议

此代码库更改的前提是应用工程师业务出现串口资源占用,合理更改代码。

建议参考RT-Thread社区提交样例,合理更改库代码及应用代码。

标签: #stm32的gps模块程序突然不能用了