当前位置:
文档之家› RTX 嵌入式实时操作系统事件的使用
RTX 嵌入式实时操作系统事件的使用
3:如果用户想使用事件,则用户可以调用 os_evt_set(evt_flags, task_id)函数,
函数执行后,任务 ID 为 task_id 的任务在操作系统内对应的事件标志变量(不是
evt_flags)会和 evt_falgs 进行 按位或 运算
因此如果用户使用事件 3,则 evt_flags = (1 << (3-1)) = 0x0004(0000 0000 0000
0100)
同理如果用户使用事件 n(1 <= n <= 16),则 evt_flags = 1<<(n-1)
4:用户可以同时设置多个事件
如果用户使用事件 1 和 5,则 evt_flags = (1 << 3) | (1 << 5) = 0x0011
如果用户使用事件 x , y 和 z,则 evt_flags = (1 << x) | (1 << y) | (1 << z)
os_evt_wait_or(0x0001 | 0x0002, 0xffff);则 os_evt_wait_or 后的代码可以继续运行
但是如果是 os_evt_wait_or(0x0004 | 0x0008 , 0xffff);则 os_evt_wait_or 后的代码无法
继续运行
os_evt_wait_and(wflags,tmo) 等待一个或多个事件中的所有事件标志
要想使用事件,必须先了解 RTX 系统中的事件运行原理
0:不需要用户自己定义事件变量,这跟信号和互斥不同(这两者都需要用户自己定义变
量)
1:RTX 系统中每个任务最多有 16 个事件标志
2:evt_falgs 和 wflags 都是 U16 类型变量
0x0000 变量共有 16 位 每一位对应一
个事件因此最多可以表示 16 个事件
如果设置了事件 1 则本任务在操作系统内对应的事件标志变量 为 0x0001 ,wflags 和 0x0117 按位与运算之后的值是 0x0001(不等于 wflags) 如果设置了事件 9 则本任务在操作系统内对应的事件标志变量 为 0x0100 ,wflags 和 0x0117 按位与运算之后的值是 0x0000(不等于 wflags) 7:os_evt_set 函数设置的事件标志位,只能供 os_evt_wait_or 或者 os_evt_wait_and 使 用一次,使用之后系统自动立即清除 因此如果想要再次使得 os_evt_wait_or 或者 os_evt_wait_and 能够运行下去,就必须 再次调用函数 os_evt_set 函数设置事件标志位
0x0206:事件
10、事件 3 和事件 2
0xffff:事件 1……事件 16
task_id 任务 ID
os_evt_wait_or(wflags,tmo) 等待一个或多个事件中的任意一个事件标志
参数说明:
wflags 事件
0x0001:事件 1 0x0002:事件 2
0x0010:事件 5 0x8000:事件 16
tmo 等待时间
例:用户调用 os_evt_set(0x0001, task_id); os_evt_set(0x0002, task_id);
os_evt_wait_and(0x0001 | 0x0002, 0xffff);则 os_evt_wait_or 后的代码可以继续运行
但是如果是 os_evt_wait_or(0x0001 | 0x0002 | 0x0004 , 0xffff);则 os_evt_wait_or 后的 代码无法继续运行
(按位与可以滤除 wflags 不需要判断的事件) 例:有 3 个事件分别是 1 2 和 5,当调用 0s_evt_set(evt_flags, task_id)函数之后,如 果 3 个事件中有任意一个被设置即 (evt_flags = 0x0001 或 0x0002 或 0x0010 或者 0x0003 或 0x0011 或 0x0012 或 0x0013),则当调用 os_evt_wait_and(wflags, tmo)函数之后 即等待所有的事件都发生,此时 wflags 可以是如下几个值 0x0001 尽管有 3 个事件,但是此时等待函数可以仅仅等待 事件 1 发生(事件 2 和事 件 5 变成干扰项) 0x0002 尽管有 3 个事件,但是此时等待函数可以仅仅等待 事件 2 发生(事件 1 和事 件 5 变成干扰项) 0x0010 尽管有 3 个事件,但是此时等待函数可以仅仅等待 事件 5 发生(事件 1 和事 件 2 变成干扰项) 0x0003 = 0x0001 | 0x0002 尽管有 3 个事件,但是此时等待函数可以等待 事件 1 和 事件 2 都发生(事件 5 变成干扰项) 0x0011 = 0x0010 | 0x0001 尽管有 3 个事件,但是此时等待函数可以等待 事件 1 和 事件 5 都发生(事件 2 变成干扰项) 0x0012 = 0x0010 | 0x0002 尽管有 3 个事件,但是此时等待函数可以等待 事件 2 和 事件 5 都发生(事件 1 变成干扰项) 0x0013 = 0x0010 | 0x0002 | 0x0001 尽管有 3 个事件,但是此时等待函数可以等 待 事件 1、事件 2 和 事件 5 都发生 以 wflags = 0x0013 为例, 如果设置了事件 1 事件 2 事件 3 事件 5 和 事件 9 则本任务在操作系统内对应的事件 标志变量(事件 3 和事件 9 是干扰项) 为 0x0117 ,wflags 和 0x0117 按位与运算之后的值是 0x0013(等于 wflags)
首先:主要使用的函数有
os_evt_wait_or(wflags,tmo) 等待一个或多个事件中的任意一个事件标志
os_evt_wait_and(wflags,tmo) 等待一个或多个事件中的所有事件标志
os_evt_set(evt_flags,task_id) 设置对应任务的事件标志
os_evt_clr(clr_flags,task_id) 清除对应任务的事件标志
(evt_flags = 0x0001 或 0x0002 或 0x0010 或者 0x0003 或 0x0011 或 0x0012 或 0x0013),则当调用 os_evt_wait_or(wflags, tmo)函数之后
即等待任意一个事件的发生,此时 wflags 可以是如下几个值 0x0001 尽管有 3 个事件,但是此时等待函数可以仅仅等待 事件 1 发生(事件 2 和事 件 5 变成干扰项) 0x0002 尽管有 3 个事件,但是此时等待函数可以仅仅等待 事件 2 发生(事件 1 和事 件 5 变成干扰项) 0x0010 尽管有 3 个事件,但是此时等待函数可以仅仅等待 事件 5 发生(事件 1 和事 件 2 变成干扰项) 0x0003 = 0x0001 | 0x0002 尽管有 3 个事件,但是此时等待函数可以等待 事件 1 和 事件 2 中的任意一个发生(事件 5 变成干扰项) 0x0011 = 0x0010 | 0x0001 尽管有 3 个事件,但是此时等待函数可以等待 事件 1 和 事件 5 中的任意一个发生(事件 2 变成干扰项) 0x0012 = 0x0010 | 0x0002 尽管有 3 个事件,但是此时等待函数可以等待 事件 2 和 事件 5 中的任意一个发生(事件 1 变成干扰项) 0x0013 = 0x0010 | 0x0002 | 0x0001 尽管有 3 个事件,但是此时等待函数可以等 待 事件 1、事件 2 和 事件 5 都发生 以 wflags = 0x0013 为例, 如果设置了事件 1 事件 2 事件 3 事件 5 和 事件 9 则本任务在操作系统内对应的事件 标志变量(事件 3 和事件 9 是干扰项) 为 0x0117 ,wflags 和 0x0117 按位与运算之后的值是 0x0013(真) 如果设置了事件 1 则本任务在操作系统内对应的事件标志变量 为 0x0001 ,wflags 和 0x0117 按位与运算之后的值是 0x0001(真)
函数说明:
os_evt_set(evt_flags,task_id) 设置对应任务的事件标志
参数说明:
evt_flags 事件
0x0001:事件 1 0x0002:事件 2
0x0010:事件 5 0x8000:事件 16 事
件 n:evt_flags = 1<<(n-1)
0x0003:事件 1 和事件 2 0x0007:事件 1、事件 2 和事件 3
如果设置了事件 9 则本任务在操作系统内对应的事件标志变量 为 0x0100 ,wflags 和 0x0117 按位与运算之后的值是 0x0000(假) 6:当使用 os_evt_wait_and 函数的时候,系统会自动把 wflags 和 本任务在操作系统内 对应的事件标志变量进行 按位与 运算 如果按位与运算值等于 wflags(所有的事件都发生),则任务继续执行,否则任务挂起
也可以使用 0x0001 | 0x0010 = 0x0011 的方式,而且强烈推荐使用或运算的方式,
使用或运算的时候 事件 1 就是 0x0001 事件 2 就是 0x0002 事件 10 就是 0x0200 事
件 16 就是 0x8000
这样就可以很快让读者明白程序里使用哪些事件,而不用费力的去换算
使用或运算的时候 事件 1 就是 0x0001 事件 2 就是 0x0002 事件 10 就是 0x0200 事
件 16 就是 0x8000
这样就可以很快让读者明白程序里使用哪些事件,而不用费力的去换算
tmo 等待时间
例:用户调用 os_evt_set(0x0001, task_id); os_evt_set(0x0002, task_id);
事件 n:evt_flags = 1<<(n-1)