溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

內(nèi)核對(duì)象初始化鏈表組織方式是什么

發(fā)布時(shí)間:2021-10-13 15:55:19 來(lái)源:億速云 閱讀:149 作者:iii 欄目:編程語(yǔ)言

這篇文章主要介紹“內(nèi)核對(duì)象初始化鏈表組織方式是什么”,在日常操作中,相信很多人在內(nèi)核對(duì)象初始化鏈表組織方式是什么問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”內(nèi)核對(duì)象初始化鏈表組織方式是什么”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

背景

  • 最近在看RT-Thread內(nèi)核的源碼,內(nèi)核對(duì)象使用鏈表組織。

  • RT-Thread內(nèi)部有完整的【雙向鏈表】與【單向鏈表】的操作API與實(shí)際用例

  • 內(nèi)核對(duì)象,內(nèi)核派生的如線程、定時(shí)器、設(shè)備等,都是由鏈表鏈起來(lái)管理的。

鏈表介紹

/**
 * Double List structure
 */
struct rt_list_node
{
    struct rt_list_node *next;                          /**< point to next node. */
    struct rt_list_node *prev;                          /**< point to prev node. */
};
typedef struct rt_list_node rt_list_t;                  /**< Type for lists. */
  • 鏈表是一種數(shù)據(jù)結(jié)構(gòu),跟其他的結(jié)構(gòu)體類(lèi)似,初始化后,本身占用內(nèi)存空間,自身有內(nèi)存地址。

  • 一般雙向鏈表,內(nèi)部的成員,是鏈表本身結(jié)構(gòu)體的指針,注意,指針的指向,初始化后,并沒(méi)有確定。

  • RT-Thread 的雙向鏈表,初始化時(shí),內(nèi)部的指針,指向自己本身的地址,也就是給鏈表的成員,賦好了初值(指針內(nèi)容,一般是地址)。

  • 鏈表使用,節(jié)點(diǎn)一般都是【全局結(jié)構(gòu)體變量】,全局靜態(tài)初始化,或動(dòng)態(tài)內(nèi)存申請(qǐng)(全局)。

  • 不用全局的鏈表節(jié)點(diǎn),注意不要鏈入鏈表結(jié)構(gòu),否則節(jié)點(diǎn)地址因?yàn)椤旧芷凇拷Y(jié)束內(nèi)存釋放了,地址就不對(duì)了,就無(wú)法管理各個(gè)鏈表的節(jié)點(diǎn)了。

雙向鏈表API

  • 這里注要提一下鏈表節(jié)點(diǎn)的插入【次序】,因?yàn)橛龅搅艘稽c(diǎn)小困惑,所以深入的研究了下。

  • 理解:【最新節(jié)點(diǎn)】【前一個(gè)節(jié)點(diǎn)】【最早節(jié)點(diǎn)】

  • 鏈表的頭的問(wèn)題:內(nèi)核對(duì)象使用【對(duì)象容器】,全局的,對(duì)象初始化后,用了 rt_list_insert_after

/* 來(lái)自:object.c :rt_object_init */
        /* insert object into information object list */
        rt_list_insert_after(&(information->object_list), &(object->list));
  • 注意,rt_list_insert_after,插入的位置,【不是鏈表的尾部插入,是第一個(gè)鏈表節(jié)點(diǎn)【第一個(gè)參數(shù)】的后面。】

  • 也就是說(shuō),如果創(chuàng)建了3個(gè)內(nèi)核對(duì)象,默認(rèn)的排序如下:

不是:【容器head】 --- [obj1] --- [obj2] --- [obj2] 
而是:【容器head】 --- [obj3] --- [obj2] --- [obj1]
  • 如果把鏈表插入到【尾部】后面,就要先把鏈表指針移到尾部,再執(zhí)行:rt_list_insert_after.

查看內(nèi)核對(duì)象

  • 其實(shí),thread,device等對(duì)象,都是內(nèi)核對(duì)象【派生】出來(lái)的。

  • RT-Thread 提供list_thread、list_device等,查看內(nèi)核的對(duì)象。

  • 查看線程初始化【次序】,看看最后打印的線程,就是【最先】首個(gè)創(chuàng)建的線程。

  • 一般從鏈表【頭部】開(kāi)始遍歷各個(gè)鏈表節(jié)點(diǎn)。如下:最后一個(gè)節(jié)點(diǎn)是:main線程.

  • 其實(shí),main線程,是第一個(gè)創(chuàng)建的。

msh />list_thread
thread   pri  status      sp     stack size max used left tick  error
-------- ---  ------- ---------- ----------  ------  ---------- ---
persim    16  suspend 0x000001ec 0x0000c000    08%   0x00000003 000
sens      28  suspend 0x000000d8 0x00001000    13%   0x00000019 000
hws       28  suspend 0x000000d8 0x00000800    10%   0x00000032 000
dcm_tpo   10  suspend 0x00000090 0x00000800    14%   0x00000004 000
dcm_tpo   10  suspend 0x00000090 0x00000800    14%   0x00000002 000
dcm_tpo   10  suspend 0x00000090 0x00000800    15%   0x00000004 000
tshell    20  running 0x000001fc 0x00001000    26%   0x0000000a 000
touch     16  suspend 0x00000098 0x00000800    18%   0x00000013 000
usbd       8  suspend 0x000000ac 0x00001000    04%   0x00000014 000
at_clnt    9  suspend 0x000000c0 0x00000600    12%   0x00000002 000
ulog_asy  30  suspend 0x00000084 0x00000c00    09%   0x00000006 000
mmcsd_de  22  suspend 0x000000a0 0x00000400    48%   0x00000014 000
alarmsvc  10  suspend 0x000000a8 0x00000800    27%   0x00000003 000
rils      12  suspend 0x000000b0 0x00000800    08%   0x0000001e 000
tidle0    31  ready   0x00000058 0x00000800    04%   0x0000001d 000
timer      4  suspend 0x00000074 0x00000800    08%   0x00000009 000
main      10  suspend 0x00000120 0x00000800    41%   0x00000012 000  /* 最先創(chuàng)建的線程,最后打印 */
  • 內(nèi)核對(duì)象初始化的鏈表【次序】:

內(nèi)核對(duì)象初始化鏈表組織方式是什么

到此,關(guān)于“內(nèi)核對(duì)象初始化鏈表組織方式是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

api
AI