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

    文章

    4780

    浏览量

    68542
  • 信号量
    +关注

    关注

    0

    文章

    53

    浏览量

    8333

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

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

收藏 人收藏

    评论

    相关推荐

    使用Dockerfile搭建润和WS63E的开发环境

    ; \\\\\\\\ && [ -s \"$NVM_DIR/bash_completion\" ] &&
    发表于 11-18 02:59

    PCI-E TLP学习笔记(3)

    和应答处理机制(Request Handling Rules、Completion Handling)、virtual channel(vc)Mechanism虚拟通道机制(TC/VC映射、Flow Control)、Data Integrity数据完整性等内容,话不多说,上货。
    的头像 发表于 11-06 09:19 281次阅读
    PCI-E TLP学习笔记(3)

    PCI-E TLP学习笔记(2)

    ,configuration,message request、completetion(Memory Request Package、I/O Request 包、Configuration Request包、Message、Completion Rules(应答机制)),话不多说,上货。
    的头像 发表于 11-06 09:16 301次阅读
    PCI-E TLP学习笔记(2)

    completion CAN驱动的completion会失效的原因?

    CAN配置自动重发。completion_wait 设置1秒超时。 2.接收方打开CAN准备接收,发送方准备发送。 3.发送方开始发送,接收方正常接收。此时,将接收方CAN接收关闭。然后再打开。此时CAN completion就会失效。
    发表于 09-27 08:21

    使用例程执行.$HOME/esp/esp-idf/export.sh命令进入IDF环境时弹出那么多警告是怎么回事?

    \", line 1057, in main self._main_shell_completion(extra, prog_name, complete_var) File \"
    发表于 06-21 08:01

    【米尔-瑞米派兼容树莓派扩展模块-试用体验】EtherCAT移植

    /bash-completion/ output/share/bash-completion/completions/ output/share/bash-completion/completions
    发表于 06-19 17:07

    关于SDIO命令寄存器(SDIO_CMD)的疑问求解?

    请教下SDIO命令寄存器(SDIO_CMD)第12位ENCMDcompl:使能CMD完成(Enable CMD completion)如果设置该位,则使能命令完成信号,这句咋理解是啥意思。还有开始发送命令是不是把数据写入SDIO_CMD寄存器就启动了发送开始,还是应该置位状态机就启动发送开始。谢谢
    发表于 05-16 06:57

    瑞米派实时系统与EtherCAT移植-米尔Remi Pi

    /modules/ec_master.ko output/modules/ec_generic.ko output/share/ output/share/bash-completion/ output
    发表于 04-30 18:14

    调试STM32U575的ADC驱动,从单驱动调试OK情况下移植至业务代码中出现ADC校准超时的原因?

    for calibration completion */ while (LL_ADC_IsCalibrationOnGoing(hadc->Instance) != 0UL
    发表于 03-18 07:03

    Xilinx FPGA NVMe主机控制器IP,高性能版本介绍应用

    Reset和ShutdownØ支持NVMe Admin Command Set:Identify、SMART、Create/Delete IO Submission/Completion Queue
    发表于 03-09 13:56

    OpenVINO™协同Semantic Kernel:优化大模型应用性能新路径

    作为主要面向 RAG 任务方向的框架,Semantic Kernel 可以简化大模型应用开发过程,而在 RAG 任务中最常用的深度学习模型就是 Embedding 和 Text completion,分别实现文本的语义向量化和文本生成
    的头像 发表于 03-08 10:41 704次阅读
    OpenVINO™协同Semantic Kernel:优化大模型应用性能新路径

    Xilinx FPGA NVMe Host Controller IP,NVMe主机控制器

    、Controller Reset和ShutdownØ支持NVMe Admin Command Set:Identify、SMART、Create/Delete IO Submission/Completion
    发表于 02-21 10:16

    使用UART07通过DMA进行数据发送,发出的数据不完整是怎么回事?

    */ DMA0_B0_EI = 1; /* Error interrupt issuance is enabled */ DMA0_B0_CI = 1; /* Completion interrupt
    发表于 02-21 08:30

    psoc6 i2c读写时死循环是什么原因导致的?

    ) Cy_SCB_I2C_MasterWrite(SCB3,transfer,i2cContext); /* Wait for transaction completion */ while
    发表于 02-02 11:02

    如何通过API调用控制ISR设置?

    (0, (CYDMA_INVALIDATE | CYDMA_GENERATE_IRQ)); // no interrupt!// set DMA1 post completion actions
    发表于 01-30 06:23