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

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

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

completion是什么?completion怎么使用呢?

冬至子 ? 來源:whj467467222 ? 作者:whj467467222 ? 2023-06-07 11:48 ? 次閱讀

1.completion 是什么

completion 直接翻譯過來是完成,所以我更愿意稱 rt_completion 為 完成量。在 RT-Thread 的文檔中心 中講線程間通訊(IPC)時,只介紹了,信號量, 互斥量, 事件集,其實 rt_completion 可以認(rèn)為是輕量級的二值信號量。

2.completion 怎么使用

completion 的使用非常簡單

定義一個完成量

struct rt_completion completion;

初始化完成量

rt_completion_init(&completion);

等待完成量

rt_completion_wait(&completion);

釋放完成量

rt_completion_done(&completion);

3.completion 的實現(xiàn)

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

初始化完成量

void rt_completion_init(struct rt_completion *completion)

{

rt_base_t level;

RT_ASSERT(completion != RT_NULL);

level = rt_hw_interrupt_disable();

completion->flag = RT_UNCOMPLETED;

rt_list_init(&completion->suspended_list);

rt_hw_interrupt_enable(level);

}

干了兩件事:

設(shè)置 flag 為 RT_UNCOMPLETED

初始化完成量的鏈表

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

rt_err_t rt_completion_wait(struct rt_completion *completion,

rt_int32_t timeout)

{

result = RT_EOK;

thread = rt_thread_self();

level = rt_hw_interrupt_disable();

if (completion->flag != RT_COMPLETED)

{

if (timeout == 0)

{

}

else

{

/* reset thread error number */

thread->error = RT_EOK;

/* suspend thread */

rt_thread_suspend(thread);

/* add to suspended list */

rt_list_insert_before(&(completion->suspended_list),

&(thread->tlist));

/* current context checking */

RT_DEBUG_NOT_IN_INTERRUPT;

/* start timer */

if (timeout > 0)

{

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

rt_timer_control(&(thread->thread_timer),

RT_TIMER_CTRL_SET_TIME,

&timeout);

rt_timer_start(&(thread->thread_timer));

}

/* enable interrupt */

rt_hw_interrupt_enable(level);

/* do schedule */

rt_schedule();

/* thread is waked up */

result = thread->error;

level = rt_hw_interrupt_disable();

}

}

/* clean completed flag */

completion->flag = RT_UNCOMPLETED;

return result;

}

主要做了以下工作:

關(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)

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

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

void rt_completion_done(struct rt_completion *completion)

{

level = rt_hw_interrupt_disable();

completion->flag = RT_COMPLETED;

if (!rt_list_isempty(&(completion->suspended_list)))

{

/* there is one thread in suspended list */

struct rt_thread *thread;

/* get thread entry */

thread = rt_list_entry(completion->suspended_list.next,

struct rt_thread,

tlist);

/* resume it */

rt_thread_resume(thread);

rt_hw_interrupt_enable(level);

/* perform a schedule */

rt_schedule();

}

}

主要做了以下工作:

關(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 源碼在 "\\rt-thread\\components\\drivers\\src\\completion.c"在你要使用的文件中#include completion.h直接就可以使用。

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

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

    關(guān)注

    23

    文章

    3231

    瀏覽量

    114327
  • IPC
    IPC
    +關(guān)注

    關(guān)注

    3

    文章

    337

    瀏覽量

    51772
  • 串口中斷
    +關(guān)注

    關(guān)注

    0

    文章

    64

    瀏覽量

    13845
  • RT-Thread
    +關(guān)注

    關(guān)注

    31

    文章

    1261

    瀏覽量

    39838
  • 調(diào)度器
    +關(guān)注

    關(guān)注

    0

    文章

    98

    瀏覽量

    5232
收藏 人收藏

    評論

    相關(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

    用DIRECTIO函數(shù)發(fā)送數(shù)據(jù)有的時候會在KeyStone_SRIO_wait_LSU_completion里面的do while循環(huán)里,不出來這是為什么?

    本帖最后由 一只耳朵怪 于 2018-6-19 15:18 編輯 Uint32 KeyStone_SRIO_wait_LSU_completion(Uint32 lsuNum, Uint32
    發(fā)表于 06-19 05:39

    6670系列SRIO 用戶手冊中關(guān)于lsu_reg6中LTID,LCB配置問題,completion code產(chǎn)生過程

    使用來指示這一過程的? 3.關(guān)于completion code,他是如何產(chǎn)生的,是否是發(fā)端發(fā)送direct IO包,收端接收到之后,給發(fā)端一個回饋,發(fā)端根據(jù)此回饋來選擇completion
    發(fā)表于 06-21 07:34

    6616 QMSS tx completion queue 如何產(chǎn)生中斷問題?

    首先想確認(rèn)下我的理解tx FDQ和tx completion queue是同一個概念(如果不對請指正)。我在我的應(yīng)用中使用的tx FDQ 有三個descriptors。我想發(fā)送完一個packet后能
    發(fā)表于 06-21 15:01

    請問為什么EDMA3無法進(jìn)入completion code function?

    本帖最后由 一只耳朵怪 于 2018-6-25 11:01 編輯 關(guān)于EDMA3的代碼在附件,問題是EDMA3無法進(jìn)入completion code function。這個問題會不會與CIC0、CIC1、CIC2有關(guān)?我只設(shè)置了CIC1片級中斷事件,沒有CIC0系統(tǒng)中斷事件。
    發(fā)表于 06-25 00:44

    兩個6655的DSP通過srio接口通訊時,主機(jī)循環(huán)向從機(jī)發(fā)送數(shù)據(jù),第一組數(shù)據(jù)completion code=0,其后一直completion code=1

    1.自制的兩個6655的evm,主機(jī)通過SRIO循環(huán)向從機(jī)發(fā)送數(shù)據(jù),發(fā)送第一組數(shù)據(jù)時顯示發(fā)送成功completion code=0,從機(jī)的對應(yīng)內(nèi)存上收到數(shù)據(jù)了且觸發(fā)了doorbell中斷,但是第二組以及后面發(fā)的數(shù)據(jù)都是completion code=1,從機(jī)沒有收到數(shù)據(jù)。
    發(fā)表于 03-25 20:52

    去掉can驅(qū)動芯片程序卡死在rt_completion_wait()怎么辦

    (1)根據(jù)rtthread官方文檔,配置好can組件。(2)把can總線驅(qū)動芯片SN65HVD230去掉(3)程序執(zhí)行起來,卡在_can_int_tx函數(shù)的rt_completion_wait()中
    發(fā)表于 08-09 09:58

    為什么rt_completion_wait不能用在ISR里

    發(fā)送CAN數(shù)據(jù)的事情。遇到的問題:Function[rt_completion_wait] shall not be used in ISR
    發(fā)表于 09-09 10:59

    為什么rt_completion_wait不能用在ISR里

    發(fā)送CAN數(shù)據(jù)的事情。遇到的問題:Function[rt_completion_wait] shall not be used in ISR6
    發(fā)表于 10-12 15:19

    Virtex-7 FPGA Gen3 Integrated Block Completion timeout 機(jī)制詳解

    任何一種 split 交易協(xié)議都存在 Requesters 得不到期望的 Completion 的風(fēng)險。為了允許 Requesters 使用一種標(biāo)準(zhǔn)方式從這種情況下恢復(fù),規(guī)定了 Completion
    發(fā)表于 11-18 13:13 ?2259次閱讀
    Virtex-7 FPGA Gen3 Integrated Block <b class='flag-5'>Completion</b> timeout 機(jī)制詳解

    你知道linux 同步機(jī)制的complete?

    在Linux內(nèi)核中,completion是一種簡單的同步機(jī)制,標(biāo)志"things may proceed"。 要使用completion,必須在文件中包含,同時創(chuàng)建一個類型為struct completion的變量。
    發(fā)表于 04-24 11:45 ?1241次閱讀

    completion是什么?怎么使用?

    completion 直接翻譯過來是完成,所以我們可以稱 rt_completion 為 完成量。在 RT-Thread 的文檔中心 中講線程間同步時,介紹了 信號量, 互斥量, 事件集 。 rt_completion 是一個
    的頭像 發(fā)表于 03-18 13:33 ?5103次閱讀

    RT-Thread隱藏的寶藏之completion

    completion 直接翻譯過來是完成,所以我們可以稱 rt_completion 為 完成量。在 RT-Thread 的文檔中心 中講線程間同步時,介紹了 信號量...
    發(fā)表于 01-25 18:54 ?0次下載
    RT-Thread隱藏的寶藏之<b class='flag-5'>completion</b>

    RT-Thread隱藏的寶藏之completion

    completion 直接翻譯過來是完成,所以我更愿意稱 rt_completion 為 完成量。在 RT-Thread 的文檔中心 中講線程間通訊(IPC)時,只介紹...
    發(fā)表于 01-25 19:27 ?0次下載
    RT-Thread隱藏的寶藏之<b class='flag-5'>completion</b>

    RT-Thread文檔_completion

    RT-Thread文檔_completion
    發(fā)表于 02-22 18:39 ?0次下載
    RT-Thread文檔_<b class='flag-5'>completion</b>