嵌入式实时操作系统μCOS原理与实践+事件部分代码
//事件等待表的初始化函数;pevent表示事件控制块的指针
#if (OS_EVENT_EN)
void OS_EventWaitListInit (OS_EVENT *pevent)
{
INT8U i;
pevent->OSEventGrp = 0u; /* No task waiting on event */
for (i = 0u; i < OS_EVENT_TBL_SIZE; i++) {
pevent->OSEventTbl[i] = 0u;
}
}
//事件等待表的初始化函数;pevent表示事件控制块的指针
#if (OS_EVENT_EN)
void OS_EventWaitListInit (OS_EVENT *pevent)
{
INT8U i;
pevent->OSEventGrp = 0u; /* No task waiting on event */
for (i = 0u; i < OS_EVENT_TBL_SIZE; i++) {
pevent->OSEventTbl[i] = 0u;
}
}
#endif
//事件控制块的初始化
static void OS_InitEventList (void)
{
//OS_EVENT_EN判断是否使用事件管理--事件是否大于0
#if (OS_EVENT_EN) && (OS_MAX_EVENTS > 0u)
#if (OS_MAX_EVENTS > 1u)//OS_MAX_EVENTS=10
INT16U ix;
INT16U ix_next;
//指向事假控制块的指针变量
OS_EVENT *pevent1;
OS_EVENT *pevent2;
//清空事件表---但是可能其他事件给清0了
OS_MemClr((INT8U *)&OSEventTbl[0], sizeof(OSEventTbl)); /* Clear the event table */
//初始事件控制块OS_MAX_EVENTS=10--
for (ix = 0u; ix < (OS_MAX_EVENTS - 1u); ix++) { /* Init. list of free EVENT control blocks */
ix_next = ix + 1u;
pevent1 = &OSEventTbl[ix];
pevent2 = &OSEventTbl[ix_next];
pevent1->OSEventType = OS_EVENT_TYPE_UNUSED;
pevent1->OSEventPtr = pevent2;
#if OS_EVENT_NAME_EN > 0u
//给事件区名称
pevent1->OSEventName = (INT8U *)(void *)"?"; /* Unknown name */
#endif
}
//OS_EVENT_TYPE_UNUSED=0--ix=9-表尾部
pevent1 = &OSEventTbl[ix];
pevent1->OSEventType = OS_EVENT_TYPE_UNUSED;
pevent1->OSEventPtr = (OS_EVENT *)0;
#if OS_EVENT_NAME_EN > 0u
pevent1->OSEventName = (INT8U *)(void *)"?"; /* Unknown name */
#endif
//OSEventFreeList指向控制块的头部--基本就是初始化成功
OSEventFreeList = &OSEventTbl[0];
#else
OSEventFreeList = &OSEventTbl[0]; /* Only have ONE event control block */
OSEventFreeList->OSEventType = OS_EVENT_TYPE_UNUSED;
OSEventFreeList->OSEventPtr = (OS_EVENT *)0;
#if OS_EVENT_NAME_EN > 0u
OSEventFreeList->OSEventName = (INT8U *)"?"; /* Unknown name */
#endif
#endif
#endif
}
//移除任务控制块
#if ((OS_EVENT_EN) && (OS_EVENT_MULTI_EN > 0u))
void OS_EventTaskRemoveMulti (OS_TCB *ptcb,
OS_EVENT **pevents_multi)
{
OS_EVENT **pevents;
OS_EVENT *pevent;
INT8U y;
OS_PRIO bity;
OS_PRIO bitx;
y = ptcb->OSTCBY;
bity = ptcb->OSTCBBitY;
bitx = ptcb->OSTCBBitX;
pevents = pevents_multi;
pevent = *pevents;
while (pevent != (OS_EVENT *)0) { /* Remove task from all events' wait lists */
pevent->OSEventTbl[y] &= (OS_PRIO)~bitx;
if (pevent->OSEventTbl[y] == 0u) {
pevent->OSEventGrp &= (OS_PRIO)~bity;
}
pevents++;
pevent = *pevents;
}
}
//取消事件的等待;
#if (OS_EVENT_EN)
void OS_EventTaskRemove (OS_TCB *ptcb,
OS_EVENT *pevent)
{
INT8U y;
//在事件等待表删除事件等待标志
y = ptcb->OSTCBY;
pevent->OSEventTbl[y] &= (OS_PRIO)~ptcb->OSTCBBitX; /* Remove task from wait list */
//若该行已没有任务等待
if (pevent->OSEventTbl[y] == 0u) {
//删除事件等待组的事件等待标志;
pevent->OSEventGrp &= (OS_PRIO)~ptcb->OSTCBBitY;
}
}
#endif
#if (OS_EVENT_EN)
//事件等待函数
void OS_EventTaskWait (OS_EVENT *pevent)
{
INT8U y;
//在tcb的OSTCBEventPtr域存储ecb指针-以后通过该任务的tcb可直接找到正事件的ecb
OSTCBCur->OSTCBEventPtr = pevent; /* Store ptr to ECB in TCB */
//在事件等待组和事件等待表中进行标识
pevent->OSEventTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX; /* Put task in waiting list */
pevent->OSEventGrp |= OSTCBCur->OSTCBBitY;
//OSTCBY指把任务优先级右移三位;任务优先级低三位OSTCBBitX具体在哪个位置
//以上将该任务在ecb中登记完毕,下面将阻塞这个任务-等待任务事件的发生
y = OSTCBCur->OSTCBY; /* Task no longer ready */
//把就绪表中给删除掉 取反 在与操作-给对应位给清掉;
OSRdyTbl[y] &= (OS_PRIO)~OSTCBCur->OSTCBBitX;
if (OSRdyTbl[y] == 0u) { /* Clear event grp bit if this was only task pending */
//得给就绪表里是否没有事件发生了;
OSRdyGrp &= (OS_PRIO)~OSTCBCur->OSTCBBitY;
}
}
#endif
//等待事件的任务就绪函数
#if (OS_EVENT_EN)
INT8U OS_EventTaskRdy (OS_EVENT *pevent,//对应ecb指针
void *pmsg,//信息指针
INT8U msk,//信息状态位的掩码--清除tcb状态位
INT8U pend_stat)//等待事件的原因/OS_STAT_PEND_OK/OS_STAT_PEND_ABORT
{
OS_TCB *ptcb;
INT8U y;
INT8U x;
INT8U prio;
//判断优先级
#if OS_LOWEST_PRIO > 63u
OS_PRIO *ptbl;
#endif
#if OS_LOWEST_PRIO <= 63u
//在事件等待等待表和事件组找到优先级最高的任务;
y = OSUnMapTbl[pevent->OSEventGrp]; /* Find HPT waiting for message */
x = OSUnMapTbl[pevent->OSEventTbl[y]];
prio = (INT8U)((y << 3u) + x); /* Find priority of task getting the msg */
#else
if ((pevent->OSEventGrp & 0xFFu) != 0u) { /* Find HPT waiting for message */
y = OSUnMapTbl[ pevent->OSEventGrp & 0xFFu];
} else {
y = OSUnMapTbl[(OS_PRIO)(pevent->OSEventGrp >> 8u) & 0xFFu] + 8u;
}
//查找优先级指标表找到对应的TCB指针;
ptbl = &pevent->OSEventTbl[y];
if ((*ptbl & 0xFFu) != 0u) { //若不为0 调度器每个时钟滴答对该值-1 减到0后 将任务就绪;
x = OSUnMapTbl[*ptbl & 0xFFu];
} else {
//本函数发生冲突--强制为0
x = OSUnMapTbl[(OS_PRIO)(*ptbl >> 8u) & 0xFFu] + 8u;
}
prio = (INT8U)((y << 4u) + x); /* Find priority of task getting the msg */
#endif
//任务控制块ptcb
ptcb = OSTCBPrioTbl[prio]; /* Point to this task's OS_TCB */
ptcb->OSTCBDly = 0u; /* Prevent OSTimeTick() from readying task */
#if ((OS_Q_EN > 0u) && (OS_MAX_QS > 0u)) || (OS_MBOX_EN > 0u)
//给TCB中信息指针赋值
ptcb->OSTCBMsg = pmsg; /* Send message directly to waiting task */
#else
//防止编译器发送警告
pmsg = pmsg; /* Prevent compiler warning if not used */
#endif
//清除任务状态中对应等待标志,--任务已经不再等待给事件了
ptcb->OSTCBStat &= (INT8U)~msk; /* Clear bit associated with event type */
//s设置等待状态
ptcb->OSTCBStatPend = pend_stat; /* Set pend status of post or abort */
//判断任务数是否被挂起 为0 不是挂起 -就让他就绪;挂起的任务不能因为事件的发生而就绪; /* See if task is ready (could be susp'd) */
if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) {
OSRdyGrp |= ptcb->OSTCBBitY; /* Put task in the ready to run list */
OSRdyTbl[y] |= ptcb->OSTCBBitX;
}
//在事件等待表删除该任务;
OS_EventTaskRemove(ptcb, pevent); /* Remove this task from event wait list */
#if (OS_EVENT_MULTI_EN > 0u)
if (ptcb->OSTCBEventMultiPtr != (OS_EVENT **)0) { /* Remove this task from events' wait lists */
OS_EventTaskRemoveMulti(ptcb, ptcb->OSTCBEventMultiPtr);
ptcb->OSTCBEventPtr = (OS_EVENT *)pevent;/* Return event as first multi-pend event ready*/
}
#endif
return (prio);
}
#endif
//时钟中断
void OSTimeTick (void)
{
OS_TCB *ptcb;
BOOLEAN step;
OSTimeTickHook(); /*调用用户钩子函数,默认是空函数 */
#if OS_TIME_GET_SET_EN > 0u
OS_ENTER_CRITICAL(); /* Update the 32-bit tick counter */
OSTime++; //调度计数+1
OS_EXIT_CRITICAL();
#endif
//成立表示已经启动多任务
if (OSRunning == OS_TRUE) {
#if OS_TICK_STEP_EN > 0u
switch (OSTickStepState) { /* Determine whether we need to process a tick */
case OS_TICK_STEP_DIS: /* Yes, stepping is disabled */
step = OS_TRUE;
break;
case OS_TICK_STEP_WAIT: /* No, waiting for uC/OS-View to set ... */
step = OS_FALSE; /* .. OSTickStepState to OS_TICK_STEP_ONCE */
break;
case OS_TICK_STEP_ONCE: /* Yes, process tick once and wait for next ... */
step = OS_TRUE; /* ... step command from uC/OS-View */
OSTickStepState = OS_TICK_STEP_WAIT;
break;
default: /* Invalid case, correct situation */
step = OS_TRUE;
OSTickStepState = OS_TICK_STEP_DIS;
break;
}
if (step == OS_FALSE) { /* Return if waiting for step command */
return;
}
#endif
/* Point at first TCB in TCB list */
ptcb = OSTCBList; /* Point at first TCB in TCB list */
while (ptcb->OSTCBPrio != OS_TASK_IDLE_PRIO) { /* Go through all TCBs in TCB list */
OS_ENTER_CRITICAL();
if (ptcb->OSTCBDly != 0u) { /* No, Delayed or waiting for event with TO */
ptcb->OSTCBDly--; /* Decrement nbr of ticks to end of delay */
//Check for timeout
if (ptcb->OSTCBDly == 0u) { /* Check for timeout */
//若有任务等待一事件的发生
if ((ptcb->OSTCBStat & OS_STAT_PEND_ANY) != OS_STAT_RDY) {
// Clear status flag
ptcb->OSTCBStat &= (INT8U)~(INT8U)OS_STAT_PEND_ANY; /* Yes, Clear status flag */
ptcb->OSTCBStatPend = OS_STAT_PEND_TO; /* Indicate PEND timeout */
} else {
ptcb->OSTCBStatPend = OS_STAT_PEND_OK;
}
//如果任务不是被挂起的
if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { /* Is task suspended? */
OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make ready */
OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
}
}
}
// Point at next TCB in TCB list
ptcb = ptcb->OSTCBNext; /* Point at next TCB in TCB list */
OS_EXIT_CRITICAL();
}
}
}
嵌入式实时操作系统μCOS原理与实践+事件部分代码的更多相关文章
- 嵌入式实时操作系统μCOS原理与实践任务控制与时间的解析
/*************************************************************************************************** ...
- 嵌入式实时操作系统VxWorks入门――开发环境构建[转]
VxWorks 操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),它以其良好的可靠性和卓越的实时性被广泛地应用在通 信.军事.航空.航天等高精尖技术及实时性 ...
- 嵌入式实时操作系统Nucleus PLUS综述
近些年来,随着嵌入式系统飞速的发展.嵌入式实时操作系统广泛地应用在制造工业.过程控制.通讯.仪器仪表.汽车.船舶.航空航天.军事.装备.消费类产 品等方面. Nucleus PLUS 是为实时嵌入式应 ...
- VxWorks Fuzzing 之道:VxWorks 工控实时操作系统漏洞挖掘调试与利用揭秘
转载:freebuf 0×00 前言 关于VxWorks,这里引用44CON议题<攻击 VxWorks:从石器时代到星际>探究 一文章中的介绍: VxWorks 是世界上使用最广泛的一种在 ...
- 嵌入式实时程序设计中C/C++代码的优化
1 引言 计算机技术和信息技术的高速发展的今天,计算机和计算机技术大量应用在人们的日常生活中,嵌入式计算机也得到了广泛的应用.嵌入式计算机是指完成一种或多种特定功能的计算机系统,是软硬件的紧密结合体. ...
- vxworks 实时操作系统
VxWorks 是美国 Wind River System 公司( 以下简称风河公司 ,即 WRS 公司)推出的一个实时操作系统.Tornado 是WRS 公司推出的一套实时操作系统开发环境,类似Mi ...
- QNX 实时操作系统(Quick Unix)
Gordon Bell和Dan Dodge在1980年成立了Quantum Software Systems公司,他们根据大学时代的一些设想写出了一个能在IBM PC上运行的名叫QUNIX(Quick ...
- JavaScript学习之事件原理和实践
1 基本概念 1.1 事件 JavaScript与HTML之间的交互是通过事件实现的. 事件是文档或浏览器窗口中发生的一些特定的交互瞬间,在事件上可以注册处理程序,以便当事件发生时,处理程序中的代码得 ...
- 《浏览器工作原理与实践》<04>从输入URL到页面展示,这中间发生了什么?
“在浏览器里,从输入 URL 到页面展示,这中间发生了什么? ”这是一道经典的面试题,能比较全面地考察应聘者知识的掌握程度,其中涉及到了网络.操作系统.Web 等一系列的知识. 在面试应聘者时也必问这 ...
随机推荐
- extjs ajax请求与struts2进行交互
sencha extjs 5 增加一个struts2的配置,这样可以在设置好前台布局之后,与后台交互获取数据显示.现在有一个问题是struts2对于url的跳转action支 持比较良好,但是对于像E ...
- [5]Telerik Extensions for ASP.NET MVC 开发问题
1.Controller获取不到checkedNodes的问题 HTML @(Html.Telerik().TreeView() .Name("TreeView") ...
- Web消息主体风格(Message Body Style)
对于Web HTTP编程模型来说,服务契约中作为操作的方法无须应用OperationContractAttribute特性,只需要根据需要应用WebGetAttribute与WebInvokeAttr ...
- BigDecimal 使用方法详解
BigDecimal 使用方法详解 博客分类: java基础 bigdecimalmultiplyadddivide BigDecimal 由任意精度的整数非标度值 和 32 位的整数标度 (sca ...
- 简单通用JDBC辅助类封装
哎,最近很好久没在博客园写点东西了,由于工作的原因,接触公司自己研发的底层orm框架,偶然发现该框架在调用jdbc操作的时候参考的是hibernate 里面的SimpleJdbcTemplate,这里 ...
- 第三方MMDrawerController的使用 抽屉视图+(SUNSlideSwitchView)进度条手势滑动效果实现
下载网站:https://github.com/mutualmobile/MMDrawerController 首先,到下载网址下载MMDrawerController,将文件导入工程,里面有: MM ...
- 用 CNTK 搞深度学习 (一) 入门
Computational Network Toolkit (CNTK) 是微软出品的开源深度学习工具包.本文介绍CNTK的基本内容,如何写CNTK的网络定义语言,以及跑通一个简单的例子. 根据微软开 ...
- python实现简易数据库之三——join多表连接和group by分组
上一篇里面我们实现了单表查询和top N查询,这一篇我们来讲述如何实现多表连接和group by分组. 一.多表连接 多表连接的时间是数据库一个非常耗时的操作,因为连接的时间复杂度是M*N(M,N是要 ...
- 高校手机签到系统——zxing.net生成二维码(补充)
高校手机签到系统——第一部分Authority权限系统(上) 高校手机签到系统——第一部分Authority权限系统(下) 高校手机签到系统——手机客户端 关于zxing.net的使用网上已有很多说明 ...
- IT男的”幸福”生活"续7
哇,兄弟们的热情真牛X的高呀!!! 在这里谢谢大家了.同时祝大家元宵节快乐,幸福美好.呵呵. 续7准备开始了… ….. 是什么样的事困扰她了… 躺在床上我,一直回想着MM,今天的情绪状态. 分析一下: ...