作者AnswerD (answered)
看板ASM
标题[问题] MCU 的多工处理
时间Tue Jun 13 16:56:57 2017
各位前辈好,小弟不太确定这个标题够不够精确,
先说一下目前想实现的东西好了:
平台:Freedom - K64F
IDE :Kinetis Design Studio with K-SDK 2.0
实现目标:
想让这个程式有两个功能
1.接收来自上层(APP、Cloud)的 TCP/UDP 连线并回应
2.跟区域网路内的 Ethernet 装置透过 EV2 封包沟通
目前是透过 LwIP 的 RAW API 来实现 TCP/UDP 的部分
基本的 TCP/UDP Server Echo 我跟着 LwIP 里面的范例做出来了
就是 accept-receive-sent-close 的流程
功能2的沟通单独做的话也可以做到向指定的MAC位置收发封包
但目前遇到的瓶颈是:
我想透过 TCP 封包来对 MCU 下命令
命令内容可能是对其中一个 MAC 装置发 EV2 封包
预想的流程是
Client Server
Connect ---------> Accept
Sent Command ------> Recv
Analysis
Sent EV2
EV2 Respond
Recv <-------- Respond TCP
但跟着上述流程做的话
会不知道怎麽将处理好的状况透过 TCP 再回传
原因是这个 API 本身处理 TCP Stack 的方式是运用 Callback
没办法从外部程式呼叫 tcp_sent 的函式
直接用 API 中的 tcp_write 将要传送的资料 enqueue
再用 tcp_output 试着送出
会得到 not connect error
并且在 output 的时候会挂掉
有想过如果用RTOS Multi-thread或许可以解决这个问题
尝试了发现要开启第二个thread时会有空间不足的状况
想请教板上前辈有没有更好的建议应该怎麽做
小弟恳请各位指导
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.163.99.25
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/ASM/M.1497344220.A.38A.html
1F:→ supertitler: 看起来好像在recv里面做tcp_write不是吗0.0 06/13 22:59
我本来也是这样想
後来发现这个API的运作模式是透过polling ethernet input
再层层解析封包,才会进入tcp 控制区中
如果一个TCP封包进来大概是这样
ethernet receive -> ip -> tcp -> tcp_process -> user function callback
也就是说如果我要把流程做成是
tcp_recv -> ethernet send -> ethernet receive -> tcp_send
是有点不合他原生流程的
目前有想到两个解法
一个是把我要的ethernet 收送的部分
丢到 tcp 的 callback function 中处理
第二个是改用 FNet API
透过RTOS 的 Multi-thread 来处理
※ 编辑: AnswerD (118.163.99.25), 06/14/2017 11:13:28