久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6828|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国内自拍第一页 | 亚洲www.| 欧美成人h版在线观看 | 欧美国产日韩在线观看成人 | 欧美一级全黄 | 玖草资源 | 美女一区二区在线观看 | 午夜a v电影 | 毛片一级网站 | 亚洲国产一区二区三区在线观看 | 97精品超碰一区二区三区 | 欧美激情欧美激情在线五月 | 喷水毛片 | 国精产品一区一区三区免费完 | 看片wwwwwwwwwww | 日韩一区二区三区在线视频 | 国产69精品久久99不卡免费版 | 北条麻妃一区二区三区在线视频 | 久久国产精品视频 | 日韩精品一区二区久久 | 日韩视频在线观看中文字幕 | 91在线免费视频 | 精品欧美视频 | 91亚洲国产成人精品一区二三 | 狠狠干狠狠操 | 欧美精品久久 | 久热电影 | 国内精品久久久久久影视8 最新黄色在线观看 | 日韩亚洲视频在线 | 欧美国产视频一区二区 | 久久精品国产一区 | 亚洲一区久久 | 青青草在线播放 | 成人av在线播放 | 欧美极品在线播放 | 国产精品视频久久 | 欧美日韩在线精品 | 精品国产一区二区三区久久久久久 | 欧美中文字幕一区 | 日韩网站在线观看 | 欧美一区二区三区久久精品 |