<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于A(yíng)VR單片機的嵌入式系統的應用分析

基于A(yíng)VR單片機的嵌入式系統的應用分析

作者: 時(shí)間:2011-09-26 來(lái)源:網(wǎng)絡(luò ) 收藏

ABSPATH=…/avrx /*更改X原路徑到實(shí)際路徑下*/

修改   MCU=8535
     AMCU=1
     GCCMCU=at90s$(MCU)
     XMCU=_AT90S$(MCU)_
為    ICCMCU=m16
     AAVRMCU=3
     GCCMCU=atmega16
     AVRXMCU=_AT90Mega16_

 ?、谥匦滦薷腁VRX源碼的serialio.s文件,即根據不同的修改串口部分的寄存器定義。需要增添如下代碼:

    ?。f defined(UBRRL)
    ?。efine UBRR UBRRL
    ?。ndif
    ?。f defined(UBRRH)
     sts UBRRH,p1h
    ?。ndif

 ?、壑匦戮幾g內核。具體做法是復制一個(gè)“令名提示符”到AVRX目錄下,運行“命令提示符”,鍵入“makegcc”命令后運行就完成了AVRX內核的重新編譯,會(huì )生成很多的.o文件和avrx.a文件。這些文件在以后的程序中會(huì )使用。

  至此就完成了AVRX在A(yíng)Tmega16上的內核移植,接著(zhù)就可以編寫(xiě)程序了。

2.2 在A(yíng)VRX上編寫(xiě)程序

  這時(shí)候要用一個(gè)新的makefile文件,同時(shí)自己的程序可以不和AVRX的內核在一個(gè)目錄,但是要指出依賴(lài)文件的明確路徑。makefile的框架可以采用Winavr的sample文件夾下的makefile文件框架,這里的難點(diǎn)其實(shí)還是makefile文件的語(yǔ)法問(wèn)題。下面介紹應用程序的makefile文件在實(shí)例中需要修改或增加的代碼:

MCU=atmega16 /*微處理器的名字*/

TARGET=test /*應用程序文件名*/

GCCLIB=$(AVRX)/avrx/avrx.a

GCCINC=-L-I$(AVRX)/avrx-I$(AVR)/avr/inc /*加上相關(guān)的庫*/

SCANF_LIB_MIN=-W1,-u,vfscanf-1scanf_min

SCANF_LIB_FLOAT=-W1,-u,vfscanf-1scanf_flt

SCANF_LIB /*設置sacnf函數庫的類(lèi)型,在不使用時(shí)可以注釋掉,這樣可以減小編譯后的文件大?。?

LDFLAGS+=$(PRINTF_LIB)$(SCANF_LIB)$(MATH_LIB) /*新增的連接器參數設定*/

3 測試

3.1 實(shí)時(shí)性測試

  在實(shí)時(shí)中,實(shí)時(shí)系統的實(shí)時(shí)性表現在系統對外部事件的響應能力上,系統通過(guò)中斷來(lái)響應外部事件的發(fā)生,并且在用戶(hù)中斷程序中做的事要盡量少,把大部分工作留給任務(wù)去做,只是通過(guò)信號量或者信息機制來(lái)通知任務(wù)運行。Mega16的定時(shí)器2設為比較匹配輸出模式,在匹配時(shí)間到了之后產(chǎn)生一定周期脈沖輸出,并產(chǎn)生中斷。設置定時(shí)器1為計數模式來(lái)計數產(chǎn)生的脈沖輸出。通過(guò)定時(shí)器2的比較匹配中斷服務(wù)子程序來(lái)發(fā)信號量通知任務(wù)運行,并在中斷子程序中不開(kāi)中斷,而在任務(wù)得到信號后開(kāi)中斷,以實(shí)現中斷處理與任務(wù)運行的同步,任務(wù)中對一個(gè)全局變量計數,以記錄任務(wù)執行的次數。運行一段時(shí)間后,在設置的匹配時(shí)間里,任務(wù)的運行次數和定時(shí)器1的計數一樣,則系統在這段時(shí)間里是能完全響應外部事件的,當定時(shí)器2的比較匹配時(shí)間設為大于23μs時(shí),2個(gè)計數是相等的;當小于23μs時(shí),定時(shí)器1計數值大于任務(wù)計數值,說(shuō)明任務(wù)沒(méi)有完全得到響應。這說(shuō)明中斷的進(jìn)入和返回即系統對外部時(shí)間的響應和處理時(shí)間為23μs,遠遠大于其他操作系統在A(yíng)VR上移植后的響應時(shí)間。

3.2 使用例程測試

  這里只對源文件中的幾個(gè)例程先進(jìn)行簡(jiǎn)單的編譯,然后去掉不必要的代碼,加入自己想測試的一些代碼,進(jìn)行了定時(shí)器控制模塊,信號量和消息隊列以其簡(jiǎn)單組合的測試,均在A(yíng)Tmega16上達到了預期的效果。

4 心得體會(huì )

 ?、貯VRX的源碼都是用匯編語(yǔ)言編寫(xiě)的,相對來(lái)講代碼效率很高,但是由于沒(méi)有詳細的API介紹文檔,所以最好的入門(mén)方法就是先讀懂RTOS的源碼和例程,然后進(jìn)行修改,再加上自己的代碼逐漸熟練應用。

 ?、贏(yíng)VRX需要分配的堆棧為35個(gè)字節加上任務(wù)代碼需要的額外堆棧,具體的大小取決于每個(gè)進(jìn)程用的本地變量個(gè)數。比較好的確定分配給任務(wù)堆棧大小的方法是:分配很大的堆棧(如70字節)運行一段應用程序后看堆棧到多深(因為GCC啟動(dòng)時(shí)把所有內存都清0了,這樣很容易看到)。不過(guò),為了安全起見(jiàn),用編譯器或仿真器在估計堆棧的頂端寫(xiě)入幾個(gè)字節的0xFFFFF去驗證到底達到了多少字節,然后分配給比測試結果多兩個(gè)以上的字節給這個(gè)任務(wù)。

 ?、蹎?dòng)的最后一個(gè)指令必須跳轉到Epilog()。

5 結論

  AVRX是一個(gè)不錯的RTOS,最顯著(zhù)的特點(diǎn)就是內核小,速度快,編譯后大概只需500~700字節,且基本的調度功能一個(gè)也不少。由于其代碼公開(kāi),結合不同型號AVR單片機的特性,可以在此基礎上進(jìn)行系統的裁減和擴展,使之能達到更好的效果,本文為AVR系統的應用提供了借鑒。

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

上一頁(yè) 1 2 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>