CubeMX配置freemodbus(使用FreeRTOS)问题笔记

使用CUBEMX配置Freertos+LWIP工程,移植了freemodbus,正常运行一段时间后崩溃出现下面两个报错:

Assertion "pcb->snd_queuelen >= pbuf_clen(next->p)" failed at line 1111 in../Middlewares/Third_Party/LwIP/src/core/tcp_in.c
Assertion "pbuf_free: p->ref > 0" failed at line 753 in ../Middlewares/Third_Party/LwIP/src/core/pbuf.c

原因是lwip内核任务tcpip_thread和modbus任务优先级设置问题修改后运行正常,目前没有出现掉线崩溃的现象。使用Modebus Poll发送超300000+次暂未出现崩溃(以前发送700+就会崩溃!)

修改方法

#define TCPIP_THREAD_PRIO osPriorityAboveNormal

typedef enum  {
  osPriorityIdle          = -3,          ///< priority: idle (lowest)
  osPriorityLow           = -2,          ///< priority: low
  osPriorityBelowNormal   = -1,          ///< priority: below normal
  osPriorityNormal        =  0,          ///< priority: normal (default)
  osPriorityAboveNormal   = +1,          ///< priority: above normal
  osPriorityHigh          = +2,          ///< priority: high
  osPriorityRealtime      = +3,          ///< priority: realtime (highest)
  osPriorityError         =  0x84        ///< system cannot determine priority or thread has illegal priority
} osPriority;

工程文件附上,供大家参考!

F407ZET7-ETH+LWIP+freemodbus+FreeRTOS+SPI+DMA+IWDG测试通过(带软件)icon-default.png?t=N7T8https://download.youkuaiyun.com/download/qq_33288274/88849886

解压后直接打开有时会报错,建议解压后把工程文件放在不带有中文的目录下再打开!

(本人首次使用freemodbus,本文的解决办法也是一遍遍试出来的,可能还有问题,还请各位大佬指出!!一周的努力,希望对大家有所帮助,还请点赞收藏支持一下!

### 如何在 STM32CubeMX使用 FreeRTOS 实现 Modbus RTU 通信 #### 配置 STM32CubeMXFreeRTOS 为了使 STM32F407 板子能够支持 Modbus RTU 协议并利用 FreeRTOS 进行任务调度,在 STM32CubeMX 软件中的设置至关重要。具体来说: - **启用 FreeRTOS**: 在项目创建过程中,于中间件部分勾选 "FreeRTOS" 并调整其参数以适应应用需求[^1]。 - **配置 UART 接口**: 对应串行接口需被激活用于物理层的数据交换;确保波特率等通讯参数匹配主站设备的要求。 - **初始化定时器资源**: 定时中断对于维持协议时间特性非常重要,因此要合理规划 TIMx 外设来提供必要的周期性触发信号给 Modbus 库处理接收超时等情况[^3]。 #### 示例代码展示 下面给出一段简化版的 C 语言程序片段作为参考,展示了如何定义一个简单的 Modbus RTU 响应回调函数以及向指定的任务传递数据包的方式: ```c // 初始化全局变量和句柄结构体成员... extern MB_PORT_timers_t ModbusH; void vMBTimerCallback(TimerHandle_t *pxTimer) { // 更新接收到的消息长度至缓冲区头部 ModbusH.rec_data[0] = (uint8_t)(ModbusH.rec_count >> 8); ModbusH.rec_data[1] = (uint8_t)ModbusH.rec_count; // 将解析后的帧送入消息队列等待进一步处理 xQueueSend(ModbusH.Queue_485_Handle, &ModbusH.rec_data, 0); // 清理工作以便下次读取新报文 ModbusH.rec_data_location = 2; ModbusH.rec_count = 0; memset(&ModbusH.rec_data[2], 0, sizeof(ModbusH.rec_data)-2); } ``` 这段代码体现了当计时器到期时执行的操作逻辑——更新当前已接受到的有效载荷大小,并将其发送到由 FreeRTOS 创建的消息队列中供其他线程消费。 此外,还需要注意的是,如果打算扩展更多功能或优化现有性能,则可能涉及到对官方提供的 FreeModbus 源码做适当改动,比如增加新的 API 函数或是改进内部状态机的设计思路等等[^4]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值