作者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/m.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