找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2857|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

操作系統(tǒng)和uip協(xié)議棧的接口

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:82781 發(fā)表于 2015-6-13 16:29 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
    這其實也是水到渠成的事,因為UIP協(xié)議棧是不需要操作系統(tǒng)支持的,也就是說他可以裸奔,可以覆蓋在系統(tǒng)上面,怎么樣裁減都是可以的,然而,lwip卻不行,第一LWIP的所有數(shù)據(jù)區(qū)都要先分先用,也就是說要給LWIP提供動態(tài)分配內(nèi)存的所有接口和封裝函數(shù),第二,LWIP是消息機制,如果裸奔就需要用戶構(gòu)建一套消息機制,然而娛樂操作系統(tǒng)這一切就變得似乎簡單了,線程間的通信都可以依靠操作系統(tǒng)提供的時間接口,UIP就不同了,他不需要動態(tài)分配內(nèi)存,他的緩存是靜態(tài)的,所以搞起來就一點要考慮,那么就是把消息機制融合到UIP和OS之間的接口中就可以了,我只這樣搞的,
1:建立三個線程,最高優(yōu)先級的處理IP數(shù)據(jù)報文,次高優(yōu)先級的作為輪訓(xùn)底層驅(qū)動的接口使用,肩帶這輪訓(xùn)ARP映射表和維護(hù)連接,最低優(yōu)先級無事可做,所以就肩帶的做個定時器用吧,他更新ARP的輪訓(xùn)時間值,這樣就完整了!我測試結(jié)果還是很好的,但是這樣的系統(tǒng)絕對比不上裸奔來的實時,哈哈這個很可笑,是啊操作系統(tǒng)不是萬能的,他需要時間調(diào)度,需要時間去傳遞接收,需要時間壓棧出棧,這都是CPU的時間!但是總體來說,操作系統(tǒng)使下層和上層之間的應(yīng)用變得 簡單明了,所以,如果你的內(nèi)存足夠大,那么兄弟上系統(tǒng)吧,當(dāng)然再完美的東西也有缺憾,UIP的UDP功能很是牽強啊!功能也比LWIP弱很多,所以,總得找機會吧LWIP搞搞,繼續(xù)吧,誰知道呢?

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:82781 發(fā)表于 2015-6-13 16:29 | 只看該作者
本人于下午一下午時間移植了一個UIP,修改后,好用了,由于內(nèi)存不足,所以吧內(nèi)部的靜態(tài)存儲區(qū)改成100個字節(jié),這樣對于ram的消耗會大大的降低,滿足我的硬件系統(tǒng)要求,我運行試過了,我的RAM只有4096程序我正好控制在4016字節(jié),正好可以跑起來,ICMP報文正常,TCP連接正常,數(shù)據(jù)也是正確的!哈哈,好高興!下一步芯片來了之后,開始加入操作系統(tǒng),那就是小菜一碟了!嘿嘿
oid tcp_wangjunwei_appcall()//我自己的TCP端口
{
   if (uip_closed())
{
// USART_OUT(USART1,"uip_closed!\r\n");
  closed();
}
  if (uip_connected())
{
  
struct tcp_demo_appstate *s = (struct tcp_demo_appstate *)&uip_conn->appstate;
s->state = STATE_CMD;              //指令狀態(tài)
s->textlen = 0;
s->textptr = "連接到王均偉的TCP端口上,哈哈哈!掃噶!";
s->textlen = strlen((char *)s->textptr);
   senddata();
  
}
if (uip_acked())
{
  acked();
}

   if (uip_rexmit() || uip_newdata() || uip_acked() || uip_connected() || uip_poll())
{
  struct tcp_demo_appstate *s = (struct tcp_demo_appstate *)&uip_conn->appstate;
    s->textptr = uip_appdata;    /* 向客戶端發(fā)送收到的數(shù)據(jù) */
   s->textlen = uip_len;
  senddata();
}




}
回復(fù)

使用道具 舉報

板凳
ID:82781 發(fā)表于 2015-6-13 16:30 | 只看該作者
  昨天開始搞LWIP的移植,但是不會走怎么跑?所以一直在看源碼,終于今晚上突破了LWIP和系統(tǒng)的接口問題,我看著是這樣的:
首先操作系統(tǒng)創(chuàng)建兩個線程,兩個線程里面設(shè)置連個堵塞郵箱,一個線程專門接收數(shù)據(jù),一個線程專門發(fā)送數(shù)據(jù),當(dāng)外部的網(wǎng)絡(luò)驅(qū)動芯片接收到數(shù)據(jù)包,那么他就發(fā)送一個指針到郵箱中,這時候操作系統(tǒng)輪訓(xùn)到這個郵箱中的數(shù)據(jù),就進(jìn)入處理,其實他也沒處理,他就是把這個得到的指針放到LWIP棧中去了,讓LWIP的內(nèi)核處理,另一條是發(fā)送,當(dāng)LWIP要發(fā)送數(shù)據(jù),就向發(fā)送郵箱發(fā)送一條郵箱指針,然后被掛起的發(fā)送線程被激活,調(diào)用底層發(fā)送程序發(fā)送出去 ,發(fā)送完畢馬上掛起再次等待下一次的數(shù)據(jù)發(fā)送,所以這樣就找到了數(shù)據(jù)收發(fā)的接口,這個顯然是操作系統(tǒng)和LWIP和底層硬件之間的數(shù)據(jù)交換,也就是說LWIP確實是建立在操作系統(tǒng)之上的!他無權(quán)操作底層硬件,要通過操作系統(tǒng)的這兩個堵塞線程來實現(xiàn)數(shù)據(jù)的收發(fā)!哎呀,這才是萬里冰山的一個小腳,還有很多問題沒有解決!比如數(shù)據(jù)怎么被放到地層中的?地層中的數(shù)據(jù)怎么何時被放到數(shù)據(jù)結(jié)構(gòu)中?這就寫LWIP分裝的都非常的嚴(yán)實,以至于找到他的驅(qū)動很難很難!繼續(xù)加油吧!
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表