OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6501|回复: 2

OSTCBStatPend是干嘛用的到底。。

[复制链接]

4

主题

13

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-7-30
在线时间
0 小时
发表于 2013-8-8 12:08:48 | 显示全部楼层 |阅读模式
OSTCBStat的用法都清楚。OSTCBStatPend 到底是干嘛用的。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164897
金钱
164897
注册时间
2010-12-1
在线时间
2100 小时
发表于 2013-8-8 14:46:52 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

9

主题

46

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1122
金钱
1122
注册时间
2016-11-9
在线时间
96 小时
发表于 2019-12-5 15:25:42 | 显示全部楼层
void  OSSemPend (OS_EVENT  *pevent,INT32U     timeout, INT8U     *perr)
void  *OSMboxPend (OS_EVENT  *pevent, INT32U     timeout,INT8U     *perr)
这类函数的第二个参数在传入0时,是一直等待到事件发生,才继续运行;
如果要是非0,就在等待了这些时间之后,继续运行这个任务,因为timeout超时导致
任务继续运行的时候,把这个TCB的OSTCBStatPend 赋值OS_STAT_PEND_TO指示,
OS_STAT_PEND_OK是正常情况的,OS_STAT_PEND_ABORT应该和OSSemPendAbort这类函数有关,具体的目前还不清楚,没用到。

下列代码是判断已经延时的任务的延时时间是否到达:
while (ptcb->OSTCBPrio != OS_TASK_IDLE_PRIO) {     /* Go through all TCBs in TCB list              */
            OS_ENTER_CRITICAL();
            if (ptcb->OSTCBDly != 0u) {                    /* No, Delayed or waiting for event with TO     */
                ptcb->OSTCBDly--;                          /* Decrement nbr of ticks to end of delay       */
                if (ptcb->OSTCBDly == 0u) {                /* Check for timeout                            */

                    if ((ptcb->OSTCBStat & OS_STAT_PEND_ANY) != OS_STAT_RDY) {
                        ptcb->OSTCBStat  &= (INT8U)~(INT8U)OS_STAT_PEND_ANY;          /* Yes, Clear status flag   */
                        ptcb->OSTCBStatPend = OS_STAT_PEND_TO;                 /* Indicate PEND timeout    */
                    } else {
                        ptcb->OSTCBStatPend = OS_STAT_PEND_OK;
                    }

                    if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) {  /* Is task suspended?       */
                        OSRdyGrp               |= ptcb->OSTCBBitY;             /* No,  Make ready          */
                        OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
                    }
                }
            }
            ptcb = ptcb->OSTCBNext;                        /* Point at next TCB in TCB list                */
            OS_EXIT_CRITICAL();
        }
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-5-29 13:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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