<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 模擬技術 > 設計應用 > 基于Lonworks總線的嵌入式智能節(jié)點的設計

          基于Lonworks總線的嵌入式智能節(jié)點的設計

          作者:王振臣,顏旭斌,王樹賢 時間:2008-08-27 來源:微計算機信息 收藏

            OS_CPU_C.C要求編寫六個簡單的c函數(shù):OSTaskSiklnit();OSTaskCreateHook();OSTaskDelHook();OSTaskSwHook();OSTaskStatHook();OSTimeTickHook()唯一必要的函數(shù)是OSTaskStklnit(),其它五個函數(shù)必須聲明但沒必要包含。對于OSTaskStklnit()而言,OSTaskCreate()和OSTaskCreateExt()通過調(diào)用OSTaskStkInit()來初始化任務的堆棧結構,OSTaskStkInit()返回堆棧指針所指的地址,OSTaskCreate()會獲得該地址并將它保存到任務控制塊(OS TCB)中。

          本文引用地址:http://www.ex-cimer.com/article/87438.htm

            CPU_ A.ASM要求編寫四個簡單的匯編語言函數(shù):OSStartHighRdy();OSCtxSw();

            OSIntCtxSw();OSTickISR()。將所有與處理器相關的代碼放到OS_CPU_C.C文件中,而不必放在一些分散的匯編語言文件中。

            (1)OSStartHighRdy():運行高優(yōu)先級就緒任務函數(shù)OSStartHighRdy()必須調(diào)用OSTaskSwHook(),因為OSTaskSwHook()可以通過檢查OSRunning而確定是OSStartHighRdy()在調(diào)用它(OSRunning為FALSE)還是正常的任務切換在調(diào)用它(OSRunning為TRUE)。OSStartHighRdy()還必須在最高優(yōu)先級任務恢復之前和調(diào)用OSTaskSwHook()之后設置OSRunning為TRUE。

            (2)OSCtxSw()、OSIntCtxSw():上下文切換函數(shù)任務級的切換是通過發(fā)軟中斷命令來完成的,其中斷向量地址必須指向OSCtxSw()。中斷級的切換由OSIntExit()通過調(diào)用OSintCtxSw()來執(zhí)行切換功能。

            (3)OSTickISR():定時中斷函數(shù)OSTickISR()函數(shù)主要負責進人中斷時保存處理器寄存器內(nèi)容,完成任務切換退出時恢復處理器寄存器內(nèi)容并返回,相當于中斷服務程序的入口。

            4   μc/os_Ⅱ與的結合

              因為μc/os_Ⅱ操作系統(tǒng)代碼和應用程序代碼的固有的特征,兩者可以有機的結合在一起。μcos_Ⅱ由系統(tǒng)服務,如郵箱、內(nèi)存管理、消息隊列、信號量管理等,對于這些服務是在OS_CFG.h定義了的,當設計的系統(tǒng)要使用這些服務時只需要將定義的值改為1即可。將應用程序中的常量定義全部放在OS_CFG.h中。這樣可以同時對操作系統(tǒng)各種服務函數(shù)和ShortStack 的API和APP函數(shù)實現(xiàn)了裁減。

             將ShortStack應用程序當作μcos_Ⅱ操作系統(tǒng)的一個任務運行。先定義堆棧,以便保存本任務在任務切換時單片機的寄存器的當前值,當μcos_Ⅱ下次調(diào)度到該任務運行時就可以從堆?;謴虲PU的值,從而該任務繼續(xù)運行。程序如下:

            OS_STK TaskStartStk[TASK_STK_SIZE];  //任務Task1的任務堆棧

            OS_STK ShortStackStk[TASK_STK_SIZE];  //ShortStack的任務堆棧

            …  //其他任務堆棧

            Void main(void)

            {

            OSInit();

            OSTaskCreat(Task1,(void *)0,& TaskStartStk[TASK_STK_SIZE-1],0);

            OSTaskCreat(ShortStack,(void *)0,& ShortStackStk[0],2);

            …  //創(chuàng)建其他任務

            OSStart();

            return 0;

            }

            void ShortStack(void)

            {

            lonInit();

            for(; ; )

            {

              lonEventHandler();//周期性調(diào)用檢查是否有任何LonWorks事件要處理

            }

            }

            由于μc/os_Ⅱ操作系統(tǒng)沒有任何的硬件驅動,所以用戶自己將ShortStack串口驅動、輸入輸出隊列操作部分擴展為該操作系統(tǒng)的一部分。此外,系統(tǒng)可以添加其他特定的任務,通過系統(tǒng)調(diào)度,實現(xiàn)節(jié)點的合理利用,增加節(jié)點的實用性。如圖4所示。

            最后,將帶有TP/FT-10F控制模塊的MSP430F149芯片接入Gizmo4開發(fā)板,通過Nodebuilder開發(fā)工具編譯,進入調(diào)試界面,利用LonMaker連接為兩節(jié)點網(wǎng)絡,測試兩節(jié)點是否通訊。


          圖4  軟件結構圖

            5  結束語

             MSP430F149是16bit的RISC微處理器,該處理器特別適用于手持式設備以及高性價比、低功耗的網(wǎng)絡設備,它集成了中斷控制、功率控制、存儲控制、UART、PWM、ADC等豐富的資源。由于工業(yè)、家庭網(wǎng)絡化的需求,以及LonWorks總線便捷的入網(wǎng)方式,可以使該分散自制,每個節(jié)點一方面分散地解決其特定的任務,另一方面通過點對點、點對多點的通訊,解決節(jié)點之間的信息傳輸,實現(xiàn)分散基礎上的融合。上位機要完成對LON 網(wǎng)絡的監(jiān)控與管理功能,二者之間必須能進行動態(tài)數(shù)據(jù)交換。LON 總線技術還提供了DDE Server 軟件。DDE Server 能夠實現(xiàn)LON網(wǎng)絡和任何具有DDE 功能的Windows 應用程序間交換網(wǎng)絡變量和信息。系統(tǒng)提供給用戶一個十分友好的人機界面,用戶可通過上位機設置各節(jié)點實時運行情況以及歷史運行記錄、打印等。

              本文作者創(chuàng)新點:運用ShortStack技術,設計了以MSP149為主處理器,Neuron芯片為微處理器的通用節(jié)點,與Lonworks總線實現(xiàn)通訊連接,并可擴展多種用途,具有很好的實用和經(jīng)濟價值。

            參考文獻

            [1] David E.Simon著,陳向群等譯,系統(tǒng)軟件教程[M].北京:機械工業(yè)出版社,2005

            [2] ShortStack User’s Guide,Echelon, 2002

            [3] Jean J.Labrosse著,邵貝貝譯,μC/OS_II源碼公開的實時操作系統(tǒng)[M].北京:中國電力出版社,2001

            [4] 胡大可 MSP430系列FLASH型超低功耗16位單片機[M].北京:北京航空航天大學出版社 ,2001

            [5] 賈慧瀟,王振臣.基于LonWorks 的高性能溫濕度測控系統(tǒng)[J].微計算機信息,2006,8-1:30-34。

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

          上一頁 1 2 下一頁

          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();