如何從rtthread_startup看RT-Thread內核數據結構

這期內容當中小編將會給大家帶來有關如何從rtthread_startup看RT-Thread 內核數據結構,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

創新互聯公司是少有的成都網站建設、網站制作、營銷型企業網站、小程序設計、手機APP,開發、制作、設計、買鏈接、推廣優化一站式服務網絡公司,從2013年創立,堅持透明化,價格低,無套路經營理念。讓網頁驚喜每一位訪客多年來深受用戶好評

下面不分析 RT-Thread 中任務調度,任務管理等實現,只以 RT-Thread 中鏈表為線索,整理出整個 RT-Thread 重要的數據結構及其關聯,使讀者分析內核時有個大體的認識,也歡迎大家指正錯誤。

先看看 rtthread_startup:

開始分析之前先做幾個說明,RT-Thread 中用的最多的是雙向循環鏈表,而且是插入式鏈表,這樣的鏈表只起鏈接作用,本身不攜帶數據,因此可以插入到各種自定義的結構體中,這些不同的結構體也能靈活的連接起來。這也是個人最喜歡的地方,對比 ucos 一個結構體一個鏈表的臃腫設計,RT-Thread 這個設計方便太多,鏈表有了統一的操作,代碼讀起來也舒服的多。對于這種鏈表最重要的一個宏定義就是#define rt_list_entry(node, type, member) \

    ((type *)((char *)(node) - (unsigned long)(&((type *)0)->member)))

論壇和網上都有分析這個理解了,再理解鏈表操作就沒難度了。

我們重點看以下幾個:

rt_system_object_init();

這個函數現在為空,對應的功能如下:

struct rt_object_information rt_object_container[RT_Object_Class_Unknown];

這個結構管理著 RT-Thread 系統中所有注冊的組件,從這個結構中我們可以幾乎得到系統中我們想要的一切信息,finsh里的如list_xxx等都是從這個結構里提取相應的信息。

示意圖如下:

如何從rtthread_startup看RT-Thread 內核數據結構

 

rt_system_timer_init();

這個函數對應的功能實際是初始化rt_timer_list鏈表,管理整個系統存在的timer。

這里不具體分析源碼實現,只給出示意圖:

如何從rtthread_startup看RT-Thread 內核數據結構

 

對于任務數小于32的線程, 所有就緒任務通過rt_list_t rt_thread_priority_table[RT_THREAD_PRIORITY_MAX]這個數組標記。 利用rt_thread結構中

的嵌入鏈表結構將同優先級線程組成循環鏈表。 不同優先級線程各占一個數組元素。

注意一個變量rt_current_thread = RT_NULL;之后會再看到它。

rt_application_init();

我們的應用程序就是在這里面設置了,不對這個過程說明,只看看rt_thread_create這個函數完成了哪些數據結構的關聯。

rt_thread_create

-->rt_object_allocate

-->information = &rt_object_container[type];

    rt_list_insert_after(&(information->object_list), &(object->list));至此線程出現在內核的視野

-->_rt_thread_init

-->rt_object_init((rt_object_t)timer, RT_Object_Class_Timer, name);線程內置的timer結構加入          rt_object_container

     _rt_timer_init(timer, timeout, parameter, time, flag);

 -->rt_list_init(&(timer->row[i]));timer加入rt_timer_list鏈表。

rt_thread_idle_init();

如何從rtthread_startup看RT-Thread 內核數據結構

在應用中,我們可以設置rt_thread_idle_hook ,完成CPU利用率統計,CPU進入低功耗模式等功能。

在rt_thread_idle_excute中又涉及到一個全局變量rt_thread_defunct,當刪除任務時,被刪除的任務控制塊就會被連接到這個鏈表上。在空閑任務中完成對資源的回收,提高系統性能。

rt_system_scheduler_start();

從這個函數開始系統就正式開始運行了,首先獲得就緒的最高優先級任務,然后賦值給rt_current_thread,最后觸發軟中斷,切換到相應的任務棧去執行任務了。

to_thread = rt_list_entry(rt_thread_priority_table[highest_ready_priority].next,

                              struct rt_thread,

                              tlist);

    rt_current_thread = to_thread;

    rt_hw_context_switch_to((rt_uint32_t)&to_thread->sp);

每個rt_thread中有兩個rt_list_t類型元素,其中rt_object parent 中的list作為組織內核對象用。 而tlist作為鏈接到rt_timer_list等待鏈表上使用, 也可用作刪除任務后加入到空閑處理鏈rt_thread_defunct上, 亦可鏈接到IPC中suspend鏈表上。

如何從rtthread_startup看RT-Thread 內核數據結構

上述就是小編為大家分享的如何從rtthread_startup看RT-Thread 內核數據結構了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注創新互聯行業資訊頻道。

當前文章:如何從rtthread_startup看RT-Thread內核數據結構
本文URL:http://m.kartarina.com/article24/jedice.html

成都網站建設公司_創新互聯,為您提供網站制作做網站網站導航App開發服務器托管標簽優化

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

營銷型網站建設
主站蜘蛛池模板: 精品久久久久久无码中文野结衣| 日韩精品无码免费专区午夜 | 人妻少妇偷人精品无码| 国产高清无码二区| 亚洲av永久无码制服河南实里 | 色综合久久中文字幕无码| 亚洲AV无码第一区二区三区| 亚洲日韩精品无码专区加勒比 | 色欲A∨无码蜜臀AV免费播| 毛片一区二区三区无码| 无码国产精成人午夜视频一区二区 | 亚洲欧洲日产国码无码网站| 亚洲综合久久精品无码色欲| 最新国产精品无码| 伊人蕉久中文字幕无码专区 | 2019亚洲午夜无码天堂| 国产综合无码一区二区辣椒| WWW久久无码天堂MV| 18禁网站免费无遮挡无码中文| 亚洲一区二区三区AV无码| 亚洲成a人片在线观看天堂无码| 国产精品亚洲а∨无码播放| 亚洲中文字幕无码爆乳av中文| 91嫩草国产在线无码观看| 国产成人无码18禁午夜福利p| 国产av激情无码久久| 亚洲AV无码一区二区三区鸳鸯影院| 亚洲综合无码一区二区| 亚洲精品无码不卡在线播HE| 超清无码熟妇人妻AV在线电影| 亚洲AV中文无码乱人伦在线视色 | 国产成人无码a区在线视频| 亚洲av成本人无码网站| 亚洲乱亚洲乱妇无码| 中字无码av电影在线观看网站| 精品一区二区三区无码免费视频 | 亚洲AV无码一区二区三区DV| 亚洲无码日韩精品第一页| 久久久人妻精品无码一区| 日韩精品无码免费专区午夜不卡| 亚洲精品无码成人片在线观看|