免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

如何從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.newbst.com/article24/jedice.html

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

廣告

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

營銷型網站建設