消息機制加隊列,源碼帶詳細注釋
作者介紹:
鳳舞天,原名:王紹偉,標識: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。
0.png (66.85 KB, 下載次數: 126)
下載附件
2017-2-28 23:22 上傳
完整代碼下載:
MS_MCU51_V1.00.rar
(111.5 KB, 下載次數: 74)
2017-2-28 12:22 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
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); // 返回消息
- }
復制代碼
|