#if OS_FLAG_EN>0
/**************************************************
创建一个事件标志组
入口参数:创建用来初始化事件标志组中的标志组
***************************************************/
OS_FLAG_GRP *OSFlagCreate(unsigned char flags)
{
OS_FLAG_GRP *pgrp;
if (OSIntNesting>0)
return (OS_FLAG_GRP *)0;//无法在中断中创建一个事件标志组
OS_ENTER_CRITICAL();
pgrp=OSFlagFreeList;
if(pgrp!=(OS_FLAG_GRP *)0)
{
OSFlagFreeList=(OS_FLAG_GRP *)OSFlagFreeList->OSFlagWaitList;
pgrp->OSFlagType=OS_EVENT_TYPE_FLAG;
pgrp->OSFlagFlags=flags;//写入标志组的初始值
pgrp->OSFlagWaitList=(void *)0;
OS_EXIT_CRITICAL();
return pgrp;//返回申请到的事件标志组控制块的指针
}
else
{
OS_EXIT_CRITICAL();
return (OS_FLAG_GRP *)0;//没有空闲的事件标志组控制块可申请了,申请失败
}
}
/****************************************************
删除事件标志组的服务
入口参数:要删除的事件标志组控制块的指针,删除选项
出口参数:0=删除失败,1=删除成功
失败原因:参见信号量删除失败原因
*****************************************************/
#if OS_FLAG_DEL_EN > 0
unsigned char OSFlagDel(OS_FLAG_GRP *pgrp,unsigned char opt)
{
unsigned char tasks_waiting;
OS_FLAG_NODE *pnode;
if (OSIntNesting>0)
return 0;//无法在中断中删除一个事件标志组的控制块,删除失败
OS_ENTER_CRITICAL();
if(pgrp->OSFlagWaitList!=(void *)0)
tasks_waiting=1;
else
tasks_waiting=0;
switch(opt)
{
case OS_DEL_NO_PEND:
if(tasks_waiting==0)
{
pgrp->OSFlagType=OS_EVENT_TYPE_UNUSED;//事件标志组控制块类型设为无用
pgrp->OSFlagWaitList=(void *)OSFlagFreeList;
OSFlagFreeList=pgrp;//归还删除的事件标志组控制块给系统
OS_EXIT_CRITICAL();
return 1;//删除成功,返回1
}
else
{
OS_EXIT_CRITICAL();
return 0;//有任务正在等待该事件标志组,删除失败,返回0
}
case OS_DEL_ALWAYS:
pnode=(OS_FLAG_NODE *)pgrp->OSFlagWaitList;
while(pnode!=(OS_FLAG_NODE *)0)
{
OS_FlagTaskRdy(pnode,0);
pnode=(OS_FLAG_NODE *)pnode->OSFlagNodeNext;//先将等待事件标志的所有任务就绪
}
pgrp->OSFlagType=OS_EVENT_TYPE_UNUSED;
pgrp->OSFlagWaitList=(void *)OSFlagFreeList;
OSFlagFreeList=pgrp;//再归还删除的事件标志组控制块给系统
OS_EXIT_CRITICAL();
if(tasks_waiting==1)
OS_Sched();//如果正有任务在等待该事件标志组,则调度一下
return 1;//删除成功,返回1
default:
OS_EXIT_CRITICAL();
return 0;//非法选项,返回0,删除失败
}
}
#endif
/************************************************************
等待事件标志组的服务
入口参数:等待的事件标志组控制块的指针,等待的标志,等待类型,超时时间量
出口参数:0=等待失败,1=等待成功
失败原因:参见信号量等待服务的失败原因
等待类型:0=事件标志“与”关系
1=事件标志“或”关系
0x80/0x81=等待事件标志成功后清除事件标志
*************************************************************/
unsigned char OSFlagPend(OS_FLAG_GRP *pgrp,unsigned char flags,unsigned char wait_type,unsigned int timeout)
{
OS_FLAG_NODE node;
unsigned char flags_cur;
unsigned char flags_rdy;
unsigned char consume;
if(OSIntNesting>0)
return 0;//无法在中断中实施该等待操作,等待操作失败,返回0
if(wait_type&OS_FLAG_CONSUME)
{
wait_type&=~OS_FLAG_CONSUME;
consume=1;
}
else
consume=0;
OS_ENTER_CRITICAL();
switch(wait_type)
{
case OS_FLAG_WAIT_SET_ALL://关心的标志都置1了,与关系
flags_rdy=pgrp->OSFlagFlags&flags;
if(flags_rdy==flags)
{
if(consume==1)
pgrp->OSFlagFlags&=~flags_rdy;//只清除关心的标志
flags_cur = pgrp->OSFlagFlags;
OS_EXIT_CRITICAL();
return 1;
}
else
{
OS_FlagBlock(pgrp,&node,flags,wait_type,timeout);
OS_EXIT_CRITICAL();
}
break;
case OS_FLAG_WAIT_SET_ANY://关心的标志有一个置1了,或关系
flags_rdy=pgrp->OSFlagFlags&flags;
if (flags_rdy!=0)
{
if (consume==1)
pgrp->OSFlagFlags&=~flags_rdy;
flags_cur=pgrp->OSFlagFlags;
OS_EXIT_CRITICAL();
return 1;
}
else
{
OS_FlagBlock(pgrp,&node,flags,wait_type,timeout);
OS_EXIT_CRITICAL();
}
break;
default:
OS_EXIT_CRITICAL();
flags_cur=0;
return 0;//等待类型错误,返回0
}
OS_Sched();
OS_ENTER_CRITICAL();
if(OSTCBCur->OSTCBStat&OS_STAT_FLAG)
{
OS_FlagUnlink(&node);//把等待节点脱离等待节点链表
OSTCBCur->OSTCBStat=OS_STAT_RDY;
OS_EXIT_CRITICAL();
flags_cur=0;
return 0;//超时,等待失败,返回0
}
else
{
if(consume==1)
pgrp->OSFlagFlags&=~OSTCBCur->OSTCBFlagsRdy;
return 1;//等待成功,返回1,如果需要成功后清除标志,则实施标志组标志清除操作
}
}
/***************************************************
标志组事件发送服务
入口参数:要发送的标志组事件控制块的指针,发送的标志,发送选项(0=清0标志,1=置1标志)
出口参数:0=发送失败,1=发送成功
****************************************************/
unsigned char OSFlagPost(OS_FLAG_GRP *pgrp,unsigned char flags,unsigned char opt)
{
OS_FLAG_NODE *pnode;
unsigned char sched;
unsigned char flags_rdy;
OS_ENTER_CRITICAL();
switch(opt)
{
case 0:
pgrp->OSFlagFlags&=~flags;
break;
case 1:
pgrp->OSFlagFlags|=flags;
break;
default:
OS_EXIT_CRITICAL();
return 0;//非法选项,发送失败,返回0
}
sched=FALSE;
pnode=(OS_FLAG_NODE *)pgrp->OSFlagWaitList;
while(pnode!=(OS_FLAG_NODE *)0)
{
switch(pnode->OSFlagNodeWaitType)
{
case OS_FLAG_WAIT_SET_ALL:
flags_rdy=pgrp->OSFlagFlags&pnode->OSFlagNodeFlags;
if(flags_rdy==pnode->OSFlagNodeFlags)
{
if(OS_FlagTaskRdy(pnode,flags_rdy)==TRUE)
sched=TRUE;
}
break;
case OS_FLAG_WAIT_SET_ANY:
flags_rdy=pgrp->OSFlagFlags&pnode->OSFlagNodeFlags;
if(flags_rdy!=0)
{
if(OS_FlagTaskRdy(pnode, flags_rdy)==TRUE)
sched=TRUE;
}
break;
}
pnode=(OS_FLAG_NODE *)pnode->OSFlagNodeNext; /* Point to next task waiting for event flag(s) */
}//节点链表遍历
OS_EXIT_CRITICAL();
if(sched==TRUE)
OS_Sched();
return 1;//发送成功,返回1
}
/*******************************************************
插入等待节点
*******************************************************/
void OS_FlagBlock(OS_FLAG_GRP *pgrp,OS_FLAG_NODE *pnode,unsigned char flags,unsigned char wait_type,unsigned int timeout)
{
OS_FLAG_NODE *pnode_next;
OSTCBCur->OSTCBStat|=OS_STAT_FLAG;
OSTCBCur->OSTCBDly=timeout;
#if OS_TASK_DEL_EN>0
OSTCBCur->OSTCBFlagNode=pnode;
#endif
pnode->OSFlagNodeFlags=flags;
pnode->OSFlagNodeWaitType=wait_type;
pnode->OSFlagNodeTCB=(void *)OSTCBCur;
pnode->OSFlagNodeNext=pgrp->OSFlagWaitList;
pnode->OSFlagNodePrev=(void *)0;
pnode->OSFlagNodeFlagGrp=(void *)pgrp;
pnode_next=(OS_FLAG_NODE *)pgrp->O
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
这是我学习UCOS时自己尝试仿照USOS写的RTOS,很多代码和UCOS相同,不过比UCOS精简了很多,并且还把一个移植性很好的按键驱动软件也写到这个RTOS里去了,最大只支持16个任务(包括一个空闲任务),开发环境是AVRSTUDIO4.0,硬件是ATMEGA64,整个工程都压缩在里面了,与硬件移植相关的代码都在REPOT.C文件中,与裁减相关的代码都在CUT.C文件中.<br>匆忙中还没把这个软件进一步整理好,算是草稿,见笑拉.
资源详情
资源评论
资源推荐
收起资源包目录
AVRRTOS.rar (23个子文件)
Test1
test
test.c 1KB
default
dep
test.o.d 2KB
test.hex 9KB
test.eep 13B
test.o 18KB
test.elf 14KB
Makefile 2KB
test.aps 4KB
source
SEM.c 6KB
TIME.c 431B
MBOX.c 6KB
SOURCE.c 275B
key.c 3KB
MEM.c 3KB
FLAG.c 10KB
QUE.c 7KB
TASK.c 2KB
EVENT.c 3KB
CUT.h 2KB
INIT.c 6KB
REPOT.c 7KB
RTOS.h 11KB
CORE.c 2KB
共 23 条
- 1
TOTOJOJO
- 粉丝: 1
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论1