找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6202|回复: 10
打印 上一主题 下一主题
收起左侧

51单片机微系统源码 消息机制加队列

  [复制链接]
跳转到指定楼层
楼主
消息机制加队列,源码带详细注释
作者介绍:
凤舞天,原名:王绍伟,标识:wangsw
2001年: 毕业于兰州大学电信专业。在大学期间担任电子协会会长,为学校同学维修随身听、收音机等电子设备,奠定焊接、维修和做事一看、二想、三做、四检测的基础。
2001年: 进入中科院半导体所光电中心工作。
2003年: 基于MCU51开发了实用单片机系统(MS)并开源推广,获得广大嵌入式初学者的好评。
2004年: 创业做逆变器,虽然失败,但是从技术上、物料采购上、生产上积累了宝贵的经验。
2005年: 再次创业,但是由于对市场不了解和对产品定位不明确,最终导致失败。
2006年: 年在深圳市华禹高科技有限公司工作,引入了MTK方案,开始手机开发。
2008年: 发明了“电阻电容电感样品本”,解决广大电子爱好者基础元器件的采购、调试、存放问题。
2009年: 创立了华禹工控科技有限公司,推出了P1300手机开发模块及相关手持POS产品。
2011年: 与东莞市俊知机械有限公司合作,研发大功率(6KW)超高频(1MHz)感应加热焊接机。并于2012年,全面投入生产,同时获得工业自动化经验。
2013年: 开始研发msPLC,针对工业自动化行业开源设计嵌入式PLC,并开发了通用开源平台架构嵌入式微系统(msOS)。
2014年: 应邀参加清华大学第二届开源操作系统技术年会推广msOS,编写msOS书籍,推广msOS。

完整代码下载:
MS_MCU51_V1.00.rar (111.5 KB, 下载次数: 74)


system.c源码:
  1. /*
  2. ********************************************************************************
  3. *                              实用单片机系统
  4. *                                    MS
  5. *
  6. *                               主芯片:MCU51
  7. *                           深圳市雨滴科技有限公司
  8. *
  9. *                                作者:王绍伟
  10. *                                网名:凤舞天
  11. *                                标识:Wangsw
  12. ********************************************************************************
  13. *文件名   : system.c
  14. *作用     : 系统应用文件
  15. *创建时间 : 2013.8.17
  16. ********************************************************************************
  17. */

  18. #include "system.h"



  19. #define MessageBufferSum 4                              // 消息队列深度

  20. struct MessageQueue                                     // 定义一个队列结构体
  21. {                                                      
  22.     ushort  * Start;                                    // 指针指向队列开始
  23.     ushort  * End;                                      // 指针指向队列结束
  24.     ushort  * In;                                       // 指针插入一个消息
  25.     ushort  * Out;                                      // 指针取出一个消息
  26.     byte      Size;                                     // 队列长度
  27.     byte      Entries;                                  // 消息长度
  28.     ushort    Buffer[MessageBufferSum];                 // 队列存储数组
  29. } ;

  30. static struct MessageQueue idata MessageQueue;



  31. static bool data EaSave;
  32. static byte data CriticalNesting = 0;
  33. byte code HextoAscii[16] =
  34. {
  35.         '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
  36. };

  37. void Delay(ushort delayClock)
  38. {
  39.         while(delayClock--);
  40. }

  41. void DelayUs(ushort delayTime)
  42. {
  43.     while(delayTime--);
  44. }

  45. void DelayMs(ushort delayTime)
  46. {
  47.         while(delayTime--)
  48.         {
  49.                 DelayUs(1000);
  50.         }
  51. }

  52. byte HexToAscii(byte hex)
  53. {
  54.         Assert(hex < 16);                   //断言,一旦条件错误,就执行
  55.         return HextoAscii[hex];
  56. }


  57. /*******************************************************************************
  58. * 函数名        : EnterCritical
  59. * 描述            : 进入临界态,防止中断产生
  60. * 输入参数  : 无
  61. * 返回参数  : 无
  62. ********************************************************************************
  63. *版本     作者            日期            说明
  64. *V0.1    Wangsw        2013/10/11       初始版本
  65. *******************************************************************************/
  66. void EnterCritical(void)
  67. {
  68.     if (CriticalNesting == 0)   //第一级临界态嵌套,保存全局中断寄存器,关闭中断
  69.         EA = false;
  70.    
  71.     CriticalNesting++;   
  72. }


  73. /*******************************************************************************
  74. * 函数名        : ExitCritical
  75. * 描述            : 退出临界态,恢复原来状态
  76. * 输入参数  : 无
  77. * 返回参数  : 无
  78. ********************************************************************************
  79. *版本     作者            日期            说明
  80. *V0.1    Wangsw        2013/10/11       初始版本
  81. *******************************************************************************/
  82. void ExitCritical(void)
  83. {
  84.     if (CriticalNesting > 0)
  85.     {
  86.         CriticalNesting--;
  87.         if (CriticalNesting == 0)//第一级临界态嵌套,恢复原状态
  88.             EA = true;
  89.     }
  90. }

  91. void InitMessageQueue(void)
  92. {
  93.     MessageQueue.Start = MessageQueue.Buffer;
  94.     MessageQueue.End = MessageQueue.Buffer + MessageBufferSum - 1;
  95.     MessageQueue.In = MessageQueue.Start;
  96.     MessageQueue.Out = MessageQueue.Start;
  97.     MessageQueue.Size = MessageBufferSum;
  98.     MessageQueue.Entries = 0;
  99. }

  100. /*******************************************************************************
  101. * 函数名        : PostMessage
  102. * 描述            : 发送消息
  103. * 输入参数  : message: 消息类型,
  104. *             value:消息值,MessageTimer类型为16bit地址,其他类型下都是8bit数据         
  105. * 返回参数  : 无
  106. *******************************************************************************/
  107. void PostMessage(MessageEnum message, ushort value)
  108. {
  109.     EnterCritical();                                                                 // 进入临界态
  110.     Assert(MessageQueue.Entries <= MessageQueue.Size);        // 断言,判断是否满。

  111.     if(message == MessageTimer)                                                // 软件定时器类型
  112.         *MessageQueue.In = value;                                              // 直接赋16bit地址
  113.     else                                                                       // 常规消息
  114.     {
  115.         UshortToByte1(*MessageQueue.In) = message;        // 把类型赋给高地址
  116.         UshortToByte0(*MessageQueue.In) = value & 0xFF;        // 把值赋给低地址
  117.     }
  118.    
  119.         MessageQueue.In++;                                       // 消息入口加一        
  120.    
  121.     if(MessageQueue.In > MessageQueue.End)                        // 入口越界循环
  122.         MessageQueue.In = MessageQueue.Start;
  123.    
  124.     MessageQueue.Entries++;                                        // 消息数量加一
  125.    
  126.         ExitCritical();                                          // 退出临界态
  127. }

  128. /*******************************************************************************
  129. * 函数名        : PendMessageQueue
  130. * 描述            : 等待消息
  131. * 输入参数  : 无      
  132. * 返回参数  : 无
  133. *******************************************************************************/
  134. ushort PendMessageQueue(void)
  135. {   
  136.     ushort message;
  137.     while(MessageQueue.Entries == 0)                        // 等待消息
  138.     { /* 推荐在这儿喂狗 */ };                                                                                
  139.    
  140.     message = *MessageQueue.Out++;                                    // 消息出口加一
  141.     MessageQueue.Entries--;                                                    // 消息数量减一
  142.    
  143.     if (MessageQueue.Out > MessageQueue.End)             // 出口越界循环
  144.         MessageQueue.Out = MessageQueue.Start;
  145.    
  146.     return(message);                                                            // 返回消息
  147. }
复制代码




评分

参与人数 1黑币 +5 收起 理由
lanxichang + 5

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:55184 发表于 2017-6-28 10:16 | 只看该作者
希望是个好东西,研究研究
回复

使用道具 举报

板凳
ID:144056 发表于 2017-9-11 10:28 | 只看该作者
STC单片机定时器中断自动清零,不适合
不知道有没有改进的方法
回复

使用道具 举报

地板
ID:6350 发表于 2017-9-12 19:15 | 只看该作者
正在思考这个问题,帮大忙了
谢谢~
回复

使用道具 举报

5#
ID:237274 发表于 2017-10-4 20:51 | 只看该作者
积分不够啊,给个链接下下
回复

使用道具 举报

6#
ID:329829 发表于 2018-5-14 19:17 | 只看该作者
希望是个好东西,研究研究,现在正要需要
回复

使用道具 举报

7#
ID:367645 发表于 2018-7-12 15:40 | 只看该作者
KeilC51中使用函数指针有没有影响,记得函数指针做参数在c51里面需要特殊处理。
回复

使用道具 举报

8#
ID:20672 发表于 2018-8-8 18:01 | 只看该作者
谢谢分享,重新学习~~
回复

使用道具 举报

9#
ID:87000 发表于 2018-9-26 08:50 | 只看该作者
应该是好东西,看看
回复

使用道具 举报

10#
ID:580067 发表于 2020-8-12 14:07 | 只看该作者
thinkyou very much!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表