在下这厢有礼了

消息邮件管理

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相关推荐

  1. exchange 2010 search mailbox 的幕后强大功能

    铃---.半夜中被一阵急促的手机铃声吵醒,年度服务客户打来电话需要进行邮件的排查和删除工作.问其原因,原来是组织中有人发了一封关于领导的不健康的邮件,并在企业内部进行了转发,领导要求立即找出此类邮件并 ...

  2. exchange online share mailbox senditem

    客户要求从share mailbox send出去mail,要放在share mailbox的寄件备份. http://support.microsoft.com/kb/2843677 单击开始,单击 ...

  3. ucosii事件控制块------消息邮箱与消息队列

    UCOSII 使用叫做事件控制块(ECB)的数据结构来描述诸如信号量.邮箱(消息邮箱)和消息队列这些事件 #define OS_EVENT_EN (((OS_Q_EN > 0u) &&a ...

  4. 手把手,嘴对嘴,讲解UCOSII嵌入式操作系统的任务调度策略(二)

    继续-- if (ticks > 0u) { /* 延时参数是否为0 */OS_ENTER_CRITICAL(); /* 禁止中断 */y = OSTCBCur->OSTCBY;OSRdy ...

  5. 使用bc45编译ucos-II的配置过程

    1.将ucos_ii的源代码解压到c盘根目录下形成SOFTWARE文件夹(使用网上盛传的压缩文件SOFTWARE.RAR) 2.将bc45安装在c盘根目录下,形成bc45文件夹,从别的地方复制tasm ...

  6. win7下编译uCOS-II

    最近有很好的兴趣在uCOS-II上,而且昨天在图书馆正好见了一般新上架的书<嵌入式实时操作系统uC/OS原理与实践>卢有亮编著,电子工业出版社的讲的很不错,介绍的也算详细,后面的第7章就是 ...

  7. RTOS之uCOS-II源码下载及源码目录结构、常见的RTOS!

    RTOS有众多种,用得最火的是FreeRTOS,因为它即使用于商业途径,也是开源免费的:其次是就是uCOS-II和uCOS-III.uCOS-II用于商业途径是需要付费的,但是对于学习研究却是免费的. ...

  8. RT600之Mailbox

    目录 Mailbox架构图 Mailbox 寄存器 SWD访问mailbox示意图 ROM Mailbox Handler功能解析 Request/Response机制 ROM支持的Mailbox指令 ...

  9. STM32mini使用UCOSII信号量和邮箱实现任务挂起和恢复

    本文结构 1.UCOSII原理 2.UCOSII实验代码 1.UCOSII原理 UCOSII 是一个可以基于ROM 运行的.可裁减的.抢占式.实时多任务内核,具有高度可 移植性,特别适合于微处理器和控 ...

最新文章

  1. ifconfig 命令介绍
  2. Bootstrap4+MySQL前后端综合实训-Day03-AM【折叠、模态框】
  3. 消除switch语句以获得更好的代码结构
  4. python 语句简写_自学Python-语句之列表推导式
  5. endnote一打开就自动关闭_Endnote导出参考文献到Word
  6. js/bat批处理调用谷歌浏览器chrome批量打开网页测试web性能
  7. Markdown中跳转,锚点操作浅析
  8. Hadoop组件之Yarn
  9. mysql成绩统计数据库设计_MySQL数据库设计——以学生成绩数据库为例
  10. GCD and LCM HDU 4497 数论
  11. hannoi 汉诺塔
  12. JS 实现驼峰式转下横线,下横线转驼峰式2
  13. 【渝粤教育】国家开放大学2018年春季 0049-22T法律文书 参考试题
  14. FI和HR集成自动记账-薪酬计提与发放过账-OBYE/OBYG/PE03/OH02
  15. 史道术器|一种快速切入新领域的学习框架
  16. 24段魔尺,骆驼,小狗,金鱼,蝴蝶结
  17. SNA社交网络R语言分析
  18. 360浏览器等被金山毒霸网强制霸占问题解决
  19. 红米3s运行linux,红米3S3X|RROS-V7.0|安卓9.0|最强大的自定_最新最全的红米3S/3XROM刷机包下载、刷机教...
  20. golang GF框架

热门文章

  1. 阿里云搭建 MQTT 服务器
  2. ThreadLocal深析
  3. 程序员返乡卖羊肉年销售1500万元,竟然是为了爱情?
  4. w ndows平板插sim卡,HUAWEI MateBookE怎么插入sim卡上网和接收短信?
  5. python学习(二十一)
  6. 微信小程序云开发-批量上传文件到云储存空间
  7. C# textBox限制输入为数字
  8. 【数字经济】NBA+大数据,数字经济重塑体育帝国!
  9. 用cat查看非常大非常大的文件是什么体验
  10. c++中类模板与结构体模板总结