uC/OS II--与ECB操作相关的四个函数
对ECB的操作一般包括:
* 初始化一个事件控制块 (void OS_EventWaitListInit (OS_EVENT *pevent))
* 使一个任务进入就绪态 (INT8U OS_EventTaskRdy (OS_EVENT *pevent, void *msg, INT8U msk))
* 使一个任务进入等待某事件的状态 (void OS_EventTaskWait (OS_EVENT *pevent))
* 因为等待超时而使一个任务进入就绪态 (void OS_EventTO (OS_EVENT *pevent))
对OS_EventTaskRdy()函数和OS_EventTO函数的调用都需要关中断。
1. OS_EventWaitListInit (OS_EVENT *pevent)
此函数被与ECB建立相关的函数调用,如OSSemCreate()、OSMutexCreate()、OSQCreate()和OSMboxCreate()。函数功能就是对ECB中的等待任务列表进行初始化,函数创建时,等待任务列表初始化为空。这个函数是对内的,即此函数可以被uC/OS II调用,用户应用程序不可以直接调用此函数。代码如下:
#if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0) || (OS_SEM_EN > 0) || (OS_MUTEX_EN > 0)
void OS_EventWaitListInit (OS_EVENT *pevent)
{
INT8U *ptbl;
pevent->OSEventGrp = 0x00;
ptbl = &pevent->OSEventTbl[0];
#if OS_EVENT_TBL_SIZE > 0
*ptbl++ = 0x00;
#endif
#if OS_EVENT_TBL_SIZE > 1
*ptbl++ = 0x00;
#endif
#if OS_EVENT_TBL_SIZE > 2
*ptbl++ = 0x00;
#endif
#if OS_EVENT_TBL_SIZE > 3
*ptbl++ = 0x00;
#endif
#if OS_EVENT_TBL_SIZE > 4
*ptbl++ = 0x00;
#endif
#if OS_EVENT_TBL_SIZE > 5
*ptbl++ = 0x00;
#endif
#if OS_EVENT_TBL_SIZE > 6
*ptbl++ = 0x00;
#endif
#if OS_EVENT_TBL_SIZE > 7
*ptbl = 0x00;
#endif
}
#endif
上面的代码功能比较简单,唯一需要注意的是,Labrosse先生使用条件编译代替了for循环,这样做的目的是减少编译时间(具体的效率,暂不清楚)。
2. INT8U OS_EventTaskRdy (OS_EVENT *pevent, void *msg, INT8U msk)
当某事件发生时,要将等待该事件任务列表中优先级最高的的任务置于就绪态,信号量、互斥型信号量、消息邮箱、消息队列所对应的POST函数都会调用OS_EventTaskRdy()。这个函数是对内的,即此函数可以被uC/OS II调用,用户应用程序不可以直接调用此函数。源码如下:
#if OS_EVENT_EN > 0
INT8U OS_EventTaskRdy (OS_EVENT *pevent, void *msg, INT8U msk)
{
OS_TCB *ptcb;
INT8U x;
INT8U y;
INT8U bitx;
INT8U bity;
INT8U prio;
y = OSUnMapTbl[pevent->OSEventGrp];
bity = OSMapTbl[y];
x = OSUnMapTbl[pevent->OSEventTbl[y]];
bitx = OSMapTbl[x];
prio = (INT8U)((y << 3) + x);
if ((pevent->OSEventTbl[y] &= ~bitx) == 0x00) {
pevent->OSEventGrp &= ~bity;
}
ptcb = OSTCBPrioTbl[prio];
ptcb->OSTCBDly = 0;
ptcb->OSTCBEventPtr = (OS_EVENT *)0;
#if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0)
ptcb->OSTCBMsg = msg;
#else
msg = msg;
#endif
ptcb->OSTCBStat &= ~msk;
if (ptcb->OSTCBStat == OS_STAT_RDY) {
OSRdyGrp |= bity;
OSRdyTbl[y] |= bitx;
}
return (prio);
}
#endif
需要注意的是if (ptcb->OSTCBStat == OS_STAT_RDY),这说明最高优先级任务得到该事件后不一定就能进入就绪态,也许该任务由于其他原因“suspend”了。
3. void OS_EventTaskWait (OS_EVENT *pevent)
当某任务等待某事件的发生时,信号量、互斥型信号量、消息邮箱、消息队列所对应的PEND函数就会调用OS_EventTaskWait(),是当前任务脱离就绪态,并放到相应的ECB的任务等待表中。这个函数是对内的,即此函数可以被uC/OS II调用,用户应用程序不可以直接调用此函数。源码如下:
#if OS_EVENT_EN > 0
void OS_EventTaskWait (OS_EVENT *pevent)
{
OSTCBCur->OSTCBEventPtr = pevent;
if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0x00) {
OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
}
pevent->OSEventTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX;
pevent->OSEventGrp |= OSTCBCur->OSTCBBitY;
}
#endif
4. void OS_EventTO (OS_EVENT *pevent)
这个函数牵涉到任务等待超时问题,uC/OS II中可以为任务等待设置一个等待时间,如果在规定的时间内任务等待的事件得不到相应(没有发生),那么OSTimeTick()函数会因为等待超时而将任务置为就绪态。信号量、互斥型信号量、消息邮箱、消息队列所对应的PEND函数就会调用OS_EventTO()函数,完成上述工作。这个函数是对内的,即此函数可以被uC/OS II调用,用户应用程序不可以直接调用此函数。源码如下:
#if OS_EVENT_EN > 0
void OS_EventTO (OS_EVENT *pevent)
{
if ((pevent->OSEventTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0x00) {
pevent->OSEventGrp &= ~OSTCBCur->OSTCBBitY;
}
OSTCBCur->OSTCBStat = OS_STAT_RDY;
OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
}
#endif
uC/OS II--与ECB操作相关的四个函数相关推荐
- UART0串口编程(四):UART0串口编程之在UC/OS—II中遭遇的危机
UART0串口编程之在UC/OS-II中遭遇的危机 一.潜在的危机 1.在uc/os操作系统中设计串口编程时,由于ISR和多个任务并发执行,情况比较复杂.尤其是接收状态为被动状态时,只能靠串行口中断来 ...
- Lab 6:uC/OS II
为什么80%的码农都做不了架构师?>>> 目标: 移植uC/OS II到RPi上,实现两个任务的调度.这两个任务能轮流点亮LED,并通过串口发送消息表明自己正在运行 具体步骤: ...
- uc/OS II——多任务设计
uc/OS II--多任务设计 (1)设计 开始任务 [1]/声明 开始任务 任务块 static OS_STK App_TaskStartStk[APP_TASK_START_STK_SIZE]; ...
- 【 uC/OS II 】uC/OS II 源代码阅读(os_task.c)任务管理
前言 这个任务管理源代码,是整个系统最核心的部分,也是最难的部分,多看几遍吧.其中的核心结构体是: typedef struct os_tcb {OS_STK *OSTCBStkPtr; /* Poi ...
- linux串口互斥,UART0串口编程之在UC/OS—II中遭遇的危机
一.潜在的危机 1.在uc/os操作系统中设计串口编程时,由于ISR和多个任务并发执行,情况比较复杂.尤其是接收状态为被动状态时,只能靠串行口中断来接收数据. 2.在进行串行通信时,双方遵循相同的通信 ...
- uC/OS II 函数说明 之–OSTaskCreate()与OSTaskCreateExt()
1. OSTaskCreate() OSTaskCreate()建立一个新任务,能够在多任务环境启动之前,或者执行任务中建立任务.注意,ISR中禁止建立任务,一个任务必须为无限循环结构. ...
- 【 uC/OS II 】uC/OS II 源代码阅读(os_mbox.c)消息邮箱
前言 关于消息邮箱,是一个消息邮箱里面,只能存储一条消息.核心结构体如下: #if (OS_EVENT_EN) && (OS_MAX_EVENTS > 0u) typedef s ...
- 【嵌入式系统—实时操作系统】uC/OS II源码的官网下载
要下载源码为:STM32F107-uC/OS-II源码包 Micrium官网的下载地址:Micrium_uC-Eval-STM32F107_uCOS-II 怎么找? 到官网的产品专区目录入口查找STM ...
- UC/OS II 消息邮箱
消息邮箱是uC/OS-II中的另一种通信机制,可以使一个任务或者中断服务子程序向另一个任务发送一个指针型的变量.通常该指针指向一个包含了"消息"的特定数据结构.如果该指针为空,说明 ...
最新文章
- 【 MATLAB 】rem 函数介绍
- 小学生python编程教程入门-围观~山东省的小学生Python编程入门都学的什么?
- python 排序统计滤波器_马尔可夫链+贝叶斯滤波器的Python展示
- 如何使用SAP CRM增强工具AET创建Table表格类型的增强
- Gitlab 项目上传
- P6:可视化卷积神经网络
- cmd怎么查看当前静态路由_计算机cmd命令之route,查看路由表,或配置一个更有效的路由...
- 英语口语收集(十六)
- Java8 新特性 (五)Stream API
- Python解二元一次方程
- hud 6078 Wavel Sequence
- 3D建模软件测试自学,收藏:5个自学3DMAX教程以及3D模型资源的网站
- 数据分析案例-数据可视化
- java inet aton_IP处理函数inet_aton()和inet_ntoa()使用说明
- MySQL的启动方式
- 幼儿抽象逻辑思维举例_孩子这五大表现,证明抽象思维萌发,家长一定要抓住这个关键时机...
- 电磁场与电磁波(5)——静电场基本方程、分界面上的衔接条件
- HTML网页设计基础笔记 • 【第1章 HTML5基础】
- 高等数学复习之六(微分方程)
- VBA 朗读excel随机选择的单元格 (语音库人声可选)