在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

completion是什么?怎么使用?

RTThread物聯網操作系統 ? 來源:CSDN技術社區 ? 作者:whj123999 ? 2021-03-18 13:33 ? 次閱讀

1. completion 是什么

completion 直接翻譯過來是完成,所以我們可以稱 rt_completion 為 完成量。在 RT-Thread 的文檔中心 中講線程間同步時,介紹了 信號量, 互斥量, 事件集 。 rt_completion 是一個 輕量級的二值信號量。

2. completion 怎么使用

completion 的使用非常簡單

定義一個完成量

1struct rt_completion completion;

初始化完成量

1rt_completion_init(&completion);

等待完成量

1rt_completion_wait(&completion);

釋放完成量

《br /》rt_completion_done(&completion);《br /》

3. completion 的實現

completion 的 API 非常少,可以通過簡單的代碼去分析

初始化完成量

1void rt_completion_init(struct rt_completion *completion)

2{

3 rt_base_t level;

4 RT_ASSERT(completion != RT_NULL);

5

6 level = rt_hw_interrupt_disable();

7 completion-》flag = RT_UNCOMPLETED;

8 rt_list_init(&completion-》suspended_list);

9 rt_hw_interrupt_enable(level);

10}

干了兩件事:

設置 flag 為 RT_UNCOMPLETED

初始化完成量的鏈表

2.等待完成量(以下代碼有刪減)

1rt_err_t rt_completion_wait(struct rt_completion *completion,

2 rt_int32_t timeout)

3{

4 result = RT_EOK;

5 thread = rt_thread_self();

6

7 level = rt_hw_interrupt_disable();

8 if (completion-》flag != RT_COMPLETED)

9 {

10 if (timeout == 0)

11 {

12

13 }

14 else

15 {

16 /* reset thread error number */

17 thread-》error = RT_EOK;

18

19 /* suspend thread */

20 rt_thread_suspend(thread);

21 /* add to suspended list */

22 rt_list_insert_before(&(completion-》suspended_list),

23 &(thread-》tlist));

24

25 /* current context checking */

26 RT_DEBUG_NOT_IN_INTERRUPT;

27

28 /* start timer */

29 if (timeout 》 0)

30 {

31 /* reset the timeout of thread timer and start it */

32 rt_timer_control(&(thread-》thread_timer),

33 RT_TIMER_CTRL_SET_TIME,

34 &timeout);

35 rt_timer_start(&(thread-》thread_timer));

36 }

37 /* enable interrupt */

38 rt_hw_interrupt_enable(level);

39

40 /* do schedule */

41 rt_schedule();

42

43 /* thread is waked up */

44 result = thread-》error;

45

46 level = rt_hw_interrupt_disable();

47 }

48 }

49 /* clean completed flag */

50 completion-》flag = RT_UNCOMPLETED;

51

52 return result;

53}

主要做了以下工作:

關中斷:rt_hw_interrupt_disable();

掛起當前線程:rt_thread_suspend(thread);

把掛起狀態插入到線程的鏈表中:rt_list_insert_before

確保當前函數執行不是在中斷中:RT_DEBUG_NOT_IN_INTERRUPT;

設置并啟動定時器:rt_timer_start(&(thread-》thread_timer));

開中斷:rt_hw_interrupt_enable(level);

開調度器:rt_schedule();

獲取當前線程狀態:result = thread-》error;

設置完成量的標志位:completion-》flag = RT_UNCOMPLETED;

返回線程狀態

這樣就完成了線程的掛起。

3.完成完成量(以下代碼有刪減)

1 void rt_completion_done(struct rt_completion *completion)

2 {

3 level = rt_hw_interrupt_disable();

4 completion-》flag = RT_COMPLETED;

5

6 if (!rt_list_isempty(&(completion-》suspended_list)))

7 {

8 /* there is one thread in suspended list */

9 struct rt_thread *thread;

10

11 /* get thread entry */

12 thread = rt_list_entry(completion-》suspended_list.next,

13 struct rt_thread,

14 tlist);

15

16 /* resume it */

17 rt_thread_resume(thread);

18 rt_hw_interrupt_enable(level);

19

20 /* perform a schedule */

21 rt_schedule();

22 }

23 }

主要做了以下工作:

關中斷:rt_hw_interrupt_disable();

設置 flag 為 RT_COMPLETED

檢查鏈表不為空:rt_list_isempty

獲取到當前等待完成量的句柄:rt_list_entry

啟動被掛起的線程:rt_thread_resume(thread);

開中斷:rt_hw_interrupt_enable(level);

開調度:rt_schedule();

4. completion 與信號量的對比

completion API 個數少,資源占用少,只能釋放獲取,不支持多次釋放

semaphore API 個數多,資源占用較多,使用靈活,可以嘗試獲取,可以多次釋放,

5. completion 如何加入工程

標準版 RT-Thread 中的 completion 源碼在 “ t-threadcomponentsdriverssrccompletion.c”在你要使用的文件中#include completion.h直接就可以使用。

Nano 版 RT-Thread 直接拷貝completion.c 和 completion.h 添加到工程就可以使用
編輯:lyn

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 代碼
    +關注

    關注

    30

    文章

    4891

    瀏覽量

    70298
  • 信號量
    +關注

    關注

    0

    文章

    53

    瀏覽量

    8509

原文標題:RT-Thread隱藏的寶藏之completion

文章出處:【微信號:RTThread,微信公眾號:RTThread物聯網操作系統】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    PCIe 7.0發布:16通道雙向512GB/s,擁抱光纖未來

    電子發燒友網報道(文 / 吳子鵬)日前,PCI-SIG 宣布正式推出 PCIe 7.0 規范。PCIe 7.0 繼續沿用自 PCIe 6.0 引入的 PAM4(四電平脈沖幅度調制)信號技術,在帶寬方面相較于 PCIe 6.0 實現進一步提升。 ? PCI-SIG 組織透露,已啟動 PCIe 8.0 的預研工作。同時,PCI-SIG 發布的光纖規范同樣值得關注,這是 PCIe 技術演進中的重要里程碑,其核心目標是通過光纖傳輸解決銅纜在高速率下的物理限制,同時保持與現有 PCIe 生態的兼容性。 ? PCIe 7.0 帶寬翻倍 2022 年 6 月,PCI-
    的頭像 發表于 06-13 00:07 ?985次閱讀
    PCIe 7.0發布:16通道雙向512GB/s,擁抱光纖未來

    關鍵技術突破!國內首個光子芯片中試線成功下線首片晶圓

    電子發燒友網綜合報道 近日消息,上海交大無錫光子芯片研究院(CHIPX)取得重大進展,其在國內首個光子芯片中試線成功下線首片6英寸薄膜鈮酸鋰光子芯片晶圓,并同步實現了超低損耗、超高帶寬的高性能薄膜鈮酸鋰調制器芯片的規模化量產,該芯片的關鍵技術指標達到國際先進水平。 光子芯片關鍵技術突破 光子芯片也被稱為光子集成電路(Photonic Integrated Circuit,PIC),是一種基于光子學原理的集成電路芯片。它將光子器件集成在芯片上,實現光電
    的頭像 發表于 06-13 01:02 ?247次閱讀

    SPAD席卷車載激光雷達市場

    電子發燒友網報道(文/梁浩斌)上周我們報道了一款新推出的激光雷達ASIC方案,值得關注的是該方案中與ASIC搭配的傳感器均選擇了SiPM。當然從成本的角度來看,作為第三方的激光雷達ASIC方案,SiPM對于目前主流200線以內的激光雷達更具優勢,這是從產品定義的角度考慮。 ? 而從行業的趨勢來看,像禾賽、速騰聚創等頭部廠商聚焦數字化激光雷達的路線表明,SPAD正在取代SiPM成為激光雷達的接收端傳感器。 ? SiPM 、SPAD 有什么區別? ? 目前市面上的車載
    的頭像 發表于 06-13 00:59 ?168次閱讀

    LTCC材料技術解析,多層集成與高頻適配的電子封裝基石

    電子發燒友網綜合報道,低溫共燒陶瓷(Low-Temperature Co-Fired Ceramic, LTCC)是一種通過低溫共燒工藝(通常低于900℃)將陶瓷材料與金屬導體(如銀、銅)結合形成的多層復合基板技術。 ? 該材料介電常數(ε_r)可調范圍廣(3~100),介電損耗(tanδ)低至0.001以下,適用于5G通信、毫米波雷達等高頻場景。并且支持100層以上的多層布線,線寬可小于50μm,實現無源元件(電容、電感、濾波器)的內埋集成,顯著縮小器件體積。 ? 同時,陶瓷基體耐溫超過
    的頭像 發表于 06-13 00:58 ?171次閱讀

    藍牙6.1標準發布,隱私節能雙突破

    (電子發燒友網綜合報道)藍牙技術在多個細分市場都呈現穩步增長的趨勢,藍牙技術聯盟預計2025年藍牙設備出貨量將超過53億臺,到2029年將接近80億臺。 ? 藍牙設備可以分為經典藍牙、雙模藍牙、低功耗藍牙三大類。目前來看,單模經典藍牙設備的需求正在下降,單模低功耗藍牙設備的需求反而在不斷增加,主要是面向智能標簽、電子貨架標簽類新興市場的興起助推了單模低功耗藍牙設備的需求。藍牙技術聯盟預計單模低功耗藍牙設備出貨量的復合年
    的頭像 發表于 06-13 00:25 ?278次閱讀
    藍牙6.1標準發布,隱私節能雙突破

    國產機器視覺龍頭!易思維沖擊科創板IPO

    電子發燒友網綜合報道,6月5日,上交所正式受理易思維(杭州)科技股份有限公司(以下簡稱“易思維”)的科創板IPO申請,公司擬募資12.14億元,用于機器視覺產品產業化基地建設、研發中心升級及補充流動資金。 ? 中國工業領域以及汽車制造機器視覺市場規模 ? 工業機器視覺產業鏈的上游為核心部件,包括光源及光源控制器、鏡頭和工業相機等硬件產品,以及視覺算法、應用軟件等軟件產品。產業鏈中游為視覺系統與解決方案,通過將上游核心部
    的頭像 發表于 06-13 00:01 ?255次閱讀
    國產機器視覺龍頭!易思維沖擊科創板IPO

    NVMe協議簡要分析

    Completion Queue,CQ)機制。SQ用于存放提交命令,而CQ則用于存放完成信息。隊列狀態信息通過門鈴寄存器(Door Bell,DB)來檢測。這兩個隊列采用了環形隊列結構,隊列可以映射
    發表于 05-15 00:34

    使用Dockerfile搭建潤和WS63E的開發環境

    ; \\\\\\\\ && [ -s \"$NVM_DIR/bash_completion\" ] &&
    發表于 11-18 02:59

    【米爾-Xilinx XC7A100T FPGA開發板試用】+02.PCIE接口測試(zmj)

    : Completion Timeout: Range B, TimeoutDis-, LTR-, OBFF Not Supported DevCtl2: Completion Timeout: 50us
    發表于 11-12 16:05

    PCI-E TLP學習筆記(3)

    和應答處理機制(Request Handling Rules、Completion Handling)、virtual channel(vc)Mechanism虛擬通道機制(TC/VC映射、Flow Control)、Data Integrity數據完整性等內容,話不多說,上貨。
    的頭像 發表于 11-06 09:19 ?792次閱讀
    PCI-E TLP學習筆記(3)

    PCI-E TLP學習筆記(2)

    ,configuration,message request、completetion(Memory Request Package、I/O Request 包、Configuration Request包、Message、Completion Rules(應答機制)),話不多說,上貨。
    的頭像 發表于 11-06 09:16 ?832次閱讀
    PCI-E TLP學習筆記(2)

    completion CAN驅動的completion會失效的原因?

    CAN配置自動重發。completion_wait 設置1秒超時。 2.接收方打開CAN準備接收,發送方準備發送。 3.發送方開始發送,接收方正常接收。此時,將接收方CAN接收關閉。然后再打開。此時CAN completion就會失效。
    發表于 09-27 08:21

    chip-tool pairing ble-wifi給matter設備配網異常的原因?

    ] CHIP:CTL: Performing next commissioning step \'Cleanup\' with completion status = \'src/lib
    發表于 06-27 07:45

    使用例程執行.$HOME/esp/esp-idf/export.sh命令進入IDF環境時彈出那么多警告是怎么回事?

    \", line 1057, in main self._main_shell_completion(extra, prog_name, complete_var) File \"
    發表于 06-21 08:01

    【米爾-瑞米派兼容樹莓派擴展模塊-試用體驗】EtherCAT移植

    /bash-completion/ output/share/bash-completion/completions/ output/share/bash-completion/completions
    發表于 06-19 17:07
    主站蜘蛛池模板: 永久看片 | 色人岛| 天天躁夜夜 | 毛片爽爽爽免费看 | 免费视频一区 | 亚洲 午夜在线一区 | 国产麻豆成人传媒免费观看 | 全免费a级毛片免费看不卡 全日本爽视频在线 | 亚洲综合丁香婷婷六月香 | 国产一级特黄特色aa毛片 | 国产性大片黄在线观看在线放 | 免费欧美黄色片 | 一级做a爰片久久毛片人呢 一级做a爰片久久毛片图片 | 中国一级特黄真人毛片免费看 | 午夜影院0606 | 三级黄色在线视频中文 | 亚洲高清国产拍精品影院 | 人人搞人人搞 | 天堂网www中文天堂在线 | 波多野结衣三个女人蕾丝边 | 成年女人免费看一级人体片 | 午夜国产理论 | 三级网在线 | 黑人40厘米全进去xxxx猛交 | 人人艹在线 | 四虎国产精品永久在线网址 | 操操操综合网 | 777黄色片 | 国产午夜在线观看 | 国产真实乱偷人视频 | 午夜毛片视频高清不卡免费 | 开心色xxxx | 婷婷亚洲视频 | 在线观看免费精品国产 | 色婷五月 | 97色网| 久久久久国产成人精品亚洲午夜 | 正在播放91 | 亚洲免费一级片 | 美女被猛男躁免费视频网站 | 欧美日韩亚洲国产 |