<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

rt-thread源碼分析之socket抽象層和網卡注冊

冬至子 ? 來源:happycode999 ? 作者:happycode999 ? 2023-11-13 12:43 ? 次閱讀

rt-thread網絡架構

如圖所示,rt-thread的網絡分為應用層、sal_socket、netdev、協議簇(at、lwip、wiznet)、網卡驅動五層。

應用層:調用BSD Socket API實現的網絡應用,如前面介紹的paho-mqtt。

sal_socket:對socket的抽象,通過網卡(netdev)的pf(sal_proto_family)調用具體的協議簇。

netdev:netdev的私有數據保存協議簇pf(sal_proto_family),pf中的family用于匹配socket需要的協議簇。

協議簇:當socekt匹配上協議簇后,pf的skt_ops調用具體的協議簇。協議簇的實現在sal_socket文件夾下的impl文件夾下,在每一類協議簇的實現中,都有一個向netdev設置協議簇的接口,如lwip中的sal_lwip_netdev_set_pf_info。這樣就可以通過netdev訪問到具體的協議簇。

網卡驅動:底層硬件。

二 sal_socket

2.1 BSD socket

當我們在調用BSD socket寫代碼時,實際上是調用sal_xxx(如sal_socket),在sys/socket.h文件中,通過#define將socket轉換成sal_socket的接口。

2.2 sal_init

sal_init從堆中分配出一個socket表sal_socket_table。sal_socket_table用于保存所有的sockets的信息,當需要創建一個sal_socket時,會從表中取出一個未使用的sal_socket,表的索引(數組下標)是sal_socket的描述符。

2.3 socket函數

2.3.1 socket_new

socket_new從sal_socket_table中獲取一個未使用的socket,并返回描述符。

2.3.2 socket_init

socket_init根據domain在netdev_get_by_family函數中匹配netdev。socket原型為
int socket(int domain, int type, int protocol);

不同協議簇的domain值如下:

lwIP 協議棧: family = AF_INET、sec_family = AF_INET

AT Socket 協議棧: family = AF_AT、sec_family = AF_INET

WIZnet 硬件 TCP/IP 協議棧: family = AF_WIZ、sec_family = AF_INET

與之相應的,netdev私有數據所保存的協議簇sal_proto_family中有一個family字段,用于與socket進行匹配,這樣socket函數通過doamin參數就可以指定使用lwip、at、wiznet三種協議簇的一種。

2.3.3 pf->skt_ops->socket

通過pf->skt_ops->socket調用具體協議簇的socket函數,如lwip的lwip_socket。

三 網卡的匹配和注冊

3.1 網卡的匹配-netdev_get_by_family

for (node = &(netdev_list->list); node; node = rt_slist_next(node))
{
netdev = rt_slist_entry(node, struct netdev, list);
pf = (struct sal_proto_family *) netdev->sal_user_data;
if (pf && pf->skt_ops && pf->family == family && netdev_is_up(netdev))
{
rt_hw_interrupt_enable(level);
return netdev;
}
}

遍歷netdev_list,查找與socket函數傳入的domain(family)參數一致netdev。

3.2 網卡的注冊-netdev_add

在component文件夾的driver文件夾下,不同網卡驅動最終會調用到netdev_add向netdev_list添加netdev,向內核注冊一個網卡,以rw009為例。

rt_hw_wifi_init -> eth_device_init -> eth_device_init_with_flag -> eth_netif_device_init -> netdev_add。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • TCP協議
    +關注

    關注

    1

    文章

    83

    瀏覽量

    12012
  • LwIP協議棧
    +關注

    關注

    0

    文章

    19

    瀏覽量

    7268
  • BSD
    BSD
    +關注

    關注

    0

    文章

    28

    瀏覽量

    10359
  • RT-Thread
    +關注

    關注

    31

    文章

    1176

    瀏覽量

    38993
  • MQTT
    +關注

    關注

    5

    文章

    550

    瀏覽量

    22092
收藏 人收藏

    評論

    相關推薦

    RT-Thread記錄(十一、UART設備—源碼解析)

    一文帶你深入理解 RT-Thread I/O 設備模型 — UART 設備源碼分析。
    的頭像 發表于 07-01 11:24 ?5084次閱讀
    <b class='flag-5'>RT-Thread</b>記錄(十一、UART設備—<b class='flag-5'>源碼</b>解析)

    RT-thread源碼移植到STM32F10x和STM32F4xx

    RT-thread源碼移植到STM32F10x和STM32F4xx: 一、源碼下載 點擊入門->下載 ? 在歷史版本里邊隨便選取一個 ? 會進入百度云盤的下載地址,里邊有全部版本的源碼
    的頭像 發表于 11-15 09:38 ?1169次閱讀
    <b class='flag-5'>RT-thread</b><b class='flag-5'>源碼</b>移植到STM32F10x和STM32F4xx

    一文讀懂RT-Thread的SAL套接字抽象

    SAL 簡介為了適配更多的網絡協議棧類型,避免系統對單一網絡協議棧的依賴,RT-Thread 系統提供了一套 SAL(套接字抽象)組件,該組件完成對不同網絡協議?;蚓W絡實現接口的抽象
    發表于 04-08 15:44

    WIZnet軟件包對接RT-Thread SAL套接字抽象實現對BSD Socket APIs的支持

    RT-Thread SAL 套接字抽象,實現對標準 BSD Socket APIs 的支持,完美的兼容多種軟件包和網絡功能實現,提高 WIZnet 設備兼容性。1.1 目錄結構WI
    發表于 05-17 17:00

    RTT網絡框架及SAL套接字抽象介紹

    RTT 中提供了標準的 BSD Socket 接口,同時也完成上面所說的兩大工作。為了解決協議棧與標準 Socket 的對接,RT-Thread 提供了一套 SAL(套接字抽象
    發表于 07-28 11:40

    基于RT-Thread的FM1702源碼

    RT-Thread是一款來自中國的開源嵌入式實時操作系統,包括一系列應用組件和驅動框架,如TCP/IP協議棧,虛擬文件系統,POSIX接口,圖形用戶界面。---(轉自RTT官網)。 FM1702是無線射頻的一種,現將其移植到RT-Thread操作系統中。
    發表于 12-28 10:54 ?15次下載

    RT-Thread開發,如何有效學習RT-Thread的五個步驟

    RT-Thread推出RT-Thread Inside戰略開放RT-Thread開發平臺授權合作,與硬件十萬個為什么合作首次推出第一款RT-Inside的開發板——iBox物聯網開發套
    的頭像 發表于 09-25 09:55 ?3.4w次閱讀
    <b class='flag-5'>RT-Thread</b>開發,如何有效學習<b class='flag-5'>RT-Thread</b>的五個步驟

    源碼解讀·RT-Thread操作系統從開機到關機(轉)

    源碼解讀·RT-Thread操作系統從開機到關機本篇內容比較簡單,但卻很繁瑣,篇幅也很長,畢竟是囊括了整個操作系統的生命周期。這篇文章的目的是作為后續設計多任務開發的鋪墊,后續會單獨再抽出一篇分析
    發表于 12-16 16:58 ?11次下載
    <b class='flag-5'>源碼</b>解讀·<b class='flag-5'>RT-Thread</b>操作系統從開機到關機(轉)

    RT-Thread設備模型框架及創建注冊設備的實現

    RT-Thread設備模型框架及創建注冊設備的實現方式介紹如下:
    的頭像 發表于 05-28 10:38 ?1854次閱讀
    <b class='flag-5'>RT-Thread</b>設備模型框架及創建<b class='flag-5'>注冊</b>設備的實現

    RT-Thread自動初始化機制

    ??在分析之前首先查閱 RT-Thread 的官方文檔 [RT-Thread 自動初始化機制](https://www.rt-thread.org/document/site
    的頭像 發表于 06-17 08:52 ?2046次閱讀
    <b class='flag-5'>RT-Thread</b>自動初始化機制

    RT-Thread文檔_RT-Thread 簡介

    RT-Thread文檔_RT-Thread 簡介
    發表于 02-22 18:22 ?5次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> 簡介

    RT-Thread文檔_RT-Thread SMP 介紹與移植

    RT-Thread文檔_RT-Thread SMP 介紹與移植
    發表于 02-22 18:31 ?8次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> SMP 介紹與移植

    RT-Thread源碼分析網卡數據的接收和發送

    ethernetif.c是lwip的網卡接口,在該接口中處理網卡的數據接收和發送,rt-thread在該接口文件中抽象了一個eth_device,管理網絡數據的收發和向內核的netde
    的頭像 發表于 08-11 16:49 ?1095次閱讀

    基于rt-threadsocket通信設計

    最近再研究 rt-thread 的通信 ,想設計出 eps8266(多個) rt-thread(作為中控) 服務器的通信框架,使用的開發板是 潘多拉
    的頭像 發表于 10-13 15:02 ?788次閱讀
    基于<b class='flag-5'>rt-thread</b>的<b class='flag-5'>socket</b>通信設計

    RT-Thread成為恩智浦注冊合作伙伴,共同賦能工業與物聯網應用開發!

    前不久,恩智浦半導體加入RT-Thread全球合作伙伴計劃,成為RT-Thread高級會員合作伙伴。同時,RT-Thread現已成為恩智浦注冊合作伙伴。
    的頭像 發表于 03-15 09:15 ?608次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>