chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

關(guān)于rtthread內(nèi)鏈表rt_list_for_each_entry的用法

冬至子 ? 來(lái)源:吉利咕嚕2022 ? 作者:吉利咕嚕2022 ? 2023-08-07 15:17 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

各人對(duì)于鏈表的使用并不是很頻繁,偶爾用一下,所以導(dǎo)致每次用都不記得怎么用了,都要重新分析一下邏輯,所以今天在這里記錄一下用法,方便自己也方便用得到的小伙伴查閱。

具體的函數(shù)接口這里就不介紹了,RTThread的API文檔里講的很清楚,按照API接口調(diào)用就可以了,比較容易。

這里主要說(shuō)明rt_list_for_each_entry宏的用法,因?yàn)槊看尉瓦@里不太好理解,這個(gè)宏實(shí)現(xiàn)的功能類似C++中用引用遍歷鏈表,很好用的。而且RTT已經(jīng)給實(shí)現(xiàn)了這種遍歷方法如果不用總感覺(jué)自己虧了點(diǎn)啥

先看一下代碼里此宏的具體定義:

/**

rt_list_for_each_entry - iterate over list of given type @pos: the type * to use as a loop cursor.
@head: the head for your list.
@member: the name of the list_struct within the struct.
*/
#define rt_list_for_each_entry(pos, head, member)
for (pos = rt_list_entry((head)->next, typeof(*pos), member);
&pos->member != (head);
pos = rt_list_entry(pos->member.next, typeof(*pos), member))

乍一看可能有點(diǎn)亂,所以需要稍微梳理一下邏輯,梳理通了也就不復(fù)雜了。此宏具體的實(shí)現(xiàn)功能肯定是要遍歷鏈表內(nèi)的每個(gè)節(jié)點(diǎn)成員,所以核心就是一個(gè)for循環(huán),可每次要用這個(gè)宏的時(shí)候第一反應(yīng)就是這個(gè)宏的三個(gè)參數(shù)是什么意思來(lái)著?要傳入什么?那就要先分析一下for信號(hào)里面的代碼了。

for循環(huán)相信大家都知道了,一般括號(hào)內(nèi)有三條語(yǔ)句(有時(shí)把變化語(yǔ)句放到循環(huán)體內(nèi),這里就只有兩條語(yǔ)句了),第一條語(yǔ)句可以成為初始化語(yǔ)句,初始化循環(huán)變量。第二條語(yǔ)句是循環(huán)條件語(yǔ)句,為真則循環(huán)為假則退出循環(huán)。第三條語(yǔ)句是變量變化語(yǔ)句。

對(duì)應(yīng)到這里的宏,第一條初始化語(yǔ)句為pos = rt_list_entry((head)->next, typeof(*pos), member);,是一個(gè)對(duì)pos的賦值語(yǔ)句,所以這里結(jié)合代碼和上面的注釋就能很容易知道第一個(gè)參數(shù)pos就類似普通for循環(huán)的循環(huán)變量。初始化又用到了另外一個(gè)宏rt_list_entry,此宏相關(guān)的代碼如下:

/**

@brief get the struct for this entry
@param node the entry point
@param type the type of structure
@param member the name of list in structure
/
#define rt_list_entry(node, type, member)
rt_container_of(node, type, member)
/
*
rt_container_of - return the member address of ptr, if the type of ptr is the
struct type.
*/
#define rt_container_of(ptr, type, member)
((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member)))
展開后就是一個(gè)減法計(jì)算:(char *)((head)->next) - (unsigned long)(&((typeof(*pos) *)0)->member),其中&((typeof(*pos) *)0)->member的功能是得到pos類型結(jié)構(gòu)體內(nèi)member成員的偏移地址。把0地址看做一個(gè)pos類型的結(jié)構(gòu)體,再取其中任何成員的地址就自然是其偏移地址了。
所以這個(gè)宏的pos參數(shù),傳入的應(yīng)該是你自己定義的鏈表節(jié)點(diǎn)結(jié)構(gòu)體指針,此結(jié)構(gòu)體內(nèi)包含一個(gè)rt_list_t類型的member成員變量。所以第三個(gè)參數(shù)傳入一個(gè)rt_list_t member變量即可。而第二個(gè)參數(shù)head傳入的是鏈表頭節(jié)點(diǎn)內(nèi)的member變量指針。所以這里for循環(huán)內(nèi)的第一條初始化語(yǔ)句就是初始化pos為鏈表內(nèi)第一個(gè)節(jié)點(diǎn)的自定義結(jié)構(gòu)體指針。

理解到這里,第二條語(yǔ)句就很容易理解了,就是判斷遍歷的pos內(nèi)的下一個(gè)節(jié)點(diǎn)指針是不是又回到了head(單向鏈表里是判斷是否為NULL),是則已經(jīng)遍歷一遍,退出循環(huán)。

第三條語(yǔ)句是取pos->member.next也就是下一個(gè)節(jié)點(diǎn)對(duì)于的自己定義結(jié)構(gòu)體指針。

為了方便理解上面的內(nèi)容,下面給出一個(gè)簡(jiǎn)單的例子:

typedef struct __test_node
{
rt_uint16_t a; //可加入任何類型的用戶自定義變量
rt_uint16_t b;
rt_uint16_t c;
rt_list_t member;
}TestNode;
void rt_list_test()
{
TestNode test_head;
rt_list_init(&test_head.member);
for(int i = 0; i < 10; ++i) {
TestNode *new_node = rt_malloc(sizeof(TestNode));
new_node->a = i;
rt_list_insert_before(&test_head.member, &new_node->member);
}
rt_kprintf("list_len:%dn",rt_list_len(&test_head.member));
TestNode *list_pos;
rt_list_t member;
rt_list_for_each_entry(list_pos, &test_head.member, member)
{
rt_kprintf("a:%dn", list_pos->a);
}
}

運(yùn)行結(jié)果:

1.jpg

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 減法器
    +關(guān)注

    關(guān)注

    1

    文章

    26

    瀏覽量

    17296
  • C++語(yǔ)言
    +關(guān)注

    關(guān)注

    0

    文章

    147

    瀏覽量

    7450
  • RTThread
    +關(guān)注

    關(guān)注

    8

    文章

    132

    瀏覽量

    42281
  • for循環(huán)
    +關(guān)注

    關(guān)注

    0

    文章

    61

    瀏覽量

    2827
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    rtthread 5.20安裝systemview 2.52a出錯(cuò)的原因?

    rt_thread\' thread = rt_list_entry(node, struct rt_thread, list); 提示 packages/SystemView
    發(fā)表于 07-12 09:36

    rtthread 5.20 安裝 systemview 2.52a 出錯(cuò)的原因?

    rt_thread\' thread = rt_list_entry(node, struct rt_thread, list);
    發(fā)表于 09-16 08:20

    rt_list_for_each_entry編譯失敗怎么解決?

    最新版本的rtthread,做SDIO模式的SD卡,里面包含了blk.C文件,文件里有多個(gè)rt_list_for_each_entry,我用的是keil mdk AC6,編譯報(bào)錯(cuò) 全局搜索了一下
    發(fā)表于 09-18 07:14

    Linux內(nèi)核的鏈表操作

    = list_entry(i, struct nf_sockopt_ops, list); 大多數(shù)情況下,遍歷鏈表的時(shí)候都需要獲得鏈表節(jié)點(diǎn)數(shù)據(jù)項(xiàng),也就是說(shuō)
    發(fā)表于 08-29 11:13

    Linux Kernel數(shù)據(jù)結(jié)構(gòu):鏈表

    連接起來(lái),形成鏈表,通過(guò)通用的鏈表函數(shù)來(lái)進(jìn)行操作。有點(diǎn)可想而知,這個(gè)通用的鏈表操作函數(shù)可以搞定所有的鏈表,實(shí)現(xiàn)了代碼的重用。如果想得到對(duì)應(yīng)結(jié)構(gòu)的指針,可以使用
    發(fā)表于 09-25 16:41

    RT-Thread內(nèi)核中單鏈表的使用與實(shí)現(xiàn)

    rt_slist_for_each_entry(node(節(jié)點(diǎn)), struct (結(jié)構(gòu)體), list(鏈表所在結(jié)構(gòu)體成員中的名字))3. 單鏈表的實(shí)現(xiàn)初始化
    發(fā)表于 04-01 12:01

    RT-Thread內(nèi)核中雙鏈表的使用與實(shí)現(xiàn)

    , head)遍歷鏈表中的結(jié)構(gòu)體成員···rt_list_for_each_entry(node(節(jié)點(diǎn)), struct (結(jié)構(gòu)體), list(鏈表所在結(jié)構(gòu)體成員中的名字))···安
    發(fā)表于 04-01 12:05

    RT-Thread中普通鏈表和侵入式鏈表有何區(qū)別

    普通鏈表學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的時(shí)候?qū)懙?b class='flag-5'>鏈表是下面這個(gè)樣子侵入式鏈表RT-Thread 以及 Linux 內(nèi)核中鏈表是這樣定義的在使用的時(shí)候是這樣
    發(fā)表于 04-11 15:15

    rt_timer_check造成任務(wù)不執(zhí)行問(wèn)題如何處理呢?

    rtthread1和rtthread2的sleep時(shí)間同時(shí)到達(dá)后,會(huì)在rt_timer_check內(nèi),將超時(shí)任務(wù)由timer移除,放置到ready_
    發(fā)表于 05-10 09:47

    淺析RT-Thread中對(duì)象容器與雙鏈表的操作

    = rt_hw_interrupt_disable();/* 把對(duì)象信息插入到對(duì)象鏈表中 */rt_list_insert_after(&(information->object_list
    發(fā)表于 05-18 14:23

    小編科普一下rtthread鏈表操作的幾個(gè)API與實(shí)用的幾個(gè)宏

    rtthread 鏈表操作的的幾個(gè) API /* 將節(jié)點(diǎn) n 插入到節(jié)點(diǎn) l 的后面,如果 l 為頭節(jié)點(diǎn),則插入到鏈表頭部 */rt_inline void
    發(fā)表于 05-18 14:26

    請(qǐng)問(wèn)一下鏈表這么使用有問(wèn)題嗎

    ;send_data_cache_head.list)){rt_list_for_each_entry_safe(pos, n, &send_data_cache_head.list,
    發(fā)表于 08-29 11:30

    如何去解決單鏈表rt_slist_for_each宏問(wèn)題呢

    #define rt_slist_for_each(pos, head)for (pos = (head)->next; pos != RT_NULL; pos = pos-&
    發(fā)表于 11-10 11:50

    RT-Thread中侵入式鏈表的應(yīng)用有哪些呢

    上一個(gè)結(jié)點(diǎn) /};typedef struct rt_list_node rt_list_t;/ 鏈表類型 */在使用的時(shí)候是這樣定義的struct rt_object
    發(fā)表于 12-05 13:59

    FreeRTOS代碼剖析之5:鏈表管理list.c

    鏈表是操作系統(tǒng)中常用的數(shù)據(jù)結(jié)構(gòu),其結(jié)構(gòu)比較簡(jiǎn)單,因此在剖析FreeRTOS的內(nèi)核時(shí)先從這里開始入手。 鏈表是由眾多鏈表節(jié)點(diǎn)組成的,在FreeRTOS中,鏈表節(jié)點(diǎn)有兩種定義,分別是xLI
    發(fā)表于 02-09 02:57 ?865次閱讀
    FreeRTOS代碼剖析之5:<b class='flag-5'>鏈表</b>管理<b class='flag-5'>list</b>.c