亚洲精品久久久久久久久久久,亚洲国产精品一区二区制服,亚洲精品午夜精品,国产成人精品综合在线观看,最近2019中文字幕一页二页

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

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

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

RT-Thread記錄(十、全面認(rèn)識(shí) I/O 設(shè)備模型)

矜辰所致 ? 來(lái)源:矜辰所致 ? 作者:矜辰所致 ? 2022-06-30 10:38 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

學(xué)完 RT-Thread 內(nèi)核,從本文開(kāi)始熟悉了解 RT-Thread I/O 設(shè)備管理相關(guān)知識(shí)。

目錄

前言
一、RT-Thread 的 I/O設(shè)備管理

1.1 什么是 I/O 設(shè)備模型
1.2 I/O 設(shè)備模型框架解析
1.2.1 應(yīng)用程序
1.2.2 I/O 設(shè)備管理層
1.2.3 設(shè)備驅(qū)動(dòng)框架層
1.2.4 設(shè)備驅(qū)動(dòng)層
1.2.5 硬件層
1.3 I/O 設(shè)備操作邏輯說(shuō)明
1.4 I/O 設(shè)備模型框架有什么用?

二、I/O 設(shè)備模型操作 API

2.1 I/O 設(shè)備控制塊
2.1.1 設(shè)備類型 type
2.1.2 設(shè)備注冊(cè) flag
2.1.3 設(shè)備訪問(wèn) open_flag
2.2 創(chuàng)建 I/O 設(shè)備相關(guān)
2.2.1 創(chuàng)建設(shè)備
2.2.2 銷毀設(shè)備
2.2.3 設(shè)備注冊(cè)
2.2.4 設(shè)備注銷
2.3 訪問(wèn) I/O 設(shè)備相關(guān)
2.3.1 查找設(shè)備
2.3.2 初始化設(shè)備
2.3.3 打開(kāi)和關(guān)閉設(shè)備
2.3.4 讀寫(xiě)設(shè)備
2.3.5 控制設(shè)備
2.3.6 數(shù)據(jù)收發(fā)回調(diào)

三、新建 I/O 設(shè)備模型實(shí)例
結(jié)語(yǔ)

前言

我們已經(jīng)把 RT-Thread 內(nèi)核學(xué)習(xí)完成,也已經(jīng)使用 RT-Thread 做了一個(gè)實(shí)例應(yīng)用。

但是作為一個(gè)操作系統(tǒng), RT-Thread 除了內(nèi)核部分還有自己的設(shè)備框架,類似于 Linux 操作系統(tǒng)設(shè)備的管理方式的 I/O 設(shè)備模型。

從本文開(kāi)始,我們要開(kāi)始學(xué)習(xí)了解 RT-Thread 的 I/O 設(shè)備模型。

說(shuō)明,概念性質(zhì)的說(shuō)明主要還是使用引用方式,畢竟有權(quán)威的官方在,對(duì)于一些細(xì)節(jié)的理解,我會(huì)闡述自己的看法,同時(shí)會(huì)設(shè)計(jì)一些實(shí)例加深我們對(duì)基本概念的理解。

?? 我想做到的是,僅此一片文章,讓所有人都能明白R(shí)T-Thread 的I/O 設(shè)備模型 ??

一、RT-Thread 的 I/O設(shè)備管理

有些小伙伴在剛接觸到這個(gè)概念的時(shí)候還不太明白, I/O 設(shè)備模型,IO口? IO口的模型?

注意這里的 I/O 指的是 Input/Output。I/O 設(shè)備,就是指的輸入 / 輸出設(shè)備。

所謂 I/O 設(shè)備模型,指的是 RT-Thread 把所有的 輸入 / 輸出設(shè)備當(dāng)做一類對(duì)象,然后通過(guò)自己的一套體系對(duì)這類對(duì)象進(jìn)行管理,這類 I/O 設(shè)備對(duì)象就可以認(rèn)為是 I/O 設(shè)備模型。

RT-Thread 提供了一套模型框架用來(lái)對(duì)所有的輸入/輸出設(shè)備進(jìn)行管理的,名叫 I/O 設(shè)備模型框架 ,其 位于硬件層和應(yīng)用程序之間,包括IO設(shè)備管理層、設(shè)備驅(qū)動(dòng)框架層和設(shè)備驅(qū)動(dòng)層,向上層層抽象,目標(biāo)是針對(duì)各種不同的I/O設(shè)備提供給應(yīng)用程序相同的接口,如下圖:

pYYBAGK9DJWALOWBAAOPg3TZ6Ho023.png

1.2 I/O 設(shè)備模型框架解析

根據(jù)上圖,結(jié)合工程代碼,我們對(duì)每個(gè)層分別說(shuō):

1.2.1 應(yīng)用程序

我們寫(xiě)的應(yīng)用程序,調(diào)用 I/O 設(shè)備管理層給的接口進(jìn)行底層硬件操作;

對(duì)應(yīng) main.c :

poYBAGK9DJWAK43VAAA3FT2lzKM769.png

1.2.2 I/O 設(shè)備管理層

I/O 設(shè)備管理層實(shí)現(xiàn)了對(duì)設(shè)備驅(qū)動(dòng)程序的封裝。
應(yīng)用程序通過(guò) I/O 設(shè)備管理接口獲得正確的設(shè)備驅(qū)動(dòng),然后通過(guò)這個(gè)設(shè)備驅(qū)動(dòng)與底層 I/O 硬件設(shè)備進(jìn)行數(shù)據(jù)交互。
設(shè)備驅(qū)動(dòng)程序的升級(jí)、更替不會(huì)對(duì)上層應(yīng)用產(chǎn)生影響。這種方式使得設(shè)備的硬件操作相關(guān)的代碼能夠獨(dú)立于應(yīng)用程序而存在,雙方只需關(guān)注各自的功能實(shí)現(xiàn),從而降低了代碼的耦合性、復(fù)雜性,提高了系統(tǒng)的可靠性。

對(duì)應(yīng) device.c

pYYBAGK9DJWAEce_AAApcEWezF4881.png

1.2.3 設(shè)備驅(qū)動(dòng)框架層

設(shè)備驅(qū)動(dòng)框架層對(duì)同類硬件設(shè)備驅(qū)動(dòng)的抽象,將不同廠家的同類硬件設(shè)備驅(qū)動(dòng)中相同的部分抽取出來(lái),將不同部分留出接口,由驅(qū)動(dòng)程序?qū)崿F(xiàn)。

對(duì)應(yīng)的比如 serial.c 等

poYBAGK9DJaAG9KJAAA3hwS3nZU266.png

?? 上面的 I/O 設(shè)備管理層 和 設(shè)備驅(qū)動(dòng)框架層 是屬于RT-Thread 系統(tǒng)的范疇,官方已寫(xiě)好,所以在項(xiàng)目中的位置存放于 rt-thread 文件夾下面。

1.2.4 設(shè)備驅(qū)動(dòng)層

設(shè)備驅(qū)動(dòng)層是一組驅(qū)使硬件設(shè)備工作的程序,實(shí)現(xiàn)訪問(wèn)硬件設(shè)備的功能。它負(fù)責(zé)創(chuàng)建和注冊(cè) I/O 設(shè)備,就類似于使用裸機(jī)編寫(xiě)程序時(shí)候的底層驅(qū)動(dòng)。
裸機(jī)的驅(qū)動(dòng)是直接被應(yīng)用層調(diào)用,這里的驅(qū)動(dòng)是提供給 設(shè)備驅(qū)動(dòng)框架層調(diào)用 或者 直接給 I/O 設(shè)備管理層調(diào)用的。

對(duì)于一些常用的芯片或者與官方有合作的芯片,官方也會(huì)提供了寫(xiě)好的驅(qū)動(dòng),比如STM32,下圖就是官方已經(jīng)寫(xiě)好的基于STM32 的設(shè)備驅(qū)動(dòng)層的代碼。

對(duì)應(yīng)比如 drv_gpio.c 、drv_usart.c 這些 :

pYYBAGK9DJaAf10ZAAA651d5Q04796.png

?? 設(shè)備驅(qū)動(dòng)層的編寫(xiě)是需要基于芯片或外設(shè)的手冊(cè)、SDK,是需要額外實(shí)現(xiàn)的。
但是有些常用芯片和外設(shè)官方已經(jīng)幫我們寫(xiě)好了,比如基于 STM32 的 HAL 庫(kù),RT-Thread官方已經(jīng)實(shí)現(xiàn)了基于 STM32 的設(shè)備驅(qū)動(dòng)層 。

1.2.5 硬件層

比如Flash芯片,SD卡,stm32芯片等外設(shè)和MCU設(shè)備。

1.3 I/O 設(shè)備操作邏輯說(shuō)明

簡(jiǎn)單介紹一下 I/O 設(shè)備操作邏輯,這部分應(yīng)用官方的說(shuō)明。

對(duì)于操作邏輯簡(jiǎn)單的設(shè)備,可以不經(jīng)過(guò)設(shè)備驅(qū)動(dòng)框架層,直接將設(shè)備注冊(cè)到 I/O 設(shè)備管理器中,過(guò)程如下:

在我們本文后面的新建設(shè)備模型實(shí)例中就舉了個(gè)簡(jiǎn)單設(shè)備的例子。

poYBAGK9DJaASOvsAADEkSQNTGw266.png

對(duì)于復(fù)雜點(diǎn)的設(shè)備,需要經(jīng)過(guò)設(shè)備驅(qū)動(dòng)框架層:

pYYBAGK9DJaAXsODAACyCrlrinY973.pngpoYBAGK9DJaADCALAADNyf5MhT0777.png

為了更好的理解上面的流程,可以結(jié)合工程源碼理解,多看源碼,比如下圖所示:

pYYBAGK9DJeAKfIJAAD8rGHr6D0552.png

1.4 I/O 設(shè)備模型框架有什么用?

有很多初學(xué)者會(huì)問(wèn), I/O 設(shè)備模型意義在哪里? 在裸機(jī)使用中,比如操作一個(gè)IO口,直接調(diào)用驅(qū)動(dòng)函數(shù),不是更簡(jiǎn)單,更直接,使用了設(shè)個(gè)模型,反而變得復(fù)雜了?

在某些時(shí)候,如果你只使用一種芯片一種方案,或許某種意義上說(shuō), I/O 設(shè)備模型確實(shí)可能會(huì)比直接調(diào)用驅(qū)動(dòng)函數(shù)復(fù)雜。 也可以說(shuō),你使用的方案單一,項(xiàng)目簡(jiǎn)單,沒(méi)有必要使用 I/O 設(shè)備模型,甚至可能連 RTOS 都不一定需要。

總之就是,只用一種芯片方案簡(jiǎn)單項(xiàng)目或者內(nèi)存空間實(shí)在有限,完全是可以不用這個(gè)框架,直接用 RT-Thread Nano 完成功能,和我們前面講的項(xiàng)目實(shí)例一樣完成,是沒(méi)有問(wèn)題的!

但是作為一個(gè)工程師,不能局限在一種方案上面,尤其當(dāng)今芯片市場(chǎng)變幻莫測(cè),指不定哪天需要換芯片,換方案呢? 而且 RT-Thread 作為一個(gè)面向?qū)ο笏枷朐O(shè)計(jì)的操作系統(tǒng),必須得全面考慮,需要降低了代碼的耦合性、復(fù)雜性,提高了系統(tǒng)的可靠性,能夠使得系統(tǒng)運(yùn)行與不同的芯片設(shè)備上。

如果沒(méi)有 I/O 設(shè)備模型,那么每次換方案,從底層到應(yīng)用層所有的代碼基本上都得重寫(xiě),對(duì)于簡(jiǎn)單的項(xiàng)目無(wú)所謂,對(duì)于復(fù)雜一點(diǎn)的項(xiàng)目,那可是需要花費(fèi)大量功夫。

使用了 RT-Thread 的 I/O 設(shè)備模型,不管你使用哪種MCU,應(yīng)用層對(duì)設(shè)備操作的函數(shù)一模一樣,設(shè)備驅(qū)動(dòng)程序的升級(jí)、更替不會(huì)對(duì)上層應(yīng)用產(chǎn)生影響。這種方式使得設(shè)備的硬件操作相關(guān)的代碼能夠獨(dú)立于應(yīng)用程序而存在,雙方只需關(guān)注各自的功能實(shí)現(xiàn)。

如果學(xué)過(guò) Linux 的朋友肯定知道,RT-Thread 的 I/O 設(shè)備模型 思想 是和 Linux 類似的,作為嵌入式工程師,如果你懂 Linux,那么就應(yīng)該知道 I/O 設(shè)備模型框架 的優(yōu)點(diǎn)。如果你不懂 Linux,那么學(xué)會(huì)了 RT-Thread 操作系統(tǒng)的 I/O 設(shè)備模型,對(duì)于以后深入學(xué)習(xí) Linux 操作系統(tǒng),也是有幫助的 。 這話沒(méi)毛病! 感覺(jué)怎么說(shuō)怎么有道理,人往高處走嘛!= =!

所有最終結(jié)果就是,反正就是好,人往高處走,學(xué)會(huì)了沒(méi)壞處 = =!

二、I/O 設(shè)備模型操作 API

上文我們說(shuō)明了RT-Thread I/O 設(shè)備模型的基本概念先關(guān)內(nèi)容,也了解了 I/O 設(shè)備模型框架以及操作邏輯,那么我們用戶該如何來(lái)實(shí)現(xiàn)這一流程呢?

所以現(xiàn)在我們就來(lái)學(xué)習(xí)一下I/O設(shè)備模型操作的相關(guān)API函數(shù),包括創(chuàng)建、注冊(cè)、訪問(wèn)等 。。。

2.1 I/O 設(shè)備控制塊

我們不止一次的說(shuō)明了 RT-Thread 的面向?qū)ο蟮乃枷?,在RT-Thread中,設(shè)備也是一種內(nèi)核對(duì)象,那么他和以前說(shuō)的線程,IPC機(jī)制,定時(shí)器等對(duì)象一樣,有自己的對(duì)象控制塊。

在以前博文:RT-Thread記錄(六、IPC機(jī)制之信號(hào)量、互斥量和事件集)這里再次額外說(shuō)明一下,因?yàn)橹灰斫饬诉@種思想,對(duì)于學(xué)會(huì)他們的使用就更加簡(jiǎn)單了,在IPC機(jī)制的時(shí)候我們使用圖片說(shuō)明過(guò):

poYBAGK9DJeAZ3NoAAPLTvh7m9w388.pngpYYBAGK9DJiACQcdAAQfsPD-ENk782.png

其實(shí)我們可以看一下設(shè)備對(duì)象的控制塊:

poYBAGK9DJiAIzRcAAEkupi7DCI510.png

上源碼方便以后復(fù)制:

/**
 * Device structure 設(shè)備控制塊
 */
struct rt_device
{
    struct rt_object          parent;                   /**< inherit from rt_object */

    enum rt_device_class_type type;                     /**< device type */
    rt_uint16_t               flag;                     /**< device flag */
    rt_uint16_t               open_flag;                /**< device open flag */

    rt_uint8_t                ref_count;                /**< reference count */
    rt_uint8_t                device_id;                /**< 0 - 255 */

    /* device call back */
    rt_err_t (*rx_indicate)(rt_device_t dev, rt_size_t size);
    rt_err_t (*tx_complete)(rt_device_t dev, void *buffer);

#ifdef RT_USING_DEVICE_OPS
    const struct rt_device_ops *ops;
#else
    /* common device interface */
    rt_err_t  (*init)   (rt_device_t dev);
    rt_err_t  (*open)   (rt_device_t dev, rt_uint16_t oflag);
    rt_err_t  (*close)  (rt_device_t dev);
    rt_size_t (*read)   (rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size);
    rt_size_t (*write)  (rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size);
    rt_err_t  (*control)(rt_device_t dev, int cmd, void *args);
#endif

#if defined(RT_USING_POSIX)
    const struct dfs_file_ops *fops;
    struct rt_wqueue wait_queue;
#endif

    void                     *user_data;                /**< device private data */
};

2.1.1 設(shè)備類型 type

設(shè)備對(duì)象的控制塊中對(duì)于設(shè)備類型使用了一個(gè)rt_device_class_type枚舉的方式,其可能的設(shè)備類型如下(簡(jiǎn)單的沒(méi)有注釋,還有部分嗎不太清楚的,以后更新):

pYYBAGK9DJiAIFJlAAEf0PiIGlg009.png

設(shè)備類型 需要在創(chuàng)建的時(shí)候選擇好,寫(xiě)驅(qū)動(dòng)的時(shí)候應(yīng)該知道自己寫(xiě)的是什么類型的設(shè)備。

2.1.2 設(shè)備注冊(cè) flag

設(shè)備對(duì)象的控制塊中有一個(gè) flag 參數(shù),設(shè)備模式標(biāo)志 ,表示設(shè)備是屬于什么狀態(tài)的設(shè)備,可讀、可寫(xiě)、收發(fā)等,其可以有的參數(shù)如下:

poYBAGK9DJiAO5iiAADbHHtBd0s404.png

注意,該標(biāo)志可以采用或的方式支持多種參數(shù)。

設(shè)備注冊(cè) flag 需要在創(chuàng)建的時(shí)候選擇好,寫(xiě)驅(qū)動(dòng)的時(shí)候應(yīng)該知道自己寫(xiě)的設(shè)備是什么狀態(tài),比如只讀。只寫(xiě),中斷接收之類的。

2.1.3 設(shè)備訪問(wèn) open_flag

設(shè)備對(duì)象的控制塊中有一個(gè) open_flag 參數(shù),設(shè)備打開(kāi)模式標(biāo)志 ,表示對(duì)設(shè)備進(jìn)行什么操作,其可以有的參數(shù)如下:

pYYBAGK9DJiAQMcEAACi9CQYMmU840.png

設(shè)備訪問(wèn)的時(shí)候,需要使用這個(gè) open_flag 來(lái)判斷需要對(duì)設(shè)備進(jìn)行什么操作,是讀?還是寫(xiě)? 還是發(fā)送等。。。

?? 介紹了 I/O 設(shè)備控制塊,讓我們清楚我們要操作的對(duì)象是什么,我們?cè)?設(shè)備驅(qū)動(dòng)層 要寫(xiě)的設(shè)備驅(qū)動(dòng)以及上層應(yīng)用對(duì) I/O 設(shè)備的訪問(wèn), 就是基于這個(gè)控制塊來(lái)進(jìn)行的。

2.2 創(chuàng)建 I/O 設(shè)備相關(guān)

我們按照 先創(chuàng)建設(shè)備,再訪問(wèn)設(shè)備 的順序來(lái)介紹對(duì)于的 API 函數(shù)。

2.2.1 創(chuàng)建設(shè)備

老規(guī)矩用源碼,解釋看注釋(使用起來(lái)也方便復(fù)制 ~ ~?。?/p>

/*
參數(shù)的含義:
1、type 		設(shè)備類型,上面 2.1.1 小結(jié)說(shuō)明的設(shè)備類型
2、attach_size  用戶數(shù)據(jù)大小
返回值:
創(chuàng)建成功,返回設(shè)備的控制塊指針
創(chuàng)建失敗,返回RT_BULL 
*/

rt_device_t rt_device_create(int type, int attach_size)

/**
 * device (I/O) class type  設(shè)備類型
 */
enum rt_device_class_type
{
    RT_Device_Class_Char = 0,                           /**< character device */
    RT_Device_Class_Block,                              /**< block device */
    RT_Device_Class_NetIf,                              /**< net interface */
    RT_Device_Class_MTD,                                /**< memory device */
    RT_Device_Class_CAN,                                /**< CAN device */
    RT_Device_Class_RTC,                                /**< RTC device */
    RT_Device_Class_Sound,                              /**< Sound device */
    RT_Device_Class_Graphic,                            /**< Graphic device */
    RT_Device_Class_I2CBUS,                             /**< I2C bus device */
    RT_Device_Class_USBDevice,                          /**< USB slave device */
    RT_Device_Class_USBHost,                            /**< USB host bus */
    RT_Device_Class_SPIBUS,                             /**< SPI bus device */
    RT_Device_Class_SPIDevice,                          /**< SPI device */
    RT_Device_Class_SDIO,                               /**< SDIO bus device */
    RT_Device_Class_PM,                                 /**< PM pseudo device */
    RT_Device_Class_Pipe,                               /**< Pipe device */
    RT_Device_Class_Portal,                             /**< Portal device */
    RT_Device_Class_Timer,                              /**< Timer device */
    RT_Device_Class_Miscellaneous,                      /**< Miscellaneous device */
    RT_Device_Class_Sensor,                             /**< Sensor device */
    RT_Device_Class_Touch,                              /**< Touch device */
    RT_Device_Class_PHY,                                /**< PHY device */
    RT_Device_Class_Unknown                             /**< unknown device */
};

設(shè)備被創(chuàng)建后,需要實(shí)現(xiàn)它訪問(wèn)硬件的操作方法,要按照下面的函數(shù)指針實(shí)現(xiàn)這些對(duì)于設(shè)備的操作函數(shù):

/* common device interface */
    rt_err_t  (*init)   (rt_device_t dev);
    rt_err_t  (*open)   (rt_device_t dev, rt_uint16_t oflag);
    rt_err_t  (*close)  (rt_device_t dev);
    rt_size_t (*read)   (rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size);
    rt_size_t (*write)  (rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size);
    rt_err_t  (*control)(rt_device_t dev, int cmd, void *args);

這里引用官方的說(shuō)明:

poYBAGK9DJmAbYFbAAI0qwEx3Bg850.png

2.2.2 銷毀設(shè)備

此函數(shù)不一定需要使用,但是有創(chuàng)建就應(yīng)該有銷毀:

/*
參數(shù)的含義:
dev 	設(shè)備句柄
*/
void rt_device_destroy(rt_device_t dev)

2.2.3 設(shè)備注冊(cè)

設(shè)備被創(chuàng)建后,需要注冊(cè)到 I/O 設(shè)備管理器中,應(yīng)用程序才能夠訪問(wèn):

/*
參數(shù)的含義:
dev 	設(shè)備句柄
name 	設(shè)備名稱,
設(shè)備名稱的最大長(zhǎng)度由 rtconfig.h 中定義的宏 RT_NAME_MAX 指定,多余部分會(huì)被自動(dòng)截掉
flags 	設(shè)備模式標(biāo)志,就是上面介紹的 2.1.2 設(shè)備注冊(cè) flag
返回值:
RT_EOK 	注冊(cè)成功
-RT_ERROR 	注冊(cè)失敗,dev 為空或者 name 已經(jīng)存在
*/
rt_err_t rt_device_register(rt_device_t dev,
                            const char *name,
                            rt_uint16_t flags)


/*設(shè)備注冊(cè) flag*/
#define RT_DEVICE_FLAG_DEACTIVATE       0x000           /**< device is not not initialized */

#define RT_DEVICE_FLAG_RDONLY           0x001           /**< read only */
#define RT_DEVICE_FLAG_WRONLY           0x002           /**< write only */
#define RT_DEVICE_FLAG_RDWR             0x003           /**< read and write */

#define RT_DEVICE_FLAG_REMOVABLE        0x004           /**< removable device */
#define RT_DEVICE_FLAG_STANDALONE       0x008           /**< standalone device */
#define RT_DEVICE_FLAG_ACTIVATED        0x010           /**< device is activated */
#define RT_DEVICE_FLAG_SUSPENDED        0x020           /**< device is suspended */
#define RT_DEVICE_FLAG_STREAM           0x040           /**< stream mode */

#define RT_DEVICE_FLAG_INT_RX           0x100           /**< INT mode on Rx */
#define RT_DEVICE_FLAG_DMA_RX           0x200           /**< DMA mode on Rx */
#define RT_DEVICE_FLAG_INT_TX           0x400           /**< INT mode on Tx */
#define RT_DEVICE_FLAG_DMA_TX           0x800           /**< DMA mode on Tx */
上面需要額外說(shuō)明的一點(diǎn),設(shè)備流模式 `RT_DEVICE_FLAG_STREAM` 參數(shù)用于向串口終端輸出字符串:
當(dāng)輸出的字符是 “\n” 時(shí),自動(dòng)在前面補(bǔ)一個(gè) “\r” 做分行。

2.2.4 設(shè)備注銷

創(chuàng)建對(duì)銷毀,注冊(cè)對(duì)注銷:

/**
參數(shù) 	描述
dev 	設(shè)備句柄
返回 	——
RT_EOK 	成功
 */
rt_err_t rt_device_unregister(rt_device_t dev)

當(dāng)設(shè)備注銷后的,設(shè)備將從設(shè)備管理器中移除,也就不能再通過(guò)設(shè)備查找搜索到該設(shè)備。注銷設(shè)備不會(huì)釋放設(shè)備控制塊占用的內(nèi)存。
注銷只是把這個(gè) 設(shè)備對(duì)象結(jié)構(gòu)體 從管理鏈表中去掉,并不會(huì)釋放這個(gè)對(duì)象結(jié)構(gòu)體的空間,要釋放空間需要調(diào)用銷毀設(shè)備函數(shù)。

?? 創(chuàng)建 I/O 設(shè)備相關(guān)的函數(shù),和 I/O 設(shè)備模型框架中 設(shè)備驅(qū)動(dòng)層 有關(guān),在我們底層寫(xiě)驅(qū)動(dòng)的時(shí)候需要使用。

2.3 訪問(wèn) I/O 設(shè)備相關(guān)

上面我們說(shuō)的創(chuàng)建 I/O 設(shè)備相關(guān)是和 設(shè)備驅(qū)動(dòng)層 有關(guān)的代碼,本小結(jié)說(shuō)的訪問(wèn) I/O 設(shè)備就是和 應(yīng)用程序有關(guān)的代碼,就是告訴我們應(yīng)用程序怎么去操作我們上面創(chuàng)建的設(shè)備。

I/O 設(shè)備管理接口與 I/O 設(shè)備的操作方法的映射關(guān)系下圖:

pYYBAGK9DJmAYOf9AAERyxaJSRg014.png

2.3.1 查找設(shè)備

注冊(cè)過(guò)的設(shè)備才能被查找到,名字對(duì)應(yīng)注冊(cè)時(shí)候使用的名字:

/**
參數(shù) 	描述
name 	設(shè)備名稱
返回 	——
設(shè)備句柄 	查找到對(duì)應(yīng)設(shè)備將返回相應(yīng)的設(shè)備句柄
RT_NULL 	沒(méi)有找到相應(yīng)的設(shè)備對(duì)象
 */
rt_device_t rt_device_find(const char *name)

2.3.2 初始化設(shè)備

對(duì)應(yīng)底層rt_err_t (*init) (rt_device_t dev); 的實(shí)現(xiàn)函數(shù):

/**
參數(shù) 	描述
dev 	設(shè)備句柄
返回 	——
RT_EOK 	設(shè)備初始化成功
錯(cuò)誤碼 	設(shè)備初始化失敗
 */
rt_err_t rt_device_init(rt_device_t dev)

當(dāng)一個(gè)設(shè)備已經(jīng)初始化成功后,調(diào)用這個(gè)接口將不再重復(fù)做初始化 0。

2.3.3 打開(kāi)和關(guān)閉設(shè)備

打開(kāi)設(shè)備:

對(duì)應(yīng)底層rt_err_t (*open) (rt_device_t dev, rt_uint16_t oflag); 的實(shí)現(xiàn)函數(shù):

/*
參數(shù) 	描述
dev 	設(shè)備句柄
oflags 	設(shè)備打開(kāi)模式標(biāo)志,上面 2.1.3 小結(jié)說(shuō)明的設(shè)備訪問(wèn) open_flag
返回 	——
RT_EOK 	設(shè)備打開(kāi)成功
-RT_EBUSY 	如果設(shè)備注冊(cè)時(shí)指定的參數(shù)中包括 RT_DEVICE_FLAG_STANDALONE 參數(shù),此設(shè)備將不允許重復(fù)打開(kāi)
其他錯(cuò)誤碼 	設(shè)備打開(kāi)失敗
*/
rt_err_t  rt_device_open (rt_device_t dev, rt_uint16_t oflag);

#define RT_DEVICE_FLAG_INT_RX           0x100           /**< INT mode on Rx */
#define RT_DEVICE_FLAG_DMA_RX           0x200           /**< DMA mode on Rx */
#define RT_DEVICE_FLAG_INT_TX           0x400           /**< INT mode on Tx */
#define RT_DEVICE_FLAG_DMA_TX           0x800           /**< DMA mode on Tx */

#define RT_DEVICE_OFLAG_CLOSE           0x000           /**< 設(shè)備已經(jīng)關(guān)閉(內(nèi)部使用) */
#define RT_DEVICE_OFLAG_RDONLY          0x001           /**< read only access */
#define RT_DEVICE_OFLAG_WRONLY          0x002           /**< write only access */
#define RT_DEVICE_OFLAG_RDWR            0x003           /**< read and write */
#define RT_DEVICE_OFLAG_OPEN            0x008           /**< device is opened */
#define RT_DEVICE_OFLAG_MASK            0xf0f           /**< mask of open flag */

注:如果上層應(yīng)用程序需要設(shè)置設(shè)備的接收回調(diào)函數(shù),則必須以 RT_DEVICE_FLAG_INT_RX 或者 RT_DEVICE_FLAG_DMA_RX 的方式打開(kāi)設(shè)備,否則不會(huì)回調(diào)函數(shù)。

關(guān)閉設(shè)備:

對(duì)應(yīng)底層rt_err_t (*close) (rt_device_t dev); 的實(shí)現(xiàn)函數(shù):

/*
dev 	設(shè)備句柄
返回 	——
RT_EOK 	關(guān)閉設(shè)備成功
-RT_ERROR 	設(shè)備已經(jīng)完全關(guān)閉,不能重復(fù)關(guān)閉設(shè)備
其他錯(cuò)誤碼 	關(guān)閉設(shè)備失敗
*/
rt_err_t  rt_device_open (rt_device_t dev, rt_uint16_t oflag);

關(guān)閉設(shè)備接口和打開(kāi)設(shè)備接口需配對(duì)使用,打開(kāi)一次設(shè)備對(duì)應(yīng)要關(guān)閉一次設(shè)備,這樣設(shè)備才會(huì)被完全關(guān)閉,否則設(shè)備仍處于未關(guān)閉狀態(tài)。

2.3.4 讀寫(xiě)設(shè)備

讀設(shè)備:

對(duì)應(yīng)底層rt_size_t (*read) (rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size); 的實(shí)現(xiàn)函數(shù):

/**
參數(shù) 	描述
dev 	設(shè)備句柄
pos 	讀取數(shù)據(jù)偏移量
buffer 	內(nèi)存緩沖區(qū)指針,讀取的數(shù)據(jù)將會(huì)被保存在緩沖區(qū)中
size 	讀取數(shù)據(jù)的大小
返回 	——
讀到數(shù)據(jù)的實(shí)際大小 	如果是字符設(shè)備,返回大小以字節(jié)為單位,如果是塊設(shè)備,返回的大小以塊為單位
0 	需要讀取當(dāng)前線程的 errno 來(lái)判斷錯(cuò)誤狀態(tài)
 */
rt_size_t rt_device_read(rt_device_t dev,
                         rt_off_t    pos,
                         void       *buffer,
                         rt_size_t   size)

調(diào)用這個(gè)函數(shù),會(huì)從 dev 設(shè)備中讀取數(shù)據(jù),并存放在 buffer 緩沖區(qū)中,這個(gè)緩沖區(qū)的最大長(zhǎng)度是 size,pos 根據(jù)不同的設(shè)備類別有不同的意義。

寫(xiě)設(shè)備:

對(duì)應(yīng)底層rt_size_t (*write) (rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size); 的實(shí)現(xiàn)函數(shù):

/**
參數(shù) 	描述
dev 	設(shè)備句柄
pos 	寫(xiě)入數(shù)據(jù)偏移量
buffer 	內(nèi)存緩沖區(qū)指針,放置要寫(xiě)入的數(shù)據(jù)
size 	寫(xiě)入數(shù)據(jù)的大小
返回 	——
寫(xiě)入數(shù)據(jù)的實(shí)際大小 	如果是字符設(shè)備,返回大小以字節(jié)為單位;如果是塊設(shè)備,返回的大小以塊為單位
0 	需要讀取當(dāng)前線程的 errno 來(lái)判斷錯(cuò)誤狀態(tài)
 */
rt_size_t rt_device_write(rt_device_t dev,
                          rt_off_t    pos,
                          const void *buffer,
                          rt_size_t   size)

調(diào)用這個(gè)函數(shù),會(huì)把緩沖區(qū) buffer 中的數(shù)據(jù)寫(xiě)入到設(shè)備 dev 中,寫(xiě)入數(shù)據(jù)的最大長(zhǎng)度是 size,pos 根據(jù)不同的設(shè)備類別存在不同的意義。

2.3.5 控制設(shè)備

對(duì)應(yīng)底層rt_err_t (*control)(rt_device_t dev, int cmd, void *args); 的實(shí)現(xiàn)函數(shù):

/**
參數(shù) 	描述
dev 	設(shè)備句柄
cmd 	命令控制字,這個(gè)參數(shù)通常與設(shè)備驅(qū)動(dòng)程序相關(guān),見(jiàn)下面列出的參數(shù)
arg 	控制的參數(shù)
返回 	——
RT_EOK 		函數(shù)執(zhí)行成功
-RT_ENOSYS 	執(zhí)行失敗,dev 為空
其他錯(cuò)誤碼 	執(zhí)行失敗
 */
rt_err_t rt_device_control(rt_device_t dev, int cmd, void *arg)


/**
 * general device commands 上面 cmd 的參數(shù)
 */
#define RT_DEVICE_CTRL_RESUME           0x01            /**< resume device */
#define RT_DEVICE_CTRL_SUSPEND          0x02            /**< suspend device */
#define RT_DEVICE_CTRL_CONFIG           0x03            /**< configure device */
#define RT_DEVICE_CTRL_CLOSE            0x04            /**< close device */

#define RT_DEVICE_CTRL_SET_INT          0x10            /**< set interrupt */
#define RT_DEVICE_CTRL_CLR_INT          0x11            /**< clear interrupt */
#define RT_DEVICE_CTRL_GET_INT          0x12            /**< get interrupt status */

2.3.6 數(shù)據(jù)收發(fā)回調(diào)

這個(gè)對(duì)于 設(shè)備控制塊中參數(shù)中的兩個(gè)設(shè)備回調(diào)函數(shù):

poYBAGK9DJmAQ-FvAAAjUuLwMOc015.png

硬件設(shè)備收到數(shù)據(jù):

/**
參數(shù) 	描述
dev 	設(shè)備句柄
rx_ind 	回調(diào)函數(shù)指針
返回 	——
RT_EOK 	設(shè)置成功
 */
rt_err_t
rt_device_set_rx_indicate(rt_device_t dev,
                          rt_err_t (*rx_ind)(rt_device_t dev, rt_size_t size))

該函數(shù)的回調(diào)函數(shù)由調(diào)用者提供。當(dāng)硬件設(shè)備接收到數(shù)據(jù)時(shí),會(huì)回調(diào)這個(gè)函數(shù)并把收到的數(shù)據(jù)長(zhǎng)度放在 size 參數(shù)中傳遞給上層應(yīng)用。上層應(yīng)用線程應(yīng)在收到指示后,立刻從設(shè)備中讀取數(shù)據(jù)。

硬件設(shè)備發(fā)送數(shù)據(jù):

在應(yīng)用程序調(diào)用 rt_device_write() 寫(xiě)入數(shù)據(jù)時(shí),如果底層硬件能夠支持自動(dòng)發(fā)送,那么上層應(yīng)用可以設(shè)置一個(gè)回調(diào)函數(shù)。
這個(gè)回調(diào)函數(shù)會(huì)在底層硬件數(shù)據(jù)發(fā)送完成后 (例如 DMA 傳送完成或 FIFO 已經(jīng)寫(xiě)入完畢產(chǎn)生完成中斷時(shí)) 調(diào)用。

通過(guò)如下函數(shù)設(shè)置設(shè)備發(fā)送完成指示:

/**
參數(shù) 	描述
dev 	設(shè)備句柄
tx_done 	回調(diào)函數(shù)指針
返回 	——
RT_EOK 	設(shè)置成功
 */
rt_err_t
rt_device_set_tx_complete(rt_device_t dev,
                          rt_err_t (*tx_done)(rt_device_t dev, void *buffer))

調(diào)用這個(gè)函數(shù)時(shí),回調(diào)函數(shù)由調(diào)用者提供,當(dāng)硬件設(shè)備發(fā)送完數(shù)據(jù)時(shí),由驅(qū)動(dòng)程序回調(diào)這個(gè)函數(shù)并把發(fā)送完成的數(shù)據(jù)塊地址 buffer 作為參數(shù)傳遞給上層應(yīng)用。上層應(yīng)用(線程)在收到指示時(shí)會(huì)根據(jù)發(fā)送 buffer 的情況,釋放 buffer 內(nèi)存塊或?qū)⑵渥鳛橄乱粋€(gè)寫(xiě)數(shù)據(jù)的緩存。

?? 訪問(wèn) I/O 設(shè)備相關(guān)的函數(shù),和 I/O 設(shè)備模型框架中 應(yīng)用程序 有關(guān),是我們上層寫(xiě)應(yīng)用程序直接調(diào)用的函數(shù)。

三、新建 I/O 設(shè)備模型實(shí)例

RT-Thread 驅(qū)動(dòng)都是在 drivers 目錄下面:

poYBAGK9DJmAYVBuAABCG9j0hGQ134.png

我們?cè)谀夸浵滦陆ㄒ粋€(gè)文件,作為驅(qū)動(dòng)示例:

pYYBAGK9DJmAbSWvAADKwnU6FFs295.png

我們寫(xiě)一個(gè)簡(jiǎn)單的基本框架:

1、創(chuàng)建一個(gè)設(shè)備;
   使用 rt_device_create 創(chuàng)建一個(gè)設(shè)備,需要定義一個(gè) rt_device_t 接口體接收設(shè)備設(shè)備句柄。

2、實(shí)現(xiàn)設(shè)備操作的函數(shù):
   實(shí)現(xiàn)設(shè)備對(duì)象中對(duì)于 設(shè)備操作的init,open,close等 函數(shù)。

3、注冊(cè)設(shè)備到 I/O 設(shè)備管理器;
   使用 rt_device_register 將設(shè)備注冊(cè)到設(shè)備管理器。

drv_demo.c中,我們實(shí)現(xiàn)如下代碼:

poYBAGK9DJmALQEkAABuTuaInAY314.png

其次,我們需要實(shí)現(xiàn)一下設(shè)備操作的函數(shù):

pYYBAGK9DJqAQYcpAABPqLr1W74608.png

最后,別忘了使用 INIT_BOARD_EXPORT 把設(shè)備初始化的代碼加入板級(jí)硬件初始化:

poYBAGK9DJqABG66AAAffT8TlJ8363.png

上一下設(shè)備模型實(shí)例代碼:

#include 
#include 

rt_err_t  demo_init(rt_device_t dev)
{
    rt_kprintf("demo_init ok!\n");
    return 0;
}
rt_err_t  demo_open(rt_device_t dev, rt_uint16_t oflag)
{
    rt_kprintf("demo_open ok!\n");
    return 0;
}
rt_err_t  demo_cloes(rt_device_t dev)
{
    rt_kprintf("demo_cloes ok!\n");
    return 0;
}

int rt_drvdemo_init(void){

    rt_device_t demo_dev = RT_NULL;

    demo_dev = rt_device_create(RT_Device_Class_Char, 0);
    if(demo_dev == RT_NULL){
        LOG_E("demo device create failed...\n");
        return -1;
    }

    demo_dev->init=demo_init;
    demo_dev->open=demo_open;
    demo_dev->close=demo_cloes;

    rt_device_register(demo_dev,"drvdemo",RT_DEVICE_FLAG_RDWR);
    return 0;
}


INIT_BOARD_EXPORT(rt_drvdemo_init);

上面我們完成的是 設(shè)備驅(qū)動(dòng)層的 代碼,接下來(lái)我們還需要簡(jiǎn)單演示一下,如果在應(yīng)用層 使用這個(gè) demo 設(shè)備。

我們根據(jù)上文所介紹的 訪問(wèn) I/O 設(shè)備 進(jìn)行對(duì)應(yīng)操作,這里直接上圖說(shuō)明一下使用流程:

pYYBAGK9DJqAJv7QAACs50bc4uU608.png

看一下測(cè)試結(jié)果,我們實(shí)現(xiàn)的 3 個(gè)驅(qū)動(dòng)函數(shù)都只有打印輸出,所以我們可以通過(guò)打印信息查看是否正確執(zhí)行的驅(qū)動(dòng)函數(shù)的內(nèi)容:

poYBAGK9DJqAR76DAACrGvu2Bvw047.png

通過(guò)上面的測(cè)試,我們實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的設(shè)備驅(qū)動(dòng)的設(shè)計(jì),雖然demo比較簡(jiǎn)單,但是經(jīng)過(guò)這么一個(gè)過(guò)程可以讓我們更加的理解 RT-Thread I/O 設(shè)備模型的工作方式和流程。

結(jié)語(yǔ)

本文全面了解了 RT-Thread I/O 設(shè)備模型,說(shuō)明了設(shè)備模型存在的意義,描述了一下設(shè)備模型相關(guān)的操作函數(shù),最后使用了一個(gè)新建 I/O設(shè)備模型的例子,說(shuō)明了 I/O 設(shè)備模型 的工作方式。

在我們使用 RT-Thread 的時(shí)候,其實(shí)大部分常用的設(shè)備 RT-Thread 已經(jīng)幫我們寫(xiě)好了驅(qū)動(dòng),我們直接在應(yīng)用層調(diào)用操作接口即可,接下來(lái)的系列文章我們將要學(xué)習(xí) RT-Thread 常用的 I/O 設(shè)備模型。


?? 希望開(kāi)頭的愿景能夠?qū)崿F(xiàn),通過(guò)本文讓所有人了解 RT-Thread I/O 設(shè)備模型 (* ̄︶ ̄) ??

本文就到這里,謝謝大家!

審核編輯:湯梓紅

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

    關(guān)注

    4

    文章

    1432

    瀏覽量

    42363
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11583

    瀏覽量

    217323
  • 模型
    +關(guān)注

    關(guān)注

    1

    文章

    3622

    瀏覽量

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

    關(guān)注

    32

    文章

    1512

    瀏覽量

    43979
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    首搭RT-Thread程翧車控平臺(tái)| RT-Thread程翧 S32K344 快速原型開(kāi)發(fā)平臺(tái)正式上市!| 產(chǎn)品動(dòng)態(tài)

    在智能汽車邁向高集成與高安全的時(shí)代,VCU/ECU開(kāi)發(fā)正面臨效率與可靠性的雙重考驗(yàn)。依賴單一硬件或拼湊軟件方案的傳統(tǒng)模式,已成為制約創(chuàng)新的瓶頸。為此,RT-Thread帶來(lái)里程碑式的解決方案
    的頭像 發(fā)表于 10-31 11:53 ?239次閱讀
    首搭<b class='flag-5'>RT-Thread</b>程翧車控平臺(tái)| <b class='flag-5'>RT-Thread</b>程翧 S32K344 快速原型開(kāi)發(fā)平臺(tái)正式上市!| 產(chǎn)品動(dòng)態(tài)

    基于RT-Thread的EK-RA2E2 設(shè)備驅(qū)動(dòng)移植與應(yīng)用 | 技術(shù)集結(jié)

    目錄前言環(huán)境配置HelloRT-ThreadGPIO輸入與中斷I2C主機(jī)驅(qū)動(dòng)SPI主機(jī)驅(qū)動(dòng)ADC設(shè)備驅(qū)動(dòng)PWM設(shè)備驅(qū)動(dòng)Flash設(shè)備驅(qū)動(dòng)WDT設(shè)備
    的頭像 發(fā)表于 10-05 10:06 ?5536次閱讀
    基于<b class='flag-5'>RT-Thread</b>的EK-RA2E2 <b class='flag-5'>設(shè)備</b>驅(qū)動(dòng)移植與應(yīng)用 | 技術(shù)集結(jié)

    2025年RT-Thread開(kāi)發(fā)者巡回培訓(xùn)報(bào)名正式啟動(dòng)!

    親愛(ài)的RT-Thread社區(qū)成員們:新程再啟,共赴熱愛(ài)!2025年RT-Thread開(kāi)發(fā)者巡回培訓(xùn)正式啟動(dòng)報(bào)名!今年,我們選擇了西安、武漢、北京、杭州、深圳、上海、成都這7座城市,為大家?guī)?lái)
    的頭像 發(fā)表于 09-27 10:39 ?826次閱讀
    2025年<b class='flag-5'>RT-Thread</b>開(kāi)發(fā)者巡回培訓(xùn)報(bào)名正式啟動(dòng)!

    使用RT-Thread studio 開(kāi)發(fā)RT-Thread Nano項(xiàng)目的時(shí)候 串口的驅(qū)動(dòng)是要自己寫(xiě)嗎?

    剛?cè)肟?。使?b class='flag-5'>RT-Thread studio 開(kāi)發(fā)RT-Thread 標(biāo)準(zhǔn)板項(xiàng)目的時(shí)候直接使用里邊的串口uart_dev=rt_device_find(“uart5”);然后操作設(shè)備,
    發(fā)表于 09-26 08:14

    rt-thread studio 2.2.9如何使用最新的RT-Thread v5.2.0 released?

    rt-thread studio2.2.9如何使用最新的RT-Thread v5.2.0 released? 原先以為修改index_all.json,發(fā)現(xiàn)聯(lián)網(wǎng)的時(shí)候,會(huì)自動(dòng)覆蓋 另lastet版本
    發(fā)表于 09-16 06:06

    【好書(shū)推薦】RT-Thread第20本相關(guān)書(shū)籍!《嵌入式實(shí)時(shí)操作系統(tǒng)RT-Thread原理與應(yīng)用》| 技術(shù)集結(jié)

    01內(nèi)容簡(jiǎn)介ContentSummary本書(shū)為讀者提供了一個(gè)全面、系統(tǒng)的RT-Thread學(xué)習(xí)指南,旨在幫助初學(xué)者及有經(jīng)驗(yàn)的開(kāi)發(fā)者掌握RT-Thread實(shí)時(shí)操作系統(tǒng)和STM32嵌入式微控制器的核心
    的頭像 發(fā)表于 08-24 10:05 ?587次閱讀
    【好書(shū)推薦】<b class='flag-5'>RT-Thread</b>第20本相關(guān)書(shū)籍!《嵌入式實(shí)時(shí)操作系統(tǒng)<b class='flag-5'>RT-Thread</b>原理與應(yīng)用》| 技術(shù)集結(jié)

    RT-Thread攜手玄鐵,全面展示 RISC-V 生態(tài)最新成果,期待蒞臨!

    ,全面展示RISC-V生態(tài)最新成果。E10展臺(tái),期待您的蒞臨!展區(qū)活動(dòng)內(nèi)容現(xiàn)已公布,歡迎下滑掃碼,親臨現(xiàn)場(chǎng)互動(dòng)交流!7月16日上海張江科學(xué)會(huì)堂,RT-Thread
    的頭像 發(fā)表于 07-15 11:13 ?747次閱讀
    <b class='flag-5'>RT-Thread</b>攜手玄鐵,<b class='flag-5'>全面</b>展示 RISC-V 生態(tài)最新成果,期待蒞臨!

    RT-Thread榮獲2025優(yōu)秀開(kāi)源項(xiàng)目 | 新聞速遞

    6月底,RT-Thread睿賽德受邀參與由上海開(kāi)源信息技術(shù)協(xié)會(huì)主辦的2025上海開(kāi)源創(chuàng)新精英薈。上海市商委副主任張杰出席會(huì)議并致辭。RT-Thread嵌入式操作系統(tǒng)項(xiàng)目憑借其卓越的技術(shù)創(chuàng)新與開(kāi)源生態(tài)
    的頭像 發(fā)表于 07-04 09:04 ?2284次閱讀
    <b class='flag-5'>RT-Thread</b>榮獲2025優(yōu)秀開(kāi)源項(xiàng)目 | 新聞速遞

    RT-Thread BSP全面支持玄鐵全系列RISC-V 處理器 | 技術(shù)集結(jié)

    ,RT-Thread標(biāo)準(zhǔn)版已全面適配玄鐵E、R、C系列內(nèi)核,并在C906內(nèi)核上支持RT-Smart微內(nèi)核操作系統(tǒng)。本文將以E906運(yùn)行RT-Thread和C906運(yùn)行
    的頭像 發(fā)表于 07-03 18:03 ?2388次閱讀
    <b class='flag-5'>RT-Thread</b> BSP<b class='flag-5'>全面</b>支持玄鐵全系列RISC-V 處理器 | 技術(shù)集結(jié)

    揭秘RT-Thread上的AUTOSAR CP系統(tǒng)

    本文探討了RT-Thread與AUTOSARCP的融合,解決車載ECU開(kāi)發(fā)中實(shí)時(shí)性、安全性與靈活性的平衡問(wèn)題。通過(guò)分層安全內(nèi)核(rt-safetyos/autoos)和工具鏈整合,兼容AUTOSAR
    的頭像 發(fā)表于 06-23 20:22 ?2795次閱讀
    揭秘<b class='flag-5'>RT-Thread</b>上的AUTOSAR CP系統(tǒng)

    RT-Thread審核團(tuán)招募: 深度參與開(kāi)源RTOS社區(qū)治理與演進(jìn)

    全球開(kāi)發(fā)者招募:RT-Thread審核團(tuán)(ReviewTeam)正式開(kāi)放申請(qǐng)!在開(kāi)源的世界里,代碼審查(CodeReview)是保證軟件質(zhì)量、促進(jìn)技術(shù)交流的關(guān)鍵環(huán)節(jié)。RT-Thread作為全球領(lǐng)先
    的頭像 發(fā)表于 05-21 18:02 ?974次閱讀
    <b class='flag-5'>RT-Thread</b>審核團(tuán)招募: 深度參與開(kāi)源RTOS社區(qū)治理與演進(jìn)

    如何將RT-Thread移植到NXP MCUXPressoIDE上

    RT-Thread默認(rèn)支持的IDE只有IAR 和 Keil, 那如何將RT-Thread移植到NXP MCUXPressoIDE上呢?本文內(nèi)容比較簡(jiǎn)單但稍有瑣碎,希望對(duì)有需要的小伙伴有所幫助。
    的頭像 發(fā)表于 02-13 10:37 ?2295次閱讀
    如何將<b class='flag-5'>RT-Thread</b>移植到NXP MCUXPressoIDE上

    Deepseek上單片機(jī)?RT-Thread上跑通大語(yǔ)言模型

    前言單片機(jī)也能聊天?RT-Thread上跑通大語(yǔ)言模型RT-Thread論壇上忽然看到了單片機(jī)和大模型對(duì)話的文章,想著春節(jié)期間看到大語(yǔ)言模型
    的頭像 發(fā)表于 02-07 18:59 ?2255次閱讀
    Deepseek上單片機(jī)?<b class='flag-5'>RT-Thread</b>上跑通大語(yǔ)言<b class='flag-5'>模型</b>

    RT-Smart首次線下培訓(xùn),鎖定2024 RT-Thread開(kāi)發(fā)者大會(huì)!

    2024年RT-Thread開(kāi)發(fā)者大會(huì)將于12月21日正式拉開(kāi)帷幕!本次大會(huì)以“開(kāi)源共生商業(yè)共贏”為主題,RT-Thread將攜手合作伙伴、客戶伙伴、行業(yè)專家,以及全球開(kāi)發(fā)者,共同探索如何在開(kāi)源
    的頭像 發(fā)表于 12-11 18:41 ?2792次閱讀
    <b class='flag-5'>RT</b>-Smart首次線下培訓(xùn),鎖定2024 <b class='flag-5'>RT-Thread</b>開(kāi)發(fā)者大會(huì)!

    RT-Thread上CAN實(shí)踐

    開(kāi)箱測(cè)試RT-Thread官方已完成了對(duì)英飛凌XMC7200EVK的移植,通過(guò)shell可以看到做好了uart3的console。本文將介紹如何進(jìn)行RT-ThreadCan移植。接下來(lái)我們要完成CAN_FD的驅(qū)動(dòng)移植,并正常啟動(dòng)RT-T
    的頭像 發(fā)表于 11-13 01:03 ?2689次閱讀
    <b class='flag-5'>RT-Thread</b>上CAN實(shí)踐