新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 基于AVR單片機的嵌入式系統(tǒng)的應(yīng)用分析

        基于AVR單片機的嵌入式系統(tǒng)的應(yīng)用分析

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

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

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

          ②重新修改AVRX源碼的serialio.s文件,即根據(jù)不同的修改串口部分的寄存器定義。需要增添如下代碼:

             #if defined(UBRRL)
             #define UBRR UBRRL
             #endif
             #if defined(UBRRH)
             sts UBRRH,p1h
             #endif

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

          至此就完成了AVRX在ATmega16上的內(nèi)核移植,接著就可以編寫程序了。

        2.2 在AVRX上編寫程序

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

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

        TARGET=test /*應(yīng)用程序文件名*/

        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 /*設(shè)置sacnf函數(shù)庫的類型,在不使用時可以注釋掉,這樣可以減小編譯后的文件大小*/

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

        3 測試

        3.1 實時性測試

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

        3.2 使用例程測試

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

        4 心得體會

          ①AVRX的源碼都是用匯編語言編寫的,相對來講代碼效率很高,但是由于沒有詳細(xì)的API介紹文檔,所以最好的入門方法就是先讀懂RTOS的源碼和例程,然后進行修改,再加上自己的代碼逐漸熟練應(yīng)用。

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

          ③啟動的最后一個指令必須跳轉(zhuǎn)到Epilog()。

        5 結(jié)論

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

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

        上一頁 1 2 下一頁

        評論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 五指山市| 通道| 鸡西市| 南川市| 得荣县| 屏东县| 增城市| 常山县| 东安县| 额济纳旗| 宜宾县| 张北县| 汾阳市| 晋江市| 湖南省| 饶阳县| 咸丰县| 东台市| 通山县| 济源市| 南城县| 宝清县| 赤城县| 珠海市| 青田县| 阜新市| 囊谦县| 原阳县| 新和县| 阿克| 崇义县| 宽甸| 克山县| 金川县| 阳高县| 松江区| 卫辉市| 从江县| 吉木萨尔县| 桃园县| 馆陶县|