RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

rt-thread源碼分析之socket抽象層和網(wǎng)卡注冊

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

rt-thread網(wǎng)絡(luò)架構(gòu)

如圖所示,rt-thread的網(wǎng)絡(luò)分為應(yīng)用層、sal_socket、netdev、協(xié)議簇(at、lwip、wiznet)、網(wǎng)卡驅(qū)動五層。

應(yīng)用層:調(diào)用BSD Socket API實(shí)現(xiàn)的網(wǎng)絡(luò)應(yīng)用,如前面介紹的paho-mqtt。

sal_socket:對socket的抽象,通過網(wǎng)卡(netdev)的pf(sal_proto_family)調(diào)用具體的協(xié)議簇。

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

協(xié)議簇:當(dāng)socekt匹配上協(xié)議簇后,pf的skt_ops調(diào)用具體的協(xié)議簇。協(xié)議簇的實(shí)現(xiàn)在sal_socket文件夾下的impl文件夾下,在每一類協(xié)議簇的實(shí)現(xiàn)中,都有一個向netdev設(shè)置協(xié)議簇的接口,如lwip中的sal_lwip_netdev_set_pf_info。這樣就可以通過netdev訪問到具體的協(xié)議簇。

網(wǎng)卡驅(qū)動:底層硬件

二 sal_socket

2.1 BSD socket

當(dāng)我們在調(diào)用BSD socket寫代碼時,實(shí)際上是調(diào)用sal_xxx(如sal_socket),在sys/socket.h文件中,通過#define將socket轉(zhuǎn)換成sal_socket的接口。

2.2 sal_init

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

2.3 socket函數(shù)

2.3.1 socket_new

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

2.3.2 socket_init

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

不同協(xié)議簇的domain值如下:

lwIP 協(xié)議棧: family = AF_INET、sec_family = AF_INET

AT Socket 協(xié)議棧: family = AF_AT、sec_family = AF_INET

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

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

2.3.3 pf->skt_ops->socket

通過pf->skt_ops->socket調(diào)用具體協(xié)議簇的socket函數(shù),如lwip的lwip_socket。

三 網(wǎng)卡的匹配和注冊

3.1 網(wǎng)卡的匹配-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函數(shù)傳入的domain(family)參數(shù)一致netdev。

3.2 網(wǎng)卡的注冊-netdev_add

在component文件夾的driver文件夾下,不同網(wǎng)卡驅(qū)動最終會調(diào)用到netdev_add向netdev_list添加netdev,向內(nèi)核注冊一個網(wǎng)卡,以rw009為例。

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • TCP協(xié)議
    +關(guān)注

    關(guān)注

    1

    文章

    91

    瀏覽量

    12070
  • LwIP協(xié)議棧
    +關(guān)注

    關(guān)注

    0

    文章

    19

    瀏覽量

    7347
  • BSD
    BSD
    +關(guān)注

    關(guān)注

    0

    文章

    31

    瀏覽量

    10407
  • RT-Thread
    +關(guān)注

    關(guān)注

    31

    文章

    1285

    瀏覽量

    40071
  • MQTT
    +關(guān)注

    關(guān)注

    5

    文章

    650

    瀏覽量

    22482
收藏 人收藏

    評論

    相關(guān)推薦

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

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

    RT-thread源碼移植到STM32F10x和STM32F4xx

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

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

    SAL 簡介為了適配更多的網(wǎng)絡(luò)協(xié)議棧類型,避免系統(tǒng)對單一網(wǎng)絡(luò)協(xié)議棧的依賴,RT-Thread 系統(tǒng)提供了一套 SAL(套接字抽象)組件,該組件完成對不同網(wǎng)絡(luò)協(xié)議棧或網(wǎng)絡(luò)實(shí)現(xiàn)接口的抽象
    發(fā)表于 04-08 15:44

    WIZnet軟件包對接RT-Thread SAL套接字抽象實(shí)現(xiàn)對BSD Socket APIs的支持

    RT-Thread SAL 套接字抽象,實(shí)現(xiàn)對標(biāo)準(zhǔn) BSD Socket APIs 的支持,完美的兼容多種軟件包和網(wǎng)絡(luò)功能實(shí)現(xiàn),提高 WIZnet 設(shè)備兼容性。1.1 目錄結(jié)構(gòu)WI
    發(fā)表于 05-17 17:00

    RTT網(wǎng)絡(luò)框架及SAL套接字抽象介紹

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

    基于RT-Thread的FM1702源碼

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

    RT-Thread發(fā)布SAL套接字抽象,帶來全新物聯(lián)網(wǎng)軟件開發(fā)模式

    Socket CAN 作為Linux上CAN編程的一種方式,它簡易易用,編程順手。很多用戶也想在 RT-Thread 上實(shí)現(xiàn) Socket CAN 編程,這個時候就需要 SAL 上場了。只需要我們在底層使用
    發(fā)表于 07-22 12:37 ?2485次閱讀
    <b class='flag-5'>RT-Thread</b>發(fā)布SAL套接字<b class='flag-5'>抽象</b><b class='flag-5'>層</b>,帶來全新物聯(lián)網(wǎng)軟件開發(fā)模式

    RT-Thread設(shè)備模型框架及創(chuàng)建注冊設(shè)備的實(shí)現(xiàn)

    RT-Thread設(shè)備模型框架及創(chuàng)建注冊設(shè)備的實(shí)現(xiàn)方式介紹如下:
    的頭像 發(fā)表于 05-28 10:38 ?2170次閱讀
    <b class='flag-5'>RT-Thread</b>設(shè)備模型框架及創(chuàng)建<b class='flag-5'>注冊</b>設(shè)備的實(shí)現(xiàn)

    RT-Thread操作系統(tǒng)的FreeRTOS兼容

    Github地址 https://github.com/RT-Thread-packages/FreeRTOS-Wrapper 期待您的 Star 本項(xiàng)目是2022年開源夏,RT-Thread社區(qū)
    的頭像 發(fā)表于 01-14 00:55 ?1637次閱讀

    RT-Thread文檔_RT-Thread 簡介

    RT-Thread文檔_RT-Thread 簡介
    發(fā)表于 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 介紹與移植
    發(fā)表于 02-22 18:31 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> SMP 介紹與移植

    淺析RT-Thread設(shè)備驅(qū)動框架

    RT-Thread 設(shè)備框架屬于組件和服務(wù),是基于 RT-Thread 內(nèi)核之上的上層軟件。設(shè)備框架是針對某一類外設(shè),抽象出來的一套統(tǒng)一的操作方法及接入標(biāo)準(zhǔn),可以屏蔽硬件差異,為應(yīng)用
    的頭像 發(fā)表于 08-07 15:39 ?1952次閱讀

    RT-Thread源碼分析網(wǎng)卡數(shù)據(jù)的接收和發(fā)送

    ethernetif.c是lwip的網(wǎng)卡接口,在該接口中處理網(wǎng)卡的數(shù)據(jù)接收和發(fā)送,rt-thread在該接口文件中抽象了一個eth_device,管理網(wǎng)絡(luò)數(shù)據(jù)的收發(fā)和向內(nèi)核的netde
    的頭像 發(fā)表于 08-11 16:49 ?1727次閱讀

    基于rt-threadsocket通信設(shè)計(jì)

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

    RT-Thread成為恩智浦注冊合作伙伴,共同賦能工業(yè)與物聯(lián)網(wǎng)應(yīng)用開發(fā)!

    前不久,恩智浦半導(dǎo)體加入RT-Thread全球合作伙伴計(jì)劃,成為RT-Thread高級會員合作伙伴。同時,RT-Thread現(xiàn)已成為恩智浦注冊合作伙伴。
    的頭像 發(fā)表于 03-15 09:15 ?852次閱讀
    RM新时代网站-首页