> 技术文档 > Eip开源从站Opener在MCU上的移植调试记录(四 调优过程)

Eip开源从站Opener在MCU上的移植调试记录(四 调优过程)


六、调优过程

实时性问题

对于50ms的IO连接通讯周期

设置的50ms通讯周期,实际跑到了105ms

首先怀疑任务优先级设置问题,打开FreeRTOS的任务信息功能,打印出来如下:

Task List:my_task01  X 0 42 1IDLE  R 0 116 2tcpip_thread  B 7 201 4eth_link_thread B 6 424 6opener_thread B 10 949 7eth_rxpkt  B 5 314 5Tmr Svc B 2 230 3

发现任务优先级设计不合理,由于opener是在TCP/IP之上的应用层协议,优先级设置应该是:

eth_rxpkt>tcpip_thread>opener_thread。

调整后,任务优先级如下:

Task List:my_task01  X 0 19 1IDLE  R 0 116 2tcpip_thread  B 9 193 4eth_link_thread B 6 40 6opener_thread B 8 164 7Tmr Svc B 2 230 3eth_rxpkt  B 10 186 5//opener的log警告:elapsed time: 96 ms was longer than RPI: 50 ms

opener还是告警,但有了一定改善。

于是用wireshark抓下PLC跟opener板子之间的通讯报文(带64位的硬件时间戳),看是不是真的实时性不够。并把两个报文之间的时间间隔统计出来,画出曲线,如下:

50ms的周期,抖动在±30us,满足要求。

也就说opener的log信息作为参考就好。

优化到20ms的IO连接通讯周期

按上述分析方法,将PLC内部的IO连接提升到20ms周期,得出实时性曲线如下:

抖动在±6ms,推测为MCU报文处理慢导致。

接上逻辑分析仪,观察每个线程处理所需的时长:

方案如下,在任务进入时拉高引脚,出来后拉低引脚,统计高电平时长。

tcpip_thread PB6 ->ch1opener_thread PB7 ->ch2eth_rxpkt PB5