UCOSII MailBox
在下这厢有礼了
消息邮件管理
1. 消息队列邮箱创建
OS_EVENT *OSMboxCreate (void *pmsg)
{OS_EVENT *pevent;
#if OS_CRITICAL_METHOD == 3u /* 中断模式设定为3 */OS_CPU_SR cpu_sr = 0u;
#endif#ifdef OS_SAFETY_CRITICAL_IEC61508if (OSSafetyCriticalStartFlag == OS_TRUE) {OS_SAFETY_CRITICAL_EXCEPTION();}
#endifif (OSIntNesting > 0u) { /* 是否有中断嵌套 */return ((OS_EVENT *)0); /* 不能创建 */}OS_ENTER_CRITICAL();pevent = OSEventFreeList; /* 获得事件控制块列表 */if (OSEventFreeList != (OS_EVENT *)0) { /* 事件控制块是否为空 */OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;}OS_EXIT_CRITICAL();if (pevent != (OS_EVENT *)0) {pevent->OSEventType = OS_EVENT_TYPE_MBOX;pevent->OSEventCnt = 0u;pevent->OSEventPtr = pmsg; /* 保存信息到事件管理块 */
#if OS_EVENT_NAME_EN > 0upevent->OSEventName = (INT8U *)(void *)"?";
#endifOS_EventWaitListInit(pevent);}return (pevent); /* Return pointer to event control block */
}
2.从邮箱获取信息
#if OS_MBOX_ACCEPT_EN > 0u
void *OSMboxAccept (OS_EVENT *pevent)
{void *pmsg;
#if OS_CRITICAL_METHOD == 3u /* 中断为3 */OS_CPU_SR cpu_sr = 0u;
#endif#if OS_ARG_CHK_EN > 0uif (pevent == (OS_EVENT *)0) { /*'pevent'是有效的 */return ((void *)0);}
#endifif (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* 事件控制块类型是mailbox type */return ((void *)0);}OS_ENTER_CRITICAL();pmsg = pevent->OSEventPtr;pevent->OSEventPtr = (void *)0; /* 清除mailbox */OS_EXIT_CRITICAL();return (pmsg); /* 返回信息 */
}
#endif
3. 删除邮箱信息
#if OS_MBOX_DEL_EN > 0u
OS_EVENT *OSMboxDel (OS_EVENT *pevent,INT8U opt,INT8U *perr)
{BOOLEAN tasks_waiting;OS_EVENT *pevent_return;
#if OS_CRITICAL_METHOD == 3u /* 中断号为3 */OS_CPU_SR cpu_sr = 0u;
#endif#ifdef OS_SAFETY_CRITICALif (perr == (INT8U *)0) {OS_SAFETY_CRITICAL_EXCEPTION();}
#endif#if OS_ARG_CHK_EN > 0uif (pevent == (OS_EVENT *)0) { /* 'pevent'是一个不为0的(判断验证) */*perr = OS_ERR_PEVENT_NULL;return (pevent);}
#endifif (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* 事件块的类型是mailbox type */*perr = OS_ERR_EVENT_TYPE;return (pevent);}if (OSIntNesting > 0u) { /* 中断是否嵌套 */*perr = OS_ERR_DEL_ISR; /* 中断的不能删除 */return (pevent);}OS_ENTER_CRITICAL();if (pevent->OSEventGrp != 0u) { /* 是否有任务等待mailbox */tasks_waiting = OS_TRUE; /* Yes */} else {tasks_waiting = OS_FALSE; /* No */}switch (opt) {case OS_DEL_NO_PEND: /* 如果没有任务删除mailbox */if (tasks_waiting == OS_FALSE) {
#if OS_EVENT_NAME_EN > 0upevent->OSEventName = (INT8U *)(void *)"?";
#endifpevent->OSEventType = OS_EVENT_TYPE_UNUSED;pevent->OSEventPtr = OSEventFreeList; /* 返回事件控制块的空闲列表 */pevent->OSEventCnt = 0u;OSEventFreeList = pevent; /* 获得空闲控制块的列表 */OS_EXIT_CRITICAL();*perr = OS_ERR_NONE;pevent_return = (OS_EVENT *)0; /* mailbox被删除 */} else {OS_EXIT_CRITICAL();*perr = OS_ERR_TASK_WAITING;pevent_return = pevent;}break;case OS_DEL_ALWAYS: /* 一直删除mailbox */while (pevent->OSEventGrp != 0u) { /* 所有任务等待mailbox */(void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MBOX, OS_STAT_PEND_OK);}
#if OS_EVENT_NAME_EN > 0upevent->OSEventName = (INT8U *)(void *)"?";
#endifpevent->OSEventType = OS_EVENT_TYPE_UNUSED;pevent->OSEventPtr = OSEventFreeList; /* 返回事件控制块的空闲列表*/pevent->OSEventCnt = 0u;OSEventFreeList = pevent; /*获得时间控制块的空闲列表 */OS_EXIT_CRITICAL();if (tasks_waiting == OS_TRUE) { /* 重新排时间表如果有任务等待 */OS_Sched(); /* 找到最高优先级的任务去Running */}*perr = OS_ERR_NONE;pevent_return = (OS_EVENT *)0; /* mailbox已经被删除 */break;default:OS_EXIT_CRITICAL();*perr = OS_ERR_INVALID_OPT;pevent_return = pevent;break;}return (pevent_return);
}
#endif
4. 查询mailbox信息
#if OS_MBOX_QUERY_EN > 0u
INT8U OSMboxQuery (OS_EVENT *pevent,OS_MBOX_DATA *p_mbox_data)
{INT8U i;OS_PRIO *psrc;OS_PRIO *pdest;
#if OS_CRITICAL_METHOD == 3u /* 中断为3 */OS_CPU_SR cpu_sr = 0u;
#endif#if OS_ARG_CHK_EN > 0uif (pevent == (OS_EVENT *)0) { /* 验证'pevent' */return (OS_ERR_PEVENT_NULL);}if (p_mbox_data == (OS_MBOX_DATA *)0) { /*验证'p_mbox_data' */return (OS_ERR_PDATA_NULL);}
#endifif (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* 验证event block type 是mailbox type */return (OS_ERR_EVENT_TYPE);}OS_ENTER_CRITICAL();p_mbox_data->OSEventGrp = pevent->OSEventGrp; /* 复制信息邮箱的等待列表 */psrc = &pevent->OSEventTbl[0];pdest = &p_mbox_data->OSEventTbl[0];for (i = 0u; i < OS_EVENT_TBL_SIZE; i++) {*pdest++ = *psrc++;}p_mbox_data->OSMsg = pevent->OSEventPtr; /* 从邮箱中获得信息 */OS_EXIT_CRITICAL();return (OS_ERR_NONE);
}
#endif
5. 将信息放入mailbox中
#if OS_MBOX_POST_EN > 0u
INT8U OSMboxPost (OS_EVENT *pevent,void *pmsg)
{
#if OS_CRITICAL_METHOD == 3u /* 中断为3 */OS_CPU_SR cpu_sr = 0u;
#endif#if OS_ARG_CHK_EN > 0uif (pevent == (OS_EVENT *)0) { /* 验证 'pevent' */return (OS_ERR_PEVENT_NULL);}if (pmsg == (void *)0) { /* 确保我们是发送一个有效数据 */return (OS_ERR_POST_NULL_PTR);}
#endifif (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* 验证event block type */return (OS_ERR_EVENT_TYPE);}OS_ENTER_CRITICAL();if (pevent->OSEventGrp != 0u) { /* 查看mailbox是否有待执行任务 *//* 准备好了没 */(void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_MBOX, OS_STAT_PEND_OK);OS_EXIT_CRITICAL();OS_Sched(); /* 找到最高优先级的任务running */return (OS_ERR_NONE);}if (pevent->OSEventPtr != (void *)0) { /* 确保邮箱中没有信息 */OS_EXIT_CRITICAL();return (OS_ERR_MBOX_FULL);}pevent->OSEventPtr = pmsg; /* 将信件放进邮箱 */OS_EXIT_CRITICAL();return (OS_ERR_NONE);
}
#endif
UCOSII MailBox相关推荐
- exchange 2010 search mailbox 的幕后强大功能
铃---.半夜中被一阵急促的手机铃声吵醒,年度服务客户打来电话需要进行邮件的排查和删除工作.问其原因,原来是组织中有人发了一封关于领导的不健康的邮件,并在企业内部进行了转发,领导要求立即找出此类邮件并 ...
- exchange online share mailbox senditem
客户要求从share mailbox send出去mail,要放在share mailbox的寄件备份. http://support.microsoft.com/kb/2843677 单击开始,单击 ...
- ucosii事件控制块------消息邮箱与消息队列
UCOSII 使用叫做事件控制块(ECB)的数据结构来描述诸如信号量.邮箱(消息邮箱)和消息队列这些事件 #define OS_EVENT_EN (((OS_Q_EN > 0u) &&a ...
- 手把手,嘴对嘴,讲解UCOSII嵌入式操作系统的任务调度策略(二)
继续-- if (ticks > 0u) { /* 延时参数是否为0 */OS_ENTER_CRITICAL(); /* 禁止中断 */y = OSTCBCur->OSTCBY;OSRdy ...
- 使用bc45编译ucos-II的配置过程
1.将ucos_ii的源代码解压到c盘根目录下形成SOFTWARE文件夹(使用网上盛传的压缩文件SOFTWARE.RAR) 2.将bc45安装在c盘根目录下,形成bc45文件夹,从别的地方复制tasm ...
- win7下编译uCOS-II
最近有很好的兴趣在uCOS-II上,而且昨天在图书馆正好见了一般新上架的书<嵌入式实时操作系统uC/OS原理与实践>卢有亮编著,电子工业出版社的讲的很不错,介绍的也算详细,后面的第7章就是 ...
- RTOS之uCOS-II源码下载及源码目录结构、常见的RTOS!
RTOS有众多种,用得最火的是FreeRTOS,因为它即使用于商业途径,也是开源免费的:其次是就是uCOS-II和uCOS-III.uCOS-II用于商业途径是需要付费的,但是对于学习研究却是免费的. ...
- RT600之Mailbox
目录 Mailbox架构图 Mailbox 寄存器 SWD访问mailbox示意图 ROM Mailbox Handler功能解析 Request/Response机制 ROM支持的Mailbox指令 ...
- STM32mini使用UCOSII信号量和邮箱实现任务挂起和恢复
本文结构 1.UCOSII原理 2.UCOSII实验代码 1.UCOSII原理 UCOSII 是一个可以基于ROM 运行的.可裁减的.抢占式.实时多任务内核,具有高度可 移植性,特别适合于微处理器和控 ...
最新文章
- ifconfig 命令介绍
- Bootstrap4+MySQL前后端综合实训-Day03-AM【折叠、模态框】
- 消除switch语句以获得更好的代码结构
- python 语句简写_自学Python-语句之列表推导式
- endnote一打开就自动关闭_Endnote导出参考文献到Word
- js/bat批处理调用谷歌浏览器chrome批量打开网页测试web性能
- Markdown中跳转,锚点操作浅析
- Hadoop组件之Yarn
- mysql成绩统计数据库设计_MySQL数据库设计——以学生成绩数据库为例
- GCD and LCM HDU 4497 数论
- hannoi 汉诺塔
- JS 实现驼峰式转下横线,下横线转驼峰式2
- 【渝粤教育】国家开放大学2018年春季 0049-22T法律文书 参考试题
- FI和HR集成自动记账-薪酬计提与发放过账-OBYE/OBYG/PE03/OH02
- 史道术器|一种快速切入新领域的学习框架
- 24段魔尺,骆驼,小狗,金鱼,蝴蝶结
- SNA社交网络R语言分析
- 360浏览器等被金山毒霸网强制霸占问题解决
- 红米3s运行linux,红米3S3X|RROS-V7.0|安卓9.0|最强大的自定_最新最全的红米3S/3XROM刷机包下载、刷机教...
- golang GF框架