UCOSII中OSFlagPend讲解
时间: 2023-12-14 17:39:16 浏览: 36
在UCOSII中,OSFlagPend函数用于等待指定事件标志组的某些标志位被设置。其函数原型如下:
```c
OS_FLAGS OSFlagPend (OS_FLAG_GRP *pgrp, OS_FLAGS flags,
INT16U timeout, INT8U wait_type, INT8U *perr)
```
其中,参数pgrp是所要等待的事件标志组,参数flags指定了所要等待的标志位,参数timeout是等待的超时时间,单位为系统时钟节拍数,如果为0则表示永久等待。参数wait_type表示等待的类型,可以是以下几种之一:
- OS_FLAG_WAIT_CLR_ALL:等待所有指定的标志位都被清除
- OS_FLAG_WAIT_CLR_ANY:等待任意一个指定的标志位被清除
- OS_FLAG_WAIT_SET_ALL:等待所有指定的标志位被设置
- OS_FLAG_WAIT_SET_ANY:等待任意一个指定的标志位被设置
参数perr表示函数执行过程中的错误码,函数执行成功时*perr被赋值为OS_NO_ERR,否则被赋值为相应的错误码。
该函数的执行流程如下:
1. 禁止任务调度(即关中断)
2. 检查事件标志组是否已经满足等待条件,如果满足则立即返回
3. 将任务加入到等待队列中,并设置任务等待的标志位和等待类型
4. 开启任务调度(即开中断)
5. 如果超时时间为0,则一直等待,否则等待指定的超时时间
6. 如果等待结束是因为事件标志组已经满足等待条件,则将任务从等待队列中移除,并从事件标志组中清除相应的标志位
7. 如果等待结束是因为超时,则将任务从等待队列中移除,并从事件标志组中清除相应的标志位
8. 恢复任务调度
需要注意的是,该函数只能在任务中调用,不能在中断中调用。此外,如果在等待过程中任务被删除,那么该任务会立即从等待队列中移除,并返回错误码OS_ERR_TASK_DEL。