消息机制加队列,源码带详细注释
作者介绍:
凤舞天,原名:王绍伟,标识: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源码:
- /*
- ********************************************************************************
- * 实用单片机系统
- * MS
- *
- * 主芯片:MCU51
- * 深圳市雨滴科技有限公司
- *
- * 作者:王绍伟
- * 网名:凤舞天
- * 标识:Wangsw
- ********************************************************************************
- *文件名 : system.c
- *作用 : 系统应用文件
- *创建时间 : 2013.8.17
- ********************************************************************************
- */
- #include "system.h"
- #define MessageBufferSum 4 // 消息队列深度
- struct MessageQueue // 定义一个队列结构体
- {
- ushort * Start; // 指针指向队列开始
- ushort * End; // 指针指向队列结束
- ushort * In; // 指针插入一个消息
- ushort * Out; // 指针取出一个消息
- byte Size; // 队列长度
- byte Entries; // 消息长度
- ushort Buffer[MessageBufferSum]; // 队列存储数组
- } ;
- static struct MessageQueue idata MessageQueue;
- static bool data EaSave;
- static byte data CriticalNesting = 0;
- byte code HextoAscii[16] =
- {
- '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
- };
- void Delay(ushort delayClock)
- {
- while(delayClock--);
- }
- void DelayUs(ushort delayTime)
- {
- while(delayTime--);
- }
- void DelayMs(ushort delayTime)
- {
- while(delayTime--)
- {
- DelayUs(1000);
- }
- }
- byte HexToAscii(byte hex)
- {
- Assert(hex < 16); //断言,一旦条件错误,就执行
- return HextoAscii[hex];
- }
- /*******************************************************************************
- * 函数名 : EnterCritical
- * 描述 : 进入临界态,防止中断产生
- * 输入参数 : 无
- * 返回参数 : 无
- ********************************************************************************
- *版本 作者 日期 说明
- *V0.1 Wangsw 2013/10/11 初始版本
- *******************************************************************************/
- void EnterCritical(void)
- {
- if (CriticalNesting == 0) //第一级临界态嵌套,保存全局中断寄存器,关闭中断
- EA = false;
-
- CriticalNesting++;
- }
- /*******************************************************************************
- * 函数名 : ExitCritical
- * 描述 : 退出临界态,恢复原来状态
- * 输入参数 : 无
- * 返回参数 : 无
- ********************************************************************************
- *版本 作者 日期 说明
- *V0.1 Wangsw 2013/10/11 初始版本
- *******************************************************************************/
- void ExitCritical(void)
- {
- if (CriticalNesting > 0)
- {
- CriticalNesting--;
- if (CriticalNesting == 0)//第一级临界态嵌套,恢复原状态
- EA = true;
- }
- }
- void InitMessageQueue(void)
- {
- MessageQueue.Start = MessageQueue.Buffer;
- MessageQueue.End = MessageQueue.Buffer + MessageBufferSum - 1;
- MessageQueue.In = MessageQueue.Start;
- MessageQueue.Out = MessageQueue.Start;
- MessageQueue.Size = MessageBufferSum;
- MessageQueue.Entries = 0;
- }
- /*******************************************************************************
- * 函数名 : PostMessage
- * 描述 : 发送消息
- * 输入参数 : message: 消息类型,
- * value:消息值,MessageTimer类型为16bit地址,其他类型下都是8bit数据
- * 返回参数 : 无
- *******************************************************************************/
- void PostMessage(MessageEnum message, ushort value)
- {
- EnterCritical(); // 进入临界态
- Assert(MessageQueue.Entries <= MessageQueue.Size); // 断言,判断是否满。
- if(message == MessageTimer) // 软件定时器类型
- *MessageQueue.In = value; // 直接赋16bit地址
- else // 常规消息
- {
- UshortToByte1(*MessageQueue.In) = message; // 把类型赋给高地址
- UshortToByte0(*MessageQueue.In) = value & 0xFF; // 把值赋给低地址
- }
-
- MessageQueue.In++; // 消息入口加一
-
- if(MessageQueue.In > MessageQueue.End) // 入口越界循环
- MessageQueue.In = MessageQueue.Start;
-
- MessageQueue.Entries++; // 消息数量加一
-
- ExitCritical(); // 退出临界态
- }
- /*******************************************************************************
- * 函数名 : PendMessageQueue
- * 描述 : 等待消息
- * 输入参数 : 无
- * 返回参数 : 无
- *******************************************************************************/
- ushort PendMessageQueue(void)
- {
- ushort message;
- while(MessageQueue.Entries == 0) // 等待消息
- { /* 推荐在这儿喂狗 */ };
-
- message = *MessageQueue.Out++; // 消息出口加一
- MessageQueue.Entries--; // 消息数量减一
-
- if (MessageQueue.Out > MessageQueue.End) // 出口越界循环
- MessageQueue.Out = MessageQueue.Start;
-
- return(message); // 返回消息
- }
复制代码
|