查看: 4877|回复: 4

[原创] 【我要创作】LPC54608系统研究之MOE系统之PT协程分析

[复制链接]
  • TA的每日心情
    开心
    2020-6-18 08:45
  • 签到天数: 812 天

    连续签到: 1 天

    [LV.10]以坛为家III

    66

    主题

    4900

    帖子

    64

    金牌会员

    Rank: 6Rank: 6

    积分
    6324
    最后登录
    2025-8-6
    发表于 2017-3-11 21:11:38 | 显示全部楼层 |阅读模式
    本帖最后由 原来的你 于 2017-3-11 21:29 编辑

    上节给大家介绍了MOE操作系统在LPC54608上面的知识,本节介绍一下PT协程原理。
    /* PT init, use this macro at the beginning of PT task */
    #define PT_INIT()               static unsigned char sg_u8RunPoint = 0;

    /* PT begin, use it with PT_END to contain the pt process */
    #define PT_BEGIN()              unsigned char u8YieldFlag = 1;\
                                    switch(sg_u8RunPoint)\
                                    {\
                                         case 0:

    /* PT end, use it with PT_BEGIN to contain the pt process */
    #define PT_END()                }\
                                    u8YieldFlag   = 0;\
                                    sg_u8RunPoint = 0;

    /* PT yield, return from process */
    #define PT_YIELD()              do\
                                    {\
                                        u8YieldFlag = 0;\
                                        sg_u8RunPoint = __LINE__;case __LINE__:\
                                        if(0 == u8YieldFlag)\
                                        {\
                                            return SW_OK;\
                                        }\
                                    }\
                                    while(0)

    /* PT yield until a condition */
    #define PT_YIELD_UNTIL(c)       do\
                                    {\
                                        u8YieldFlag = 0;\
                                        sg_u8RunPoint = __LINE__;case __LINE__:\
                                        if((0 == u8YieldFlag) || !(c))\
                                        {\
                                            return SW_OK;\
                                        }\
                                    }\
                                    while(0)

    /* Wait a condition */   
    #define PT_WAIT_UNTIL(c)       do\
                                   {\
                                       u8YieldFlag = 0;\
                                       sg_u8RunPoint = __LINE__;case __LINE__:\
                                       if(!(c))\
                                       {\
                                           return SW_OK;\
                                       }\
                                   }\
                                   while(0)

    /* Wait for calling */
    #define PT_WAIT_CALL()          PT_YIELD()

    /* Wait an event */
    #define PT_WAIT_EVENT(e)        PT_YIELD_UNTIL(e == u8Evt)

    /* Wait a condition */
    #define PT_WAIT_COND(c)         PT_YIELD_UNTIL(c)

    /* Check a condition */
    #define PT_CHECK_COND(c)        PT_WAIT_UNTIL(c)

    /* Return and recall after delay */
    #define PT_DELAY(t)             Moe_Timer_Delay(t);\
                                    PT_WAIT_EVENT(EVENT_DELAY)

    /* Return and recall as soon as possible */
    #define PT_BREAK()              Moe_Event_Set(sg_u8TaskID, EVENT_BREAK, MOE_EVENT_NORMAL, NULL);\
                                    PT_YIELD()

    /* Wait for a message event */
    #define PT_WAIT_MSG()           PT_WAIT_EVENT(EVENT_MSG)

    #define PTV                     static


    PT_INIT() 表示: 初始化一个PT协程,就是初始化状态变量。

    PT_BEGIN()  表示:PT协程入口点, u8YieldFlag =0表示出让,=1表示不出让,放在 switch 语句前面,下次调用的时候可以跳转到上次出让点继续执行。

    PT_END() 表示:PT协程退出点,到此一个PT协程算是结束,清空所有上下文和标志。

    PT_YIELD()表示:PT协程出让点,如果这时协程状态变量 sg_u8RunPoint,已经变为 __LINE__ 跳转过来的,那么 u8YieldFlag = 1,表示从出让点继续执行。

    PT_YIELD_UNTIL(c) 表示:PT协程出让点附加出让条件。

    PT_WAIT_UNTIL(c)表示:PT协程阻塞点,其实实质上和PT_YIELD_UNTIL一样,只是退出条件不同,用来同步信号。

    对于PT协程使用时必须成对出现的,就像上面的一样。
















    开心
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2019-10-17 08:07
  • 签到天数: 273 天

    连续签到: 1 天

    [LV.8]以坛为家I

    74

    主题

    2338

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    7517
    最后登录
    2021-8-30
    发表于 2017-3-11 21:15:37 | 显示全部楼层
    楼主,厉害了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-6-18 08:45
  • 签到天数: 812 天

    连续签到: 1 天

    [LV.10]以坛为家III

    66

    主题

    4900

    帖子

    64

    金牌会员

    Rank: 6Rank: 6

    积分
    6324
    最后登录
    2025-8-6
     楼主| 发表于 2017-3-11 21:17:04 | 显示全部楼层

    共同学习,方法大家理解
    开心
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-5-29 08:54
  • 签到天数: 2992 天

    连续签到: 8 天

    [LV.Master]伴坛终老

    45

    主题

    5548

    帖子

    22

    金牌会员

    Rank: 6Rank: 6

    积分
    12035
    最后登录
    2025-5-29
    发表于 2017-3-11 21:46:37 来自手机 | 显示全部楼层
    楼主厉害了,赞一个。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-11-30 16:16
  • 签到天数: 206 天

    连续签到: 1 天

    [LV.7]常住居民III

    74

    主题

    2793

    帖子

    5

    金牌会员

    Rank: 6Rank: 6

    积分
    7905
    最后登录
    2025-4-11
    发表于 2017-3-11 22:38:28 | 显示全部楼层
    厉害了我的哥
    来根华子
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-8-28 00:45 , Processed in 0.082668 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表