rtt的io設備框架面向對象學習-io設備管理層

目錄

    • 1.設備基類
    • 2.rtt基類
      • 2.1 rtt基類定義
      • 2.2 對象容器定義
      • 2.3 rtt基類構造函數
    • 3.io設備管理接口
    • 4.總結

這層我的理解就是rtt基類和設備基類所在,所以抽離出來好點,不然每個設備類都要重復它。

在這里插入圖片描述

1.設備基類

/include/rtdef.h中定義了設備基類struct rt_device。

在/ components / drivers / core 下的device.c中實現了設備基類的構造函數rt_device_register。

rt_err_t rt_device_register(rt_device_t dev,const char *name,rt_uint16_t flags)
{if (dev == RT_NULL)return -RT_ERROR;if (rt_device_find(name) != RT_NULL)return -RT_ERROR;rt_object_init(&(dev->parent), RT_Object_Class_Device, name);dev->flag = flags;dev->ref_count = 0;dev->open_flag = 0;#ifdef RT_USING_POSIX_DEVIOdev->fops = RT_NULL;rt_wqueue_init(&(dev->wait_queue));
#endif /* RT_USING_POSIX_DEVIO */return RT_EOK;
}

可以看到它主要調用了rtt基類的構造函數rt_object_init。

2.rtt基類

2.1 rtt基類定義

/include/rtdef.h中定義了rtt基類。類似python,rtt定義了所有類的基類——struct rt_object。

struct rt_object
{
#if RT_NAME_MAX > 0char        name[RT_NAME_MAX]; /**< dynamic name of kernel object */
#elseconst char *name;  /**< static name of kernel object */
#endif /* RT_NAME_MAX > 0 */rt_uint8_t  type;    /**< type of kernel object */rt_uint8_t  flag;    /**< flag of kernel object */#ifdef RT_USING_MODULEvoid      * module_id;  /**< id of application module */
#endif /* RT_USING_MODULE */#ifdef RT_USING_SMARTrt_atomic_t lwp_ref_count;   /**< ref count for lwp */
#endif /* RT_USING_SMART */rt_list_t   list;  /**< list node of kernel object */
};
typedef struct rt_object *rt_object_t;  /**< Type for kernel objects. */

簡化對象圖如下
在這里插入圖片描述

2.2 對象容器定義

在/src/object.c中定義了對象容器:
static struct rt_object_information _object_container[RT_Object_Info_Unknown];

就個數組。

struct rt_object_information如下
在這里插入圖片描述

2.3 rtt基類構造函數

在/src/object.c中實現了rtt基類的構造函數:
靜態rtt基類的構造函數 rt_object_init 與析構函數 rt_object_detach。
動態創建的rtt基類構造函數 rt_object_allocate 與析構函數 rt_object_delete。

不管動態還是靜態構造函數,它最終的目的是把該對象的基類rt_object的成員list的成員next和prev指針掛到對象容器里——可以理解為把對象放到對象對象容器中管理。
代碼示意圖如下:
請添加圖片描述
可以看到實際容器的實現是個靜態數組而已,每個數組成員代表一類(線程、定時器等),我們這里是設備類,自然掛到設備類成員管理的鏈表中,它是個雙向循環鏈表,插入方式是新的設備對象的基類是插入到隊尾的。

為了好繪制鏈表,我就把rt_object的list成員展開成了struct rt_list_node *next;和struct rt_list_node *prev。如下
在這里插入圖片描述
同樣rt_object_information的list成員也展開成了struct rt_list_node *next;和struct rt_list_node *prev。如下
在這里插入圖片描述

官網文檔里的容器圖(又高度抽象了):
在這里插入圖片描述
但是如果對象太多,查找效率是個問題。

3.io設備管理接口

io設備管理接口是用戶可以直接調用的接口,如下
rt_device_find
rt_device_init
rt_device_open
rt_device_close
rt_device_read
rt_device_write
rt_device_control

一般,我們定義完一個結構體,實例化一個對象后,直接p->屬性或方法、或者采用p.屬性或方法的方式來調用,但是如果太復雜,需要if判斷一對上下限才能調用的話,最好封成函數,上面的管理接口干的事就是如此。

4.總結

從構造函數的流程來看,是子類調用父類的構造函數,所以章節1設為了設備基類,章節2為rtt基類。
每類都有各自的構造函數,其實質是各自結構體的初始化。
這樣,構造函數的流程結果最終是把對象放到對象容器里進行管理。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/717974.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/717974.shtml
英文地址,請注明出處:http://en.pswp.cn/news/717974.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

記錄踩過的坑-PyTorch

安裝報錯 按PyTorch官網給出的命令 pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 報錯 ERROR: Could not find a version that satisfies the requirement torch (from versions: none) ERROR: No matching distributio…

Redis為什么這么快?

基于內存&#xff1a;Redis 將數據存儲在內存中&#xff0c;內存訪問速度遠高于磁盤訪問速度&#xff0c;因此能夠快速讀寫數據。單線程模型&#xff1a;Redis 使用單線程模型來處理客戶端請求&#xff0c;避免了多線程之間的切換開銷&#xff0c;簡化了并發控制&#xff0c;提…

STM32(11)按鍵產生中斷

1.初始化IO引腳&#xff0c;設置模式&#xff0c;速度等 2.設置AFIO&#xff08;配置EXTI的引腳映射&#xff09;&#xff0c;記得開啟時鐘 3.配置EXTI的通道&#xff08;EXTI0和EXTI1&#xff09; 4.配置NVIC 4.1 中斷優先級分組 4.2 配置中斷 5.編寫中斷響應函數 在中斷向量…

消息隊列的實現

8.8 消息隊列 隊列是一種先進先出的結構&#xff0c;消息隊列是進程(線程)常用的一種方法&#xff0c;實現消息隊列常用的方法&#xff1a; &#xff08;1&#xff09;阻塞隊列 &#xff08;2&#xff09;無鎖隊列 &#xff08;3&#xff09;環形隊列 值得注意的是&#xff…

藍橋ACM培訓-實戰1

前言&#xff1a; 今天老師沒講課&#xff0c;只讓我們做了一下幾道題目。 正文&#xff1a; Problem:A 小藍與操作序列&#xff1a; #include<bits/stdc.h> using namespace std; stack<int> a; int main(){int n,flag1,ans;string cz;cin>>n;for(int i1;…

訪問修飾符、Object(方法,使用、equals)、查看equals底層、final--學習JavaEE的day15

day15 一、訪問修飾符 含義&#xff1a; 修飾類、方法、屬性&#xff0c;定義使用的范圍 理解&#xff1a;給類、方法、屬性定義訪問權限的關鍵字 注意&#xff1a; ? 1.修飾類只能使用public和默認的訪問權限 ? 2.修飾方法和屬性可以使用所有的訪問權限 訪問修飾符本類本包…

JetCache源碼解析——API實現(持續更新中……)

在JetCache中不僅可以通過在類和接口的函數上使用注解Cached、CacheUpdate和CacheInvalidate等實現緩存加載、更新和刪除操作&#xff0c;也支持通過調用API接口的形式來實現緩存的加載、更新和刪除操作。 緩存接口 緩存接口的定義如下&#xff1a; /*** 緩存接口&#xff0…

【計算機網絡】HTTPS 協議原理

https 一、HTTPS 是什么二、加密1. 加密概念2. 加密的原因3. 常見的加密方式&#xff08;1&#xff09;對稱加密&#xff08;2&#xff09;非對稱加密 三、數據摘要(數據指紋)四、HTTPS 的工作原理探究1. 只使用對稱加密2. 只使用非對稱加密3. 雙方都使用非對稱加密4. 非對稱加…

Linux:kubernetes(k8s)部署CNI網絡插件(4)

在上一章進行了node加入master Linux&#xff1a;kubernetes&#xff08;k8s&#xff09;node節點加入master主節點&#xff08;3&#xff09;-CSDN博客https://blog.csdn.net/w14768855/article/details/136420447?spm1001.2014.3001.5501 但是他們顯示還是沒準備好 看一下…

面試筆記系列五之MySql+Mybaits基礎知識點整理及常見面試題

目錄 Myibatis myibatis執行過程 mybatis的優缺點有哪些&#xff1f; mybatis和hibernate有什么區別&#xff1f; mybatis中#{}和${}的區別是什么&#xff1f; 簡述一下mybatis插件運行原理及開發流程&#xff1f;&#xff08;插件四大天王&#xff09; mybatis的mapper沒…

2.模擬問題——5.星期幾與字符串對應

輸入輸出示例 輸入&#xff1a; 9 October 2001 14 October 2001 輸出&#xff1a; Tuesday Sunday 【原題鏈接】 字符串處理 C風格的字符串 字符數組&#xff0c;以’\0‘結尾建議在輸入輸出語句中使用 C風格的字符串 #include <string> using namespace std;初始化…

「優選算法刷題」:最長回文子串

一、題目 給你一個字符串 s&#xff0c;找到 s 中最長的回文子串。 如果字符串的反序與原始字符串相同&#xff0c;則該字符串稱為回文字符串。 示例 1&#xff1a; 輸入&#xff1a;s "babad" 輸出&#xff1a;"bab" 解釋&#xff1a;"aba"…

【字符串】馬拉車(Manacher)算法

本篇文章參考&#xff1a;比較易懂的 Manacher&#xff08;馬拉車&#xff09;算法配圖詳解 馬拉車算法可以求出一個字符串中的最長回文子串&#xff0c;時間復雜度 O ( n ) O(n) O(n) 因為字符串長度的奇偶性&#xff0c;回文子串的中心可能是一個字符&#xff0c;也可能是…

uniapp聊天記錄本地存儲(詳細易懂)

目錄 目錄 1、通過websocket拿取數據 2、獲取聊天數據 3、聊天信息存儲 、更新 4、讀取聊天記錄 5、發送信息&#xff0c;信息獲取 6、最終效果 1.聊天信息的存儲格式 2、樣式效果 寫聊天項目&#xff0c;使用到了本地存儲。需要把聊天信息保存在本地&#xff0c;實時獲…

GPT對話知識庫——ARM-Cortex架構分為哪幾個系列?每個系列有幾種工作模式?各種工作模式之間的定義和區別?每種架構不同的特點和應用需求?

提問模型&#xff1a;GPT-4-TURBO-PREVIEW 提問時間&#xff1a;2024.03.02 1&#xff0c;問&#xff1a; Cortex-M系列有幾種工作模式 1&#xff0c;答&#xff1a; Cortex-M系列微控制器是ARM公司開發的一類低功耗、高性能的32位微處理器&#xff0c;廣泛應用于嵌入式系統中…

Centos7使用man查找命令時,報錯No manual entry for xxxx

Centos7使用man查找命令時&#xff0c;報錯No manual entry for xxxx 在Linux中使用man指令查找指令信息時&#xff0c;報No manual entry for xxxx。 比如使用man指令查找sleep3號手冊時&#xff0c;出現以下錯誤&#xff1a; 這是由于沒有安裝man-pages這個rpm包導致的&#…

掌握基本排序算法:冒泡、選擇、插入和快速排序

在計算機科學的世界里&#xff0c;排序是一項基本而重要的操作。無論是數據庫管理、搜索引擎&#xff0c;還是日常編程&#xff0c;高效的排序算法都是提高性能的關鍵。本文將介紹四種基本的排序算法&#xff1a;冒泡排序、選擇排序、插入排序和快速排序&#xff0c;并探討它們…

從0開始學習NEON(1)

1、前言 在上個博客中對NEON有了基礎的了解&#xff0c;本文將針對一個圖像下采樣的例子對NEON進行學習。 學習鏈接:CPU優化技術 - NEON 開發進階 上文鏈接:https://blog.csdn.net/weixin_42108183/article/details/136412104 2、第一個例子 現在有一張圖片&#xff0c;需…

獲取 Windows 通知中心彈窗通知內容(含工具漢化)

目錄 前言 技術原理概述 測試代碼和程序下載連接 本文出處鏈接&#xff1a;https://blog.csdn.net/qq_59075481/article/details/136440280。 前言 從 Windows 8.1 開始&#xff0c;Windows 通知現在以 Toast 而非 Balloon 形式顯示&#xff08; Bollon 通知其實現在是應用…

在ubuntu上安裝hadoop完分布式

準備工作 Xshell安裝包 Xftp7安裝包 虛擬機安裝包 Ubuntu鏡像源文件 Hadoop包 Java包 一、安裝虛擬機 創建ubuntu系統 完成之后會彈出一個新的窗口 跑完之后會重啟一下 按住首先用ctrlaltf3進入命令界面&#xff0c;輸入root&#xff0c;密碼登錄管理員賬號 按Esc 然后輸入 …