色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    文章

    3251

    瀏覽量

    115021
  • IPC
    IPC
    +關注

    關注

    3

    文章

    352

    瀏覽量

    51963
  • 串口中斷
    +關注

    關注

    0

    文章

    67

    瀏覽量

    13938
  • RT-Thread
    +關注

    關注

    31

    文章

    1296

    瀏覽量

    40238
  • 調度器
    +關注

    關注

    0

    文章

    98

    瀏覽量

    5261
收藏 人收藏

    評論

    相關推薦

    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 ?2334次閱讀
    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 ?1301次閱讀

    completion是什么?怎么使用?

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

    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>
    主站蜘蛛池模板: 男的插曲女的下面免费APP| 九色PORNY真实丨国产大胸| 国产偷啪自怕网| 日本精品久久无码影院| 2021自产拍在线观看视频| 精品无码久久久久久久动漫| 亚洲第一页视频| 国产亚洲国际精品福利| 十分钟免费看完整视频| 二级特黄绝大片免费视频大片| 青青草原成人| 嘟嘟嘟WWW免费高清在线中文| 青娱乐极品视觉盛宴av| 边做边爱免费视频| 色狼亚洲色图| 国产精品爆乳尤物99精品| 無码一区中文字幕少妇熟女网站 | 韩国和日本免费不卡在线| 性色AV乱码一区二区三区视频| 国产精品一区二区三区免费| 香蕉尹人综合精品| 国际老妇高清在线观看| 一个人的HD高清在线观看| 久久综合伊人 magnet| 97色伦97色伦国产| 日本高清在线一区二区三区| 国产成人mv 在线播放| 亚洲国产精品无码中文字满| 久久www99re在线播放| 中文字幕无码一区二区免费 | 三叶草未满十八岁| 国产亚洲人成在线视频| 亚洲午夜久久久精品电影院| 久久久久久久久亚洲| 99精品99| 日本性xxx| 国语自产偷成人精品视频| 在线观看免费视频播放视频| 欧美又粗又大AAAA片| 国产午夜精品鲁丝片| 在线看片亚洲|