找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6875|回復(fù): 10
收起左側(cè)

51單片機(jī)微系統(tǒng)源碼 消息機(jī)制加隊列

  [復(fù)制鏈接]
ID:165841 發(fā)表于 2017-2-28 12:23 | 顯示全部樓層 |閱讀模式
消息機(jī)制加隊列,源碼帶詳細(xì)注釋
作者介紹:
鳳舞天,原名:王紹偉,標(biāo)識:wangsw
2001年: 畢業(yè)于蘭州大學(xué)電信專業(yè)。在大學(xué)期間擔(dān)任電子協(xié)會會長,為學(xué)校同學(xué)維修隨身聽、收音機(jī)等電子設(shè)備,奠定焊接、維修和做事一看、二想、三做、四檢測的基礎(chǔ)。
2001年: 進(jìn)入中科院半導(dǎo)體所光電中心工作。
2003年: 基于MCU51開發(fā)了實用單片機(jī)系統(tǒng)(MS)并開源推廣,獲得廣大嵌入式初學(xué)者的好評。
2004年: 創(chuàng)業(yè)做逆變器,雖然失敗,但是從技術(shù)上、物料采購上、生產(chǎn)上積累了寶貴的經(jīng)驗。
2005年: 再次創(chuàng)業(yè),但是由于對市場不了解和對產(chǎn)品定位不明確,最終導(dǎo)致失敗。
2006年: 年在深圳市華禹高科技有限公司工作,引入了MTK方案,開始手機(jī)開發(fā)。
2008年: 發(fā)明了“電阻電容電感樣品本”,解決廣大電子愛好者基礎(chǔ)元器件的采購、調(diào)試、存放問題。
2009年: 創(chuàng)立了華禹工控科技有限公司,推出了P1300手機(jī)開發(fā)模塊及相關(guān)手持POS產(chǎn)品。
2011年: 與東莞市俊知機(jī)械有限公司合作,研發(fā)大功率(6KW)超高頻(1MHz)感應(yīng)加熱焊接機(jī)。并于2012年,全面投入生產(chǎn),同時獲得工業(yè)自動化經(jīng)驗。
2013年: 開始研發(fā)msPLC,針對工業(yè)自動化行業(yè)開源設(shè)計嵌入式PLC,并開發(fā)了通用開源平臺架構(gòu)嵌入式微系統(tǒng)(msOS)。
2014年: 應(yīng)邀參加清華大學(xué)第二屆開源操作系統(tǒng)技術(shù)年會推廣msOS,編寫msOS書籍,推廣msOS。
0.png
完整代碼下載:
MS_MCU51_V1.00.rar (111.5 KB, 下載次數(shù): 74)


system.c源碼:
  1. /*
  2. ********************************************************************************
  3. *                              實用單片機(jī)系統(tǒng)
  4. *                                    MS
  5. *
  6. *                               主芯片:MCU51
  7. *                           深圳市雨滴科技有限公司
  8. *
  9. *                                作者:王紹偉
  10. *                                網(wǎng)名:鳳舞天
  11. *                                標(biāo)識:Wangsw
  12. ********************************************************************************
  13. *文件名   : system.c
  14. *作用     : 系統(tǒng)應(yīng)用文件
  15. *創(chuàng)建時間 : 2013.8.17
  16. ********************************************************************************
  17. */

  18. #include "system.h"



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

  20. struct MessageQueue                                     // 定義一個隊列結(jié)構(gòu)體
  21. {                                                      
  22.     ushort  * Start;                                    // 指針指向隊列開始
  23.     ushort  * End;                                      // 指針指向隊列結(jié)束
  24.     ushort  * In;                                       // 指針插入一個消息
  25.     ushort  * Out;                                      // 指針取出一個消息
  26.     byte      Size;                                     // 隊列長度
  27.     byte      Entries;                                  // 消息長度
  28.     ushort    Buffer[MessageBufferSum];                 // 隊列存儲數(shù)組
  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);                   //斷言,一旦條件錯誤,就執(zhí)行
  55.         return HextoAscii[hex];
  56. }


  57. /*******************************************************************************
  58. * 函數(shù)名        : EnterCritical
  59. * 描述            : 進(jìn)入臨界態(tài),防止中斷產(chǎn)生
  60. * 輸入?yún)?shù)  : 無
  61. * 返回參數(shù)  : 無
  62. ********************************************************************************
  63. *版本     作者            日期            說明
  64. *V0.1    Wangsw        2013/10/11       初始版本
  65. *******************************************************************************/
  66. void EnterCritical(void)
  67. {
  68.     if (CriticalNesting == 0)   //第一級臨界態(tài)嵌套,保存全局中斷寄存器,關(guān)閉中斷
  69.         EA = false;
  70.    
  71.     CriticalNesting++;   
  72. }


  73. /*******************************************************************************
  74. * 函數(shù)名        : ExitCritical
  75. * 描述            : 退出臨界態(tài),恢復(fù)原來狀態(tài)
  76. * 輸入?yún)?shù)  : 無
  77. * 返回參數(shù)  : 無
  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)//第一級臨界態(tài)嵌套,恢復(fù)原狀態(tài)
  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. * 函數(shù)名        : PostMessage
  102. * 描述            : 發(fā)送消息
  103. * 輸入?yún)?shù)  : message: 消息類型,
  104. *             value:消息值,MessageTimer類型為16bit地址,其他類型下都是8bit數(shù)據(jù)         
  105. * 返回參數(shù)  : 無
  106. *******************************************************************************/
  107. void PostMessage(MessageEnum message, ushort value)
  108. {
  109.     EnterCritical();                                                                 // 進(jìn)入臨界態(tài)
  110.     Assert(MessageQueue.Entries <= MessageQueue.Size);        // 斷言,判斷是否滿。

  111.     if(message == MessageTimer)                                                // 軟件定時器類型
  112.         *MessageQueue.In = value;                                              // 直接賦16bit地址
  113.     else                                                                       // 常規(guī)消息
  114.     {
  115.         UshortToByte1(*MessageQueue.In) = message;        // 把類型賦給高地址
  116.         UshortToByte0(*MessageQueue.In) = value & 0xFF;        // 把值賦給低地址
  117.     }
  118.    
  119.         MessageQueue.In++;                                       // 消息入口加一        
  120.    
  121.     if(MessageQueue.In > MessageQueue.End)                        // 入口越界循環(huán)
  122.         MessageQueue.In = MessageQueue.Start;
  123.    
  124.     MessageQueue.Entries++;                                        // 消息數(shù)量加一
  125.    
  126.         ExitCritical();                                          // 退出臨界態(tài)
  127. }

  128. /*******************************************************************************
  129. * 函數(shù)名        : PendMessageQueue
  130. * 描述            : 等待消息
  131. * 輸入?yún)?shù)  : 無      
  132. * 返回參數(shù)  : 無
  133. *******************************************************************************/
  134. ushort PendMessageQueue(void)
  135. {   
  136.     ushort message;
  137.     while(MessageQueue.Entries == 0)                        // 等待消息
  138.     { /* 推薦在這兒喂狗 */ };                                                                                
  139.    
  140.     message = *MessageQueue.Out++;                                    // 消息出口加一
  141.     MessageQueue.Entries--;                                                    // 消息數(shù)量減一
  142.    
  143.     if (MessageQueue.Out > MessageQueue.End)             // 出口越界循環(huán)
  144.         MessageQueue.Out = MessageQueue.Start;
  145.    
  146.     return(message);                                                            // 返回消息
  147. }
復(fù)制代碼




評分

參與人數(shù) 1黑幣 +5 收起 理由
lanxichang + 5

查看全部評分

回復(fù)

使用道具 舉報

ID:55184 發(fā)表于 2017-6-28 10:16 | 顯示全部樓層
希望是個好東西,研究研究
回復(fù)

使用道具 舉報

ID:144056 發(fā)表于 2017-9-11 10:28 | 顯示全部樓層
STC單片機(jī)定時器中斷自動清零,不適合
不知道有沒有改進(jìn)的方法
回復(fù)

使用道具 舉報

ID:6350 發(fā)表于 2017-9-12 19:15 | 顯示全部樓層
正在思考這個問題,幫大忙了
謝謝~
回復(fù)

使用道具 舉報

ID:237274 發(fā)表于 2017-10-4 20:51 | 顯示全部樓層
積分不夠啊,給個鏈接下下
回復(fù)

使用道具 舉報

ID:329829 發(fā)表于 2018-5-14 19:17 | 顯示全部樓層
希望是個好東西,研究研究,現(xiàn)在正要需要
回復(fù)

使用道具 舉報

ID:367645 發(fā)表于 2018-7-12 15:40 | 顯示全部樓層
KeilC51中使用函數(shù)指針有沒有影響,記得函數(shù)指針做參數(shù)在c51里面需要特殊處理。
回復(fù)

使用道具 舉報

ID:20672 發(fā)表于 2018-8-8 18:01 | 顯示全部樓層
謝謝分享,重新學(xué)習(xí)~~
回復(fù)

使用道具 舉報

ID:87000 發(fā)表于 2018-9-26 08:50 | 顯示全部樓層
應(yīng)該是好東西,看看
回復(fù)

使用道具 舉報

ID:580067 發(fā)表于 2020-8-12 14:07 | 顯示全部樓層
thinkyou very much!
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表