uC/OS事件标志组(event flag
来源:互联网 发布:php 二进制转base64 编辑:程序博客网 时间:2024/06/05 02:49
uC/OS事件标志组(event flag)
作者:jk.li (jk.li@foxmail.com)
引入事件标志组的目的是为了,在一个任务和多个任务之间进行同步,例如有一做饭任务,需要打水任务和买米任务的支持,只有打水任务和买米任务都完成后,做饭任务在开始执行。
等待类型一共有4中分别是:
OS_FLAG_WAIT_SET_ALL
OS_FLAG_WAIT_SET_ANY
OS_FLAG_WAIT_CLR_ALL
OS_FLAG_WAIT_CLR_ANY
WAIT_SET_ALL:意味着所有的条件都要被置位才能继续执行,好比你要做饭,必须有水和米缺一不可。
WAIT_SET_ANY:任何一个条件被置位都能继续执行,去饭馆吃饭,点了2个菜,那个菜上来了就可以开动了。
WAIT_CLR_ALL:所有的条件都被清除了才能继续执行,好比想结束游戏,必须清除所有的敌人。
WAIT_CLR_ANY:任何一个条件被被清除了都能继续执行,在游戏过程中,清除任何一个人质,游戏也结束了。
其实只要有两种等待类型就够用了
一个使用event flag的例子:
#define 水 0x01
#define 米 0x02
#define 青菜 0x04
#define 肉 0x08
static void Task_做饭(void *pdata)
{
While (1) {
OSFlagPend( eflag, 水 | 米, OS_FLAG_WAIT_SET_ALL, 0, &err); //等待水、米全部到齐后开始做饭
}
}
static void Task_做菜(void *pdata)
{
While (1) {
OSFlagPend( eflag, 青菜 | 肉, OS_FLAG_WAIT_SET_ANY, 0, &err); //青菜或者肉有一样到位了就可以开始做菜啦
}
}
static void Task_打水(void *pdata)
{
While (1) {
OSFlagPost(eflag, 水, OS_FLAG_SET, &err);
}
}
static void Task_买米(void *pdata)
{
While (1) {
OSFlagPost(eflag, 米, OS_FLAG_SET, &err);
}
}
static void Task_买菜(void *pdata)
{
While (1) {
OSFlagPost(eflag, 青菜, OS_FLAG_SET, &err);
}
}
static void Task_买肉(void *pdata)
{
While (1) {
OSFlagPost(eflag, 肉, OS_FLAG_SET, &err);
}
}
某一时刻事件标志组状态图
有了前面的基础理解OSFlagPend就非常的简单,他做了如下工作:
1、按规则比较参数中的flag与事件标志组的flag,这里的规则就是前面提到的,全部满足还是任意一个满足
2、如果满足条件,则获得该事件标志组返回
3、如果不满足,则将该等待插入事件标志组等待列表
OSFlagPost则做了如下工作:
1、设置事件标志组的flag
2、轮询等待列表,看那个满足要求,如果满足的所有的条件,则移除该节点,并将该任务放入就绪队列,这样下次调度的时候,该任务就有机会运行了
- uC/OS事件标志组(event flag)
- uC/OS事件标志组(event flag
- uC/OS-III之事件标志组
- UC/OS II 事件标志组管理(一)
- UC/OS II 事件标志组管理(二)
- uC/OS-II实验程序之一(事件标志)
- uc/os基本知识-事件
- uc/os-iii学习笔记-任务同步(信号量、时间标志组)
- uC/OS-II 学习笔记之:事件
- uC/OS-II 学习笔记:事件
- uC/OS-II事件控制块2
- uc/os-ii事件控制块
- UC/OS II事件管理(1)
- Raw-OS源码分析之事件标志
- 对uC/OSII 事件标志管理的理解
- 标志寄存器flag
- 标志寄存器FLAG
- 8086标志寄存器FLAG
- 将博客搬至CSDN
- 嵌入式驱动开发的前期Linux 和 C学习(三)
- css 背景透明,文字不透明,alpha滤镜,opacity,position:relative;
- eclipse离线安装adt-21.1
- UVA 11584 Partitioning by Palindromes
- uC/OS事件标志组(event flag
- mysql
- 推送通知iOS客户端编写实现及推送服务器端编写
- C++的引用的使用
- asp.net中网页间传递参数用什么方法比较
- Activiti用Api创建数据库表
- C程序之4:向量归并排序
- 监听无响应,同时发现两个Listener
- hdu 2571 命运