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

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

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

3天內不再提示

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

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

1.completion 是什么

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

2.completion 怎么使用

completion 的使用非常簡單

定義一個完成量

struct rt_completion completion;

初始化完成量

rt_completion_init(&completion);

等待完成量

rt_completion_wait(&completion);

釋放完成量

rt_completion_done(&completion);

3.completion 的實現

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

}

干了兩件事:

設置 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;

}

主要做了以下工作:

關中斷: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;

返回線程狀態

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

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

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

}

}

主要做了以下工作:

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

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

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

    關注

    23

    文章

    3254

    瀏覽量

    115073
  • IPC
    IPC
    +關注

    關注

    3

    文章

    352

    瀏覽量

    51978
  • 串口中斷
    +關注

    關注

    0

    文章

    67

    瀏覽量

    13959
  • RT-Thread
    +關注

    關注

    31

    文章

    1301

    瀏覽量

    40265
  • 調度器
    +關注

    關注

    0

    文章

    98

    瀏覽量

    5262
收藏 人收藏

    評論

    相關推薦

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

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

    用DIRECTIO函數發送數據有的時候會在KeyStone_SRIO_wait_LSU_completion里面的do while循環里,不出來這是為什么?

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

    6670系列SRIO 用戶手冊中關于lsu_reg6中LTID,LCB配置問題,completion code產生過程

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

    6616 QMSS tx completion queue 如何產生中斷問題?

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

    請問為什么EDMA3無法進入completion code function?

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

    兩個6655的DSP通過srio接口通訊時,主機循環向從機發送數據,第一組數據completion code=0,其后一直completion code=1

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

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

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

    為什么rt_completion_wait不能用在ISR里

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

    為什么rt_completion_wait不能用在ISR里

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

    Virtex-7 FPGA Gen3 Integrated Block Completion timeout 機制詳解

    任何一種 split 交易協議都存在 Requesters 得不到期望的 Completion 的風險。為了允許 Requesters 使用一種標準方式從這種情況下恢復,規定了 Completion
    發表于 11-18 13:13 ?2338次閱讀
    Virtex-7 FPGA Gen3 Integrated Block <b class='flag-5'>Completion</b> timeout 機制詳解

    你知道linux 同步機制的complete?

    在Linux內核中,completion是一種簡單的同步機制,標志"things may proceed"。 要使用completion,必須在文件中包含,同時創建一個類型為struct completion的變量。
    發表于 04-24 11:45 ?1306次閱讀

    completion是什么?怎么使用?

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

    RT-Thread隱藏的寶藏之completion

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

    RT-Thread隱藏的寶藏之completion

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

    RT-Thread文檔_completion

    RT-Thread文檔_completion
    發表于 02-22 18:39 ?0次下載
    RT-Thread文檔_<b class='flag-5'>completion</b>
    主站蜘蛛池模板: 九九人人| 午夜dy888理论三级| 国产福利资源在线| 国产色秀视频| 艹逼视频免费| 天天综合欧美| 美女天天干| 1024 在线观看视频免费| 免费视频在线播放| 亚洲免费不卡| 在线色网| 深爱婷婷| 男人你懂的网站| 国模视频一区| 永久免费在线视频| 手机看片日韩在线| 1024你懂的日韩| 亚洲男人天堂岛| 一级特黄牲大片免费视频| 色偷偷91综合久久噜噜| 女人被免费网站视频在线| 国产一级特黄高清免费大片| 69成人免费视频| 欧美黄色片在线播放| 欧美性猛交xxx嘿人猛交| 卡一卡二卡三国色天香永不失联| 亚洲网站www| 欧美在线观看www| 国产caoni111在线观看视频| 天天操天天插天天干| videos另类重口tv| 男人午夜视频| 色噜噜狠狠色综合欧洲| 黄色毛片子| 天天爽天天爱| 欧美另类69| www.99热.com| 欧美性videofree精品| 77788色淫网站女女免费视频| 男人资源| 男女交性视频免费播放视频|