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