|
消息機(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。
完整代碼下載:
MS_MCU51_V1.00.rar
(111.5 KB, 下載次數(shù): 74)
2017-2-28 12:22 上傳
點擊文件名下載附件
system.c源碼:
- /*
- ********************************************************************************
- * 實用單片機(jī)系統(tǒng)
- * MS
- *
- * 主芯片:MCU51
- * 深圳市雨滴科技有限公司
- *
- * 作者:王紹偉
- * 網(wǎng)名:鳳舞天
- * 標(biāo)識:Wangsw
- ********************************************************************************
- *文件名 : system.c
- *作用 : 系統(tǒng)應(yīng)用文件
- *創(chuàng)建時間 : 2013.8.17
- ********************************************************************************
- */
- #include "system.h"
- #define MessageBufferSum 4 // 消息隊列深度
- struct MessageQueue // 定義一個隊列結(jié)構(gòu)體
- {
- ushort * Start; // 指針指向隊列開始
- ushort * End; // 指針指向隊列結(jié)束
- ushort * In; // 指針插入一個消息
- ushort * Out; // 指針取出一個消息
- byte Size; // 隊列長度
- byte Entries; // 消息長度
- ushort Buffer[MessageBufferSum]; // 隊列存儲數(shù)組
- } ;
- 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); //斷言,一旦條件錯誤,就執(zhí)行
- return HextoAscii[hex];
- }
- /*******************************************************************************
- * 函數(shù)名 : EnterCritical
- * 描述 : 進(jìn)入臨界態(tài),防止中斷產(chǎn)生
- * 輸入?yún)?shù) : 無
- * 返回參數(shù) : 無
- ********************************************************************************
- *版本 作者 日期 說明
- *V0.1 Wangsw 2013/10/11 初始版本
- *******************************************************************************/
- void EnterCritical(void)
- {
- if (CriticalNesting == 0) //第一級臨界態(tài)嵌套,保存全局中斷寄存器,關(guān)閉中斷
- EA = false;
-
- CriticalNesting++;
- }
- /*******************************************************************************
- * 函數(shù)名 : ExitCritical
- * 描述 : 退出臨界態(tài),恢復(fù)原來狀態(tài)
- * 輸入?yún)?shù) : 無
- * 返回參數(shù) : 無
- ********************************************************************************
- *版本 作者 日期 說明
- *V0.1 Wangsw 2013/10/11 初始版本
- *******************************************************************************/
- void ExitCritical(void)
- {
- if (CriticalNesting > 0)
- {
- CriticalNesting--;
- if (CriticalNesting == 0)//第一級臨界態(tài)嵌套,恢復(fù)原狀態(tài)
- 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;
- }
- /*******************************************************************************
- * 函數(shù)名 : PostMessage
- * 描述 : 發(fā)送消息
- * 輸入?yún)?shù) : message: 消息類型,
- * value:消息值,MessageTimer類型為16bit地址,其他類型下都是8bit數(shù)據(jù)
- * 返回參數(shù) : 無
- *******************************************************************************/
- void PostMessage(MessageEnum message, ushort value)
- {
- EnterCritical(); // 進(jìn)入臨界態(tài)
- Assert(MessageQueue.Entries <= MessageQueue.Size); // 斷言,判斷是否滿。
- if(message == MessageTimer) // 軟件定時器類型
- *MessageQueue.In = value; // 直接賦16bit地址
- else // 常規(guī)消息
- {
- UshortToByte1(*MessageQueue.In) = message; // 把類型賦給高地址
- UshortToByte0(*MessageQueue.In) = value & 0xFF; // 把值賦給低地址
- }
-
- MessageQueue.In++; // 消息入口加一
-
- if(MessageQueue.In > MessageQueue.End) // 入口越界循環(huán)
- MessageQueue.In = MessageQueue.Start;
-
- MessageQueue.Entries++; // 消息數(shù)量加一
-
- ExitCritical(); // 退出臨界態(tài)
- }
- /*******************************************************************************
- * 函數(shù)名 : PendMessageQueue
- * 描述 : 等待消息
- * 輸入?yún)?shù) : 無
- * 返回參數(shù) : 無
- *******************************************************************************/
- ushort PendMessageQueue(void)
- {
- ushort message;
- while(MessageQueue.Entries == 0) // 等待消息
- { /* 推薦在這兒喂狗 */ };
-
- message = *MessageQueue.Out++; // 消息出口加一
- MessageQueue.Entries--; // 消息數(shù)量減一
-
- if (MessageQueue.Out > MessageQueue.End) // 出口越界循環(huán)
- MessageQueue.Out = MessageQueue.Start;
-
- return(message); // 返回消息
- }
復(fù)制代碼
|
評分
-
查看全部評分
|