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

    文章

    3246

    浏览量

    114703
  • IPC
    IPC
    +关注

    关注

    3

    文章

    346

    浏览量

    51897
  • 串口中断
    +关注

    关注

    0

    文章

    64

    浏览量

    13880
  • RT-Thread
    +关注

    关注

    31

    文章

    1285

    浏览量

    40067
  • 调度器
    +关注

    关注

    0

    文章

    98

    浏览量

    5245
收藏 人收藏

    评论

    相关推荐

    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 2302次阅读
    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 1279次阅读

    completion是什么?怎么使用?

    completion 直接翻译过来是完成,所以我们可以称 rt_completion 为 完成量。在 RT-Thread 的文档中心 中讲线程间同步时,介绍了 信号量, 互斥量, 事件集 。 rt_completion 是一个
    的头像 发表于 03-18 13:33 5279次阅读

    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>