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

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

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

completion是什么?怎么使用?

RTThread物聯(lián)網(wǎng)操作系統(tǒng) ? 來源:CSDN技術(shù)社區(qū) ? 作者: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 的實現(xiàn)

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}

干了兩件事:

設(shè)置 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}

主要做了以下工作:

關(guān)中斷:rt_hw_interrupt_disable();

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

把掛起狀態(tài)插入到線程的鏈表中:rt_list_insert_before

確保當(dāng)前函數(shù)執(zhí)行不是在中斷中:RT_DEBUG_NOT_IN_INTERRUPT;

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

開中斷:rt_hw_interrupt_enable(level);

開調(diào)度器:rt_schedule();

獲取當(dāng)前線程狀態(tài):result = thread-》error;

設(shè)置完成量的標(biāo)志位:completion-》flag = RT_UNCOMPLETED;

返回線程狀態(tài)

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

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 }

主要做了以下工作:

關(guān)中斷:rt_hw_interrupt_disable();

設(shè)置 flag 為 RT_COMPLETED

檢查鏈表不為空:rt_list_isempty

獲取到當(dāng)前等待完成量的句柄:rt_list_entry

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

開中斷:rt_hw_interrupt_enable(level);

開調(diào)度:rt_schedule();

4. completion 與信號量的對比

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

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

5. completion 如何加入工程

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

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

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

    關(guān)注

    30

    文章

    4700

    瀏覽量

    68117
  • 信號量
    +關(guān)注

    關(guān)注

    0

    文章

    53

    瀏覽量

    8297

原文標(biāo)題:RT-Thread隱藏的寶藏之completion

文章出處:【微信號:RTThread,微信公眾號:RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    completion CAN驅(qū)動的completion會失效的原因?

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

    使用例程執(zhí)行.$HOME/esp/esp-idf/export.sh命令進(jìn)入IDF環(huán)境時彈出那么多警告是怎么回事?

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

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

    /bash-completion/ output/share/bash-completion/completions/ output/share/bash-completion/completions
    發(fā)表于 06-19 17:07

    關(guān)于SDIO命令寄存器(SDIO_CMD)的疑問求解?

    請教下SDIO命令寄存器(SDIO_CMD)第12位ENCMDcompl:使能CMD完成(Enable CMD completion)如果設(shè)置該位,則使能命令完成信號,這句咋理解是啥意思。還有開始發(fā)送命令是不是把數(shù)據(jù)寫入SDIO_CMD寄存器就啟動了發(fā)送開始,還是應(yīng)該置位狀態(tài)機(jī)就啟動發(fā)送開始。謝謝
    發(fā)表于 05-16 06:57

    瑞米派實時系統(tǒng)與EtherCAT移植-米爾Remi Pi

    /modules/ec_master.ko output/modules/ec_generic.ko output/share/ output/share/bash-completion/ output
    發(fā)表于 04-30 18:14

    高性能NVMe主機(jī)控制器,Xilinx FPGA NVMe Host Accelerator IP

    Information、Create/Delete IO Submission/Completion Queue、Set Features – Volatile Write Cache
    發(fā)表于 04-10 22:55

    Xilinx FPGA高性能NVMe SSD主機(jī)控制器,NVMe Host Controller IP

    Information、Create/Delete IO Submission/Completion Queue、Set Features – Volatile Write Cache
    發(fā)表于 03-27 17:23

    調(diào)試STM32U575的ADC驅(qū)動,從單驅(qū)動調(diào)試OK情況下移植至業(yè)務(wù)代碼中出現(xiàn)ADC校準(zhǔn)超時的原因?

    for calibration completion */ while (LL_ADC_IsCalibrationOnGoing(hadc->Instance) != 0UL
    發(fā)表于 03-18 07:03

    Xilinx FPGA NVMe主機(jī)控制器IP,高性能版本介紹應(yīng)用

    Reset和Shutdown?支持NVMe Admin Command Set:Identify、SMART、Create/Delete IO Submission/Completion Queue
    發(fā)表于 03-09 13:56

    OpenVINO?協(xié)同Semantic Kernel:優(yōu)化大模型應(yīng)用性能新路徑

    作為主要面向 RAG 任務(wù)方向的框架,Semantic Kernel 可以簡化大模型應(yīng)用開發(fā)過程,而在 RAG 任務(wù)中最常用的深度學(xué)習(xí)模型就是 Embedding 和 Text completion,分別實現(xiàn)文本的語義向量化和文本生成
    的頭像 發(fā)表于 03-08 10:41 ?570次閱讀
    OpenVINO?協(xié)同Semantic Kernel:優(yōu)化大模型應(yīng)用性能新路徑

    Xilinx FPGA NVMe Host Controller IP,NVMe主機(jī)控制器

    、Controller Reset和Shutdown?支持NVMe Admin Command Set:Identify、SMART、Create/Delete IO Submission/Completion
    發(fā)表于 02-21 10:16

    使用UART07通過DMA進(jìn)行數(shù)據(jù)發(fā)送,發(fā)出的數(shù)據(jù)不完整是怎么回事?

    */ DMA0_B0_EI = 1; /* Error interrupt issuance is enabled */ DMA0_B0_CI = 1; /* Completion interrupt
    發(fā)表于 02-21 08:30

    psoc6 i2c讀寫時死循環(huán)是什么原因?qū)е碌模?/a>

    ) Cy_SCB_I2C_MasterWrite(SCB3,transfer,i2cContext); /* Wait for transaction completion */ while
    發(fā)表于 02-02 11:02

    如何通過API調(diào)用控制ISR設(shè)置?

    (0, (CYDMA_INVALIDATE | CYDMA_GENERATE_IRQ)); // no interrupt!// set DMA1 post completion actions
    發(fā)表于 01-30 06:23

    【LuckFox Pico 開發(fā)板免費試用】6.使能 DHT11 Driver

    <linux/completion.h> #include <linux/mutex.h> #include <linux
    發(fā)表于 11-07 19:04