学习笔记
for
redesigned
2012-10-8
versions:V-0.1
All
#include
#define
OS_STK
OS_STK
OS_STK
OS_STK
char
char
char
INT8U
INT8U
OS_FLAG_GRP
//事件控制块用来描述信号量,消息邮箱,消息队列
void
void
void
void
void
{
}
void
{
#if
#endif
}
void
{
#if
#endif
pdata=pdata;
for(
{
OSFlagPend(
Sem_F,
(OS_FLAGS)3,
//因为过滤器和信号量集中的信号都是OS_FLAGS类型的数据
//OS_FLAG_WAIT_SET_ALL+OS_FLAG_CONSUME,
//任务等待的事件发生后,清除相应的事件标志位
OS_FLAG_WAIT_SET_ALL,
0,
&err
);
//任务MyTask在这里请求信号量集,如果请求到了信号量集,就继续运行,下面就显示信息,如果请求不到信号量集
//MyTask就挂起,处于等待状态,只到请求到了信号量集才继续往下运行
PC_DispStr(10,++y,s1,DISP_BGND_BLACK+DISP_FGND_WHITE);
OSTimeDlyHMSM(0,0,2,0);
}
}
void
{
#if
#endif
pdata=pdata;
for(
{
PC_DispStr(10,++y,s2,DISP_BGND_BLACK+DISP_FGND_WHITE);
OSTimeDlyHMSM(0,0,8,0);
OSFlagPost(
Sem_F,
(OS_FLAGS)2,
//因为信号为OS_FLAGS型的
OS_FLAG_SET,
&err
);
OSTimeDlyHMSM(0,0,2,0);
}
}
void
{
#if
#endif
pdata=pdata;
for(
{
PC_DispStr(10,++y,s3,DISP_BGND_BLACK+DISP_FGND_WHITE);
OSTimeDlyHMSM(0,0,8,0);
OSFlagPost(
Sem_F,
(OS_FLAGS)1,
OS_FLAG_SET,
&err
OSTimeDlyHMSM(0,0,1,0);
}
}
//因为任务MyTask请求信号量集的时候请求的是第一位和第零位,所以下面两个任务分别发送第一位和第零位信号
//有一个问题:任务请求信号量集,得到信号后,信号量集中的对应的信号会被清除么??从本例的运行现象来看,好像
//是没有清除,因为当第一次YouTask和HerTask运行后,间隔了8s任务MyTask才运行,因为YouTask和HerTask都等待了8s
//才向信号量集发送信号。这个显现是正常的。但是以后MyTask每间隔2s就运行一次,没有间隔8s,等待信号量集。
//查到了:OSFlagPend()函数允许指定在任务等待的事件发生后,重新置起或是清除相应的事件标志位。这是通过在调用
//OSFlagPend()函数时将一个常量OS_FLAG_CONSUME和参数wait_type相“加”(或者相“或”)来实现的。
//例如希望等待事件标志组的BIT0位置位,而此时事件标志组的BIT0位已经置位了,那么如果在调用OSFlagPend()时,把参数
//wait_type加上OS_FLAG_CONSUME,就能清除这个事件标志位。如下所示:(详细说明,参见P210)
上一篇:ucos-ii学习笔记——动态内存分配原理及使用
下一篇:ucos-ii学习笔记——消息队列的原理及使用
推荐阅读最新更新时间:2024-03-16 14:29