前言
很久之前就開始整理下面的優(yōu)化項(xiàng)列表了,但是有很多問題研究不深,一時(shí)不敢冒失推出。
前不久,有人在論壇上提問,當(dāng)時(shí)我給的答案比現(xiàn)在少,但是現(xiàn)在列出來的這些也不能保證是全部,以后再做補(bǔ)充吧。
lwip 協(xié)議棧、sal socket 抽象層使用了很多全局?jǐn)?shù)組變量當(dāng)作線程棧,可以修改成從內(nèi)存堆動態(tài)申請的內(nèi)存。
有些功能和特性在嵌入式設(shè)備里是用不到的,可以先去掉。
還有的是可有可無的特性,如果想用,也存在優(yōu)化空間,可以自己實(shí)現(xiàn)。
以下說明不限于 lwip ,sal 部分也有涉及。
裁剪詳解
sal 可裁剪優(yōu)化項(xiàng)
1. `SAL_INTERNET_CHECK`: 網(wǎng)絡(luò)檢測,使用到了 workqueue 。檢測原理就是嘗試連接 "link.rt-thread.org::8101",發(fā)送檢測數(shù)據(jù)。
這個或者可以去掉檢測,或者換成自家服務(wù)器。
2. `#define SAL_SOCKETS_NUM 4`: 這個可能是支持創(chuàng)建 socket 的最大數(shù)量。
3. `RT_USING_NETDEV`: 網(wǎng)絡(luò)接口設(shè)備,沒有終端操作的情況下可以優(yōu)化掉。其中,`NETDEV_USING_IFCONFIG` `NETDEV_USING_PING` `NETDEV_USING_NETSTAT` `NETDEV_USING_AUTO_DEFAULT` 分別可以單獨(dú)增刪。
4. `NETDEV_IPV6`: 目前支持還不普及的吧,可以關(guān)掉,如果需要才開啟。
lwip 可裁剪優(yōu)化項(xiàng)
1. `RT_LWIP_IGMP` 組播需要用到的,不用組播可能可以去掉
2. `RT_LWIP_ICMP` ping 命令使用的協(xié)議,沒有 ping 也不需要這個協(xié)議。
3. `RT_LWIP_DNS` 局域網(wǎng)不需要這個,或者說,直接使用 ip 地址進(jìn)行連接而不是使用 url 鏈接地址,可以不使用 dns。
4. `RT_LWIP_TCP_WND` tcp 接收窗口,這個應(yīng)該是申請內(nèi)存大小。可以適當(dāng)減小。不定義就是 1460 x 2 字節(jié)
5. `RT_LWIP_TCP_SND_BUF` tcp 發(fā)送緩存,同上,不定義就是 1460 x 2 字節(jié)
6. `LWIP_NO_TX_THREAD` 和 `LWIP_NO_RX_THREAD` eth 線程,發(fā)送一個,接收一個。以下是幾個相關(guān)宏定義,如果不定義堆棧大小,默認(rèn)使用 1024
#define RT_LWIP_ETHTHREAD_PRIORITY 12
#define RT_LWIP_ETHTHREAD_STACKSIZE 1024
#define RT_LWIP_ETHTHREAD_MBOX_SIZE 8
#define LWIP_NO_TX_THREAD
#define LWIP_NO_RX_THREAD
源碼里,這部分還有很大優(yōu)化空間,具體見下文詳解。
7. `LWIP_NETIF_STATUS_CALLBACK` 和前邊的 SAL_INTERNET_CHECK 有關(guān),這里設(shè)置網(wǎng)絡(luò)連接回調(diào)。可以通知應(yīng)用層連接上 INTERNET 了。
8. `LWIP_NETIF_LINK_CALLBACK` 網(wǎng)卡連接狀態(tài),僅表示物理連接接入網(wǎng)絡(luò),有可能是和電腦直連,或者交換機(jī)、路由器等等。
9. `SO_REUSE` 端口復(fù)用,這個在組播,而且是 UDP 協(xié)議才有用。不需要就定義成 0
10. `LWIP_SO_SNDTIMEO` `LWIP_SO_RCVTIMEO` `LWIP_SO_RCVBUF` 這三個,如果 rtconf.h 里沒有定義, lwipopts.h 會定義,所以不需要就定義成 0。
其中 LWIP_SO_RCVBUF 接收緩沖,涉及到接收緩沖上限。多數(shù)情況下不會有影響,只有網(wǎng)絡(luò)數(shù)據(jù)多的時(shí)候才可能達(dá)到這個緩存上限。
11. `RT_LWIP_USING_PING` 這個和前面的 NETDEV_USING_PING RT_LWIP_ICMP 有關(guān)。
12. `RT_LWIP_STATS` 這是一組 stat 的總開關(guān),詳細(xì)細(xì)節(jié)查看 lwipopts.h 文件內(nèi)的定義。或者取消 RT_LWIP_STATS 定義,關(guān)閉所有 stat 項(xiàng),或者單獨(dú)修改 lwipopts.h 文件中某些 stat 定義。
13. 修改 eth_rx_thread 和 eth_tx_thread ,啟用 RT_USING_HEAP 后,添加動態(tài)創(chuàng)建線程。這兩個線程被初始化在 INIT_PREV_EXPORT 階段。片上內(nèi)存堆和片外內(nèi)地堆初始化注冊都在 INIT_BOARD_EXPORT 階段,可以申請使用動態(tài)內(nèi)存。
erx etx 兩個線程
以 etx 為例。`ethernetif_linkoutput` 函數(shù)主要操作如下:
if (rt_mb_send(e_tx_thread_mb, (rt_uint32_t) &msg) == RT_EOK)
{
/* waiting for ack */
rt_sem_take(&(enetif->tx_ack), RT_WAITING_FOREVER);
}
發(fā)送了一個郵箱,然后等待一個信號量。這個信號量從哪兒來?看下面的 etx 線程入口函數(shù)。
static void eth_tx_thread_entry(void* parameter)
{
struct eth_tx_msg* msg;
while (1)
{
if (rt_mb_recv(e_tx_thread_mb, (rt_ubase_t *)&msg, RT_WAITING_FOREVER) == RT_EOK)
{
struct eth_device* enetif;
RT_ASSERT(msg->netif != RT_NULL);
RT_ASSERT(msg->buf != RT_NULL);
enetif = (struct eth_device*)msg->netif->state;
if (enetif != RT_NULL)
{
/* call driver's interface */
if (enetif->eth_tx(&(enetif->parent), msg->buf) != RT_EOK)
{
/* transmit eth packet failed */
}
}
/* send ACK */
rt_sem_release(&(enetif->tx_ack));
}
}
}
etx 等待 `ethernetif_linkoutput` 的郵件消息,然后調(diào)用 eth 驅(qū)動接口函數(shù),完成后釋放信號量給 `ethernetif_linkoutput`一個應(yīng)答。
從這里看,用上這個線程,需要額外增加兩次 ipc 消息。
去掉 etx 之后呢?`ethernetif_linkoutput` 變成下面的樣子。
static err_t ethernetif_linkoutput(struct netif *netif, struct pbuf *p)
{
struct eth_device* enetif;
RT_ASSERT(netif != RT_NULL);
enetif = (struct eth_device*)netif->state;
if (enetif->eth_tx(&(enetif->parent), p) != RT_EOK)
{
return ERR_IF;
}
return ERR_OK;
}
與使用 etx 線程唯一不同的是:使用線程時(shí),發(fā)送數(shù)據(jù)操作 eth 驅(qū)動都在 etx 線程里進(jìn)行的;如果去掉,就有可能多個應(yīng)用線程同時(shí)發(fā)送數(shù)據(jù),出現(xiàn)多個線程競爭 eth 驅(qū)動資源的現(xiàn)象。但是,這個可以經(jīng)過優(yōu)化應(yīng)用層業(yè)務(wù)邏輯進(jìn)行規(guī)避。
更多關(guān)于不使用 etx 和 erx 線程的修改,請移步我的 gitee 倉庫。
本系列提到的所有代碼更改已經(jīng)提交到 gitee ,歡迎大家測試
https://gitee.com/thewon/rt_thread_repo
審核編輯:湯梓紅
-
LwIP
+關(guān)注
關(guān)注
2文章
87瀏覽量
27258 -
裁剪
+關(guān)注
關(guān)注
0文章
8瀏覽量
7110 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1300瀏覽量
40264
發(fā)布評論請先 登錄
相關(guān)推薦
評論