欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

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

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

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

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

冬至子 ? 來源:吉利咕嚕2022 ? 作者:吉利咕嚕2022 ? 2023-08-07 15:17 ? 次閱讀

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

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

這里主要說明rt_list_for_each_entry宏的用法,因為每次就這里不太好理解,這個宏實現(xiàn)的功能類似C++中用引用遍歷鏈表,很好用的。而且RTT已經(jīng)給實現(xià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))

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

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

對應(yīng)到這里的宏,第一條初始化語句為pos = rt_list_entry((head)->next, typeof(*pos), member);,是一個對pos的賦值語句,所以這里結(jié)合代碼和上面的注釋就能很容易知道第一個參數(shù)pos就類似普通for循環(huán)的循環(huán)變量。初始化又用到了另外一個宏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)))
展開后就是一個減法計算:(char *)((head)->next) - (unsigned long)(&((typeof(*pos) *)0)->member),其中&((typeof(*pos) *)0)->member的功能是得到pos類型結(jié)構(gòu)體內(nèi)member成員的偏移地址。把0地址看做一個pos類型的結(jié)構(gòu)體,再取其中任何成員的地址就自然是其偏移地址了。
所以這個宏的pos參數(shù),傳入的應(yīng)該是你自己定義的鏈表節(jié)點結(jié)構(gòu)體指針,此結(jié)構(gòu)體內(nèi)包含一個rt_list_t類型的member成員變量。所以第三個參數(shù)傳入一個rt_list_t member變量即可。而第二個參數(shù)head傳入的是鏈表頭節(jié)點內(nèi)的member變量指針。所以這里for循環(huán)內(nèi)的第一條初始化語句就是初始化pos為鏈表內(nèi)第一個節(jié)點的自定義結(jié)構(gòu)體指針。

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

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

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

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);
}
}

運行結(jié)果:

1.jpg

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

    關(guān)注

    1

    文章

    26

    瀏覽量

    16883
  • C++語言
    +關(guān)注

    關(guān)注

    0

    文章

    147

    瀏覽量

    7040
  • RTThread
    +關(guān)注

    關(guān)注

    8

    文章

    132

    瀏覽量

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

    關(guān)注

    0

    文章

    61

    瀏覽量

    2550
收藏 人收藏

    評論

    相關(guān)推薦

    【Linux高級編譯】list.h的高效應(yīng)用—雙向鏈表的實現(xiàn)

    【Linux高級編譯】Linux內(nèi)核的list.h的高效應(yīng)用——雙向鏈表的實現(xiàn)
    的頭像 發(fā)表于 09-15 10:00 ?2668次閱讀
    【Linux高級編譯】<b class='flag-5'>list</b>.h的高效應(yīng)用—雙向<b class='flag-5'>鏈表</b>的實現(xiàn)

    rtthread 5.20安裝systemview 2.52a出錯的原因?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    小編科普一下rtthread鏈表操作的幾個API與實用的幾個宏

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

    rt_timer_check 造成任務(wù)不執(zhí)行問題如何解決

    rt_timer_check內(nèi),將超時任務(wù)由timer移除,放置到ready_list中。 由于rtthread1比rtthread2的優(yōu)先
    發(fā)表于 08-09 10:25

    請問一下鏈表這么使用有問題嗎

    ;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宏問題呢

    #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)用有哪些呢

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

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

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