版权声明:玛雅实时操作系统(MY-RTOS)软件及其说明文档由 欣欣学习网 版主 Stoneway QI 创作,作者保留其版权。任何人可以免费在其产品设计或著作中使用或引用该软件及其说明文档,但要求保留原作品当中的版权声明,并注明引用段落的出处。 -- Stoneway QI 主页: http://www.xxworks.com 邮箱: Stonewayqi@hotmail.com 在多任务的系统中,任务之间往往要交换一些信息,才能更好的实现协同。玛雅系统为使用者提供的“事件”服务就是为了满足这一要求而设置的。与信号量类似,任务之间可以通过事件来协调各自的进度,但与信号量不同的是,事件可以传递更为详细的信息,而不是单纯的相互触发。
在玛雅系统中,事件每次被触发可以携带一个32位字长的消息给接收方。消息的投送者可以任务,也可以是中断服务程序,但是消息的接收者只能是任务,中断服务程序不允许等待事件。
应用程序在使用事件之前要对其进行定义。玛雅系统要求事件被定成全局变量或者静态局部变量。在动态内存中建立事件是允许的。事件在投入使用前要予以赋初值,或使用函数OSResetEvent()来对其初始化,如下列代所示:
|
...
OS_EVENT Event = {0, 0, 0}; //将事件定义成全局变量并赋初值
...
void main(void)
{
static OS_EVENT Event; //将事件定义成静态局部变量
BSP(); // 硬件初化
OSInit(72000); //玛雅系统初始化
OSResetEvent(&Enent); //对事件做初始化
...
while(1)
{
...
}
} (1) |
|
任务通过调用系统函数OSWaitEvent()来等待事件。该函数有4个入口参数,第1个入口参数是事件指针,指向所等待的事件,第2个参数是U32型指针,指向一个用于存放事件消息的U32型变量,第3个参数是1个U8型的指针,指向1个用于存放消息序号的U8型变量,第4个入口参数是1个S16型变量,用来传递超时限定时间,单位为系统节拍,当取值 -1 时表示无限期等待。当该函数的返回值为OS_STATUS_OK时,表示成功等到事件,此时消息代码及消息序号放到对应的变量中,返回其它值则分别代表各种错误。
|
...
...
void main(void)
{
U32 Msg = 0;
U8 MsgId = 0;
...
...
while(1)
{
...
if(OSWaitEvent(&Event, &Msg, &MsgId, 1000) == OS_STATUS_OK)
{ //等待1个事件,并限定等待时间为1000个统节拍
... //对事件的消息代码进行处理
}
...
}
} (2) |
|
任务对事件投送消息是通调用系统函数OSPostEvent()来实现的。该函数有两个入口参数,第1入口参数为事件指针,指向持操作的事件,第2个参数是U32型变量,用来传递消息代码。
|
...
#define MSG1 ...
#define MSG2 ...
...
void Task(void)
{
...
while(1)
{
...
if(...) //根据条件向事件投送不同的消息代码
{
OSPostEvent(&Event, MSG1);
}
else
{
OSPostEvent(&Event, MSG2);
}
...
}
} (3) |
|
当有消息被投送到事件中时,等待该事件的紧急任务的紧急信号会被触发,若此时它的紧急信号未被屏弊,它将转到紧急优先级上。在多个任务同时等待同一个事件时,当事件有消息被投送后,所有这些任务匀能获得该消息,但高优级的任务优先进行处理。
|