0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

completion是什么?怎么使用?

RTThread物联网操作系统 来源:CSDN技术社区 作者: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 的实现

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}

干了两件事:

设置 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}

主要做了以下工作:

关中断: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;

返回线程状态

这样就完成了线程的挂起。

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 }

主要做了以下工作:

关中断: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 源码在 “ t-threadcomponentsdriverssrccompletion.c”在你要使用的文件中#include completion.h直接就可以使用。

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4940

    浏览量

    73120
  • 信号量
    +关注

    关注

    0

    文章

    53

    浏览量

    8738

原文标题:RT-Thread隐藏的宝藏之completion

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    暴涨468.78%,市值破3000亿,国产GPU迈入新阶段

    电子发烧友网报道(文/李弯弯)12月5日,被称为“国产GPU第一股”摩尔线程开盘报650元/股,较发行价114.28元/股上涨468.78%,总市值突破3000亿元,单签盈利高达26.786万元,成为年内最赚钱新股。其发行价114.28元/股,更是创下A股近一年来上市新股之最。   在全球科技博弈日益激烈的今天,算力已然成为国家竞争力的核心要素。GPU作为人工智能、大模型、数字孪生等前沿技术的“算力心脏”,正从幕后走向战略前台。近年来,面对外部技术封锁的困境,中
    的头像 发表于 12-06 00:56 1410次阅读

    五家大厂盯上,英特尔EMIB成了?

    电子发烧友网综合报道 最近,英特尔EMIB封装火了,在苹果、高通、博通的招聘信息中,都指出正在招募熟悉EMIB封装的工程师。近期还有消息称,由于台积电CoWoS 先进封装产能持续紧张,Marvell和联发科也正在考虑将英特尔EMIB封装应用到ASIC芯片中。   EMIB(Embedded Multi-die Interconnect Bridge,嵌入式多芯片互连桥)是英特尔主导推广的一种2.5D 先进封装技术,通过在有机封装基板中嵌入小型硅桥实现多个芯片 (芯粒) 之间的高速互连,是业界首个采用嵌入式桥接
    的头像 发表于 12-06 03:48 249次阅读

    AMD获部分MI 308对华出口许可,拟缴15%费用破局地缘困局

    电子发烧友网综合报道 2025年12月5日,AMD首席执行官苏姿丰(Lisa Su)当日确认,公司已获得向中国出口部分MI 308人工智能芯片的许可,并准备为此向美国政府缴纳相当于销售额15%的费用。   这一安排源于今年8月美国政府与英伟达和AMD达成的协议。根据该协议,两家公司可通过支付15%费用的方式,恢复向中国出口部分高性能芯片。 15%费用换市场 8亿美元损失有望挽回 苏姿丰明确表示:“我们已取得相应出口许可证,若顺利出货,将依法向美国政府缴纳
    的头像 发表于 12-06 01:50 346次阅读

    成都华微荣获财联社“最佳投资者关系团队”奖

    12月4日,在财联社主办的“2025上市公司价值引领大会”峰会上,成都华微投资者关系团队凭借专业高效的沟通服务、透明规范的工作实践,荣获“最佳投资者关系团队奖”,这份荣誉是资本市场对公司投关工作的认可与肯定。 对上市公司来说,投资者关系管理是连接公司与资本市场的桥梁,也是公司治理水平的直观体现。一直以来,公司投关团队秉持“专业、透明、及时”的工作理念:积极响应监管号召,认真做好信息披露;搭建多渠道沟通平台,用
    的头像 发表于 12-05 20:23 330次阅读

    紫光国芯:以三维堆叠存储技术突破,筑牢算力时代“数据基石”

    存储技术的竞赛,是智能时代一场没有硝烟的战争。当算力需求呈指数级增长,传统存储架构日益成为性能瓶颈,三维堆叠技术正成为打破“内存墙”的关键路径。在这一前沿领域,紫光国芯的突破引人注目。 01 战略定位:全栈存储产品与解决方案提供商 紫光国芯是新紫光集团在半导体与数字经济领域布局的关键一员。公司明确将自己定位为“以存储技术为核心的产品和服务提供商”,其业务版图完整覆盖了从底层芯片到系统服务的价值链。公司五大
    的头像 发表于 12-05 20:21 442次阅读

    国内首款AI助盲眼镜发布,1700万视障人士的新眼睛

    在国际残疾人日(12 月 3 日)这一天,杭州瞳行科技公司正式发布国内首款 AI 助盲眼镜。该眼镜由眼镜主体、手机、遥控指环、盲杖四部分组成,目前已正式面市。
    的头像 发表于 12-05 20:19 291次阅读
    国内首款AI助盲眼镜发布,1700万视障人士的新眼睛

    理想AI眼镜Livis重磅发布,黑芝麻智能AI影像解决方案强势赋能

    12月3日,理想汽车首款AI眼镜Livis正式亮相,引发业界与市场的广泛关注。此次,黑芝麻智能与理想深度合作,打造AI影像解决方案,涵盖HDR融合、MFNR多帧降噪、视频EIS防抖、夜景增强、人像美化等影像算法,全面覆盖夜景、人像等高频用户使用场景,为用户带来优质影像体验。   作为理想汽车AI能力的重要延伸载体,理想AI眼镜 Livis致力于实现"车内外无缝衔接"的智能体验。理想汽车董事长兼 CEO 李想更是将Livis 盛赞为 "理想最好的人工智能附件"。在理想
    的头像 发表于 12-05 20:18 314次阅读
    理想AI眼镜Livis重磅发布,黑芝麻智能AI影像解决方案强势赋能

    【原创】【RA4M2-SENSOR开发板评测】低功耗+USB综合测试

    for write completion *@param[in]None *@retvalFSP_SUCCESSUpon success *@retvalany other
    发表于 11-29 19:25

    Xilinx高性能NVMe Host控制器IP+PCIe 3.0软核控制器IP,纯逻辑实现,AXI4和AXI4-Stream DMA接口,支持PCIe 3.0和4.0

    、SMART、Error Information、Device Self-test、Create/Delete IO Submission/Completion Queue、Set Features
    发表于 11-14 22:40

    JLINK烧录很慢,需要30多S是为什么?

    map ‘after startup completion point’ is active J-Link>q Script processing completed.
    发表于 11-12 07:51

    通过scons生成RT-Thread Studio工程,编译报rtconfig_preinc.h告警怎么解决?

    /components/drivers/pin/pin.c\" arm-none-eabi-gcc \"../rt-thread/components/drivers/ipc/completion
    发表于 09-29 09:01

    rt-thread 在mdk5中使用v6编译器编译出错怎么解决?

    completion.c... ArmClang: error: unsupported option \'--c99\' compiling dataqueue.c... ArmClang: error
    发表于 09-24 07:22

    新版Rtthread 中使用dist 导出的bsp工程包 编译报错怎么解决?

    compiling completion_comm.c... compiling pipe.c... compiling completion_up.c... compiling
    发表于 09-12 08:08

    rt_can_write内_can_int_tx死循环是怎么回事?

    ;sem)); continue; } can->status.sndchange = 1; rt_completion_wait(&(tx_tosnd->
    发表于 09-11 07:04

    NVMe协议简要分析

    Completion Queue,CQ)机制。SQ用于存放提交命令,而CQ则用于存放完成信息。队列状态信息通过门铃寄存器(Door Bell,DB)来检测。这两个队列采用了环形队列结构,队列可以映射
    发表于 05-15 00:34