真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何從rtthread_startup看RT-Thread內(nèi)核數(shù)據(jù)結(jié)構(gòu)

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)如何從rtthread_startup看RT-Thread 內(nèi)核數(shù)據(jù)結(jié)構(gòu),文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

創(chuàng)新互聯(lián)公司是少有的成都網(wǎng)站建設(shè)、網(wǎng)站制作、營銷型企業(yè)網(wǎng)站、小程序設(shè)計、手機(jī)APP,開發(fā)、制作、設(shè)計、買鏈接、推廣優(yōu)化一站式服務(wù)網(wǎng)絡(luò)公司,從2013年創(chuàng)立,堅持透明化,價格低,無套路經(jīng)營理念。讓網(wǎng)頁驚喜每一位訪客多年來深受用戶好評

下面不分析 RT-Thread 中任務(wù)調(diào)度,任務(wù)管理等實(shí)現(xiàn),只以 RT-Thread 中鏈表為線索,整理出整個 RT-Thread 重要的數(shù)據(jù)結(jié)構(gòu)及其關(guān)聯(lián),使讀者分析內(nèi)核時有個大體的認(rèn)識,也歡迎大家指正錯誤。

先看看 rtthread_startup:

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

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

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

我們重點(diǎn)看以下幾個:

rt_system_object_init();

這個函數(shù)現(xiàn)在為空,對應(yīng)的功能如下:

struct rt_object_information rt_object_container[RT_Object_Class_Unknown];

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

示意圖如下:

如何從rtthread_startup看RT-Thread 內(nèi)核數(shù)據(jù)結(jié)構(gòu)

 

rt_system_timer_init();

這個函數(shù)對應(yīng)的功能實(shí)際是初始化rt_timer_list鏈表,管理整個系統(tǒng)存在的timer。

這里不具體分析源碼實(shí)現(xiàn),只給出示意圖:

如何從rtthread_startup看RT-Thread 內(nèi)核數(shù)據(jù)結(jié)構(gòu)

 

對于任務(wù)數(shù)小于32的線程, 所有就緒任務(wù)通過rt_list_t rt_thread_priority_table[RT_THREAD_PRIORITY_MAX]這個數(shù)組標(biāo)記。 利用rt_thread結(jié)構(gòu)中

的嵌入鏈表結(jié)構(gòu)將同優(yōu)先級線程組成循環(huán)鏈表。 不同優(yōu)先級線程各占一個數(shù)組元素。

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

rt_application_init();

我們的應(yīng)用程序就是在這里面設(shè)置了,不對這個過程說明,只看看rt_thread_create這個函數(shù)完成了哪些數(shù)據(jù)結(jié)構(gòu)的關(guān)聯(lián)。

rt_thread_create

-->rt_object_allocate

-->information = &rt_object_container[type];

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

-->_rt_thread_init

-->rt_object_init((rt_object_t)timer, RT_Object_Class_Timer, name);線程內(nèi)置的timer結(jié)構(gòu)加入          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 內(nèi)核數(shù)據(jù)結(jié)構(gòu)

在應(yīng)用中,我們可以設(shè)置rt_thread_idle_hook ,完成CPU利用率統(tǒng)計,CPU進(jìn)入低功耗模式等功能。

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

rt_system_scheduler_start();

從這個函數(shù)開始系統(tǒng)就正式開始運(yùn)行了,首先獲得就緒的最高優(yōu)先級任務(wù),然后賦值給rt_current_thread,最后觸發(fā)軟中斷,切換到相應(yīng)的任務(wù)棧去執(zhí)行任務(wù)了。

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作為組織內(nèi)核對象用。 而tlist作為鏈接到rt_timer_list等待鏈表上使用, 也可用作刪除任務(wù)后加入到空閑處理鏈rt_thread_defunct上, 亦可鏈接到IPC中suspend鏈表上。

如何從rtthread_startup看RT-Thread 內(nèi)核數(shù)據(jù)結(jié)構(gòu)

上述就是小編為大家分享的如何從rtthread_startup看RT-Thread 內(nèi)核數(shù)據(jù)結(jié)構(gòu)了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


網(wǎng)頁標(biāo)題:如何從rtthread_startup看RT-Thread內(nèi)核數(shù)據(jù)結(jié)構(gòu)
網(wǎng)頁網(wǎng)址:http://weahome.cn/article/jedice.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部