這篇文章主要介紹“內(nèi)核對象初始化鏈表組織方式是什么”,在日常操作中,相信很多人在內(nèi)核對象初始化鏈表組織方式是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”內(nèi)核對象初始化鏈表組織方式是什么”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
在青河等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站制作、做網(wǎng)站 網(wǎng)站設(shè)計制作按需網(wǎng)站建設(shè),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),營銷型網(wǎng)站,成都外貿(mào)網(wǎng)站制作,青河網(wǎng)站建設(shè)費(fèi)用合理。
最近在看RT-Thread內(nèi)核的源碼,內(nèi)核對象使用鏈表組織。
RT-Thread內(nèi)部有完整的【雙向鏈表】與【單向鏈表】的操作API與實(shí)際用例
內(nèi)核對象,內(nèi)核派生的如線程、定時器、設(shè)備等,都是由鏈表鏈起來管理的。
/** * 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)體類似,初始化后,本身占用內(nèi)存空間,自身有內(nèi)存地址。
一般雙向鏈表,內(nèi)部的成員,是鏈表本身結(jié)構(gòu)體的指針,注意,指針的指向,初始化后,并沒有確定。
RT-Thread 的雙向鏈表,初始化時,內(nèi)部的指針,指向自己本身的地址,也就是給鏈表的成員,賦好了初值(指針內(nèi)容,一般是地址)。
鏈表使用,節(jié)點(diǎn)一般都是【全局結(jié)構(gòu)體變量】,全局靜態(tài)初始化,或動態(tài)內(nèi)存申請(全局)。
不用全局的鏈表節(jié)點(diǎn),注意不要鏈入鏈表結(jié)構(gòu),否則節(jié)點(diǎn)地址因?yàn)椤旧芷凇拷Y(jié)束內(nèi)存釋放了,地址就不對了,就無法管理各個鏈表的節(jié)點(diǎn)了。
這里注要提一下鏈表節(jié)點(diǎn)的插入【次序】,因?yàn)橛龅搅艘稽c(diǎn)小困惑,所以深入的研究了下。
理解:【最新節(jié)點(diǎn)】【前一個節(jié)點(diǎn)】【最早節(jié)點(diǎn)】
鏈表的頭的問題:內(nèi)核對象使用【對象容器】,全局的,對象初始化后,用了 rt_list_insert_after
/* 來自:object.c :rt_object_init */ /* insert object into information object list */ rt_list_insert_after(&(information->object_list), &(object->list));
注意,rt_list_insert_after,插入的位置,【不是鏈表的尾部插入,是第一個鏈表節(jié)點(diǎn)【第一個參數(shù)】的后面。】
也就是說,如果創(chuàng)建了3個內(nèi)核對象,默認(rèn)的排序如下:
不是:【容器head】 --- [obj1] --- [obj2] --- [obj2] 而是:【容器head】 --- [obj3] --- [obj2] --- [obj1]
如果把鏈表插入到【尾部】后面,就要先把鏈表指針移到尾部,再執(zhí)行:rt_list_insert_after.
其實(shí),thread,device等對象,都是內(nèi)核對象【派生】出來的。
RT-Thread 提供list_thread、list_device等,查看內(nèi)核的對象。
查看線程初始化【次序】,看看最后打印的線程,就是【最先】首個創(chuàng)建的線程。
一般從鏈表【頭部】開始遍歷各個鏈表節(jié)點(diǎn)。如下:最后一個節(jié)點(diǎn)是:main線程.
其實(shí),main線程,是第一個創(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)核對象初始化的鏈表【次序】:
到此,關(guān)于“內(nèi)核對象初始化鏈表組織方式是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!