新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > IAR for AVR 學(xué)習(xí)筆記(5)--SRAM操作

        IAR for AVR 學(xué)習(xí)筆記(5)--SRAM操作

        作者: 時間:2016-11-13 來源:網(wǎng)絡(luò) 收藏
        SARM數(shù)據(jù)類型的具體操作方法

        SARM空間是AVR單片機最重要的部分,所有的操作必須依賴該部分來完成。變量在SARM空間的存儲模式有tiny ,small large 三種,也就是對應(yīng)于__tiny, __near __far三中存儲屬性。一旦選擇為哪種存儲模式,對應(yīng)的數(shù)據(jù)默認屬性也就確定了,但可以采用__tiny, __near __far關(guān)鍵字來更改。
        對于程序中的局部變量,編譯器會自動處理的,我們也不可能加什么儲存屬性,但IAR提供了強大的外部變量定義

        本文引用地址:http://www.104case.com/article/201611/316460.htm

        5.1.定義變量在工作寄存器
        IAR編譯器內(nèi)部使用了部分工作寄存器,留給用戶的只有R4-R15供12個寄存器供用戶使用,要使用工作寄存器必須在工程選項里打開鎖定選項。
        例:
        定義兩個變量使用工作寄存器R14,R15。
        #i nclude
        __regvar __no_init char g @ 15;
        __regvar __no_init char P @ 14;
        void main(void)
        {
        g++;
        P++;
        }
        在工程選項里c/c++ complier>code里打開要使用的寄存器R14-R15。


        編譯結(jié)果就如下,看看是不是直接使用了寄存器做為數(shù)據(jù)應(yīng)用
        // 4 void main(void)
        main:
        CFI Block cfiBlock0 Using cfiCommon0
        CFI Function main
        // 5 { g++;
        REQUIRE ?Register_R14_is_global_regvar
        REQUIRE ?Register_R15_is_global_regvar
        INC R15
        // 6 P++; }
        INC R14
        RET
        注意:定義在寄存器里變量不能帶有初始值。最好不要使用超過9個寄存器變量,不然可能引起潛在的危險,因為建立庫的時候沒有鎖定任何寄存器。

        5.2.定義變量的絕對地址.沒有特性的變量是隨機分配的,要給變量分配地址必須加以特性修飾注意在定義地址的時候千萬不要和片內(nèi)寄存器地址重合了。
        5.2.1定義沒有存儲特性的絕對地址變量必須加__no_init 或者const對象特性
        __no_init char t @ 0x65;//定義在I/O地址以外
        const char t @ 0x65;//定義只讀變量的地址
        例:
        #i nclude
        __no_init char u @ 0x65 ;
        void main(void)
        {u++;}
        對應(yīng)匯編:
        void main(void)
        main:
        {u++;}
        00000000 E6E5 LDI R30, 101
        00000002 E0F0 LDI R31, 0
        00000004 8100 LD R16, Z
        00000006 9503 INC R16
        00000008 8300 ST Z, R16
        0000000A 9508 RET
        5.2.2帶存儲特性的關(guān)鍵字定義變量的絕對地址__io,__ext_io定義變量在i/o空間
        #i nclude
        __io char u @ 0x65 ;
        void main(void)
        {u++;}
        對應(yīng)匯編:
        void main(void)
        main:
        {u++;}
        00000000 91000065 LDS R16, 101
        00000004 9503 INC R16
        00000006 93000065 STS 101, R16
        0000000A 9508 RET
        從5.2.1和5.2.2對比,發(fā)現(xiàn)用5.2.2方法定義代碼小多了。


        5.3.關(guān)鍵字volatile保證從最原始的位置讀取變量。在IAR編譯器里,除了__no_init和__root定義的變量外,其他的類型的變量都包含有volatile和__no_init特性



        關(guān)鍵詞: IARAVRSRAM操

        評論


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

        關(guān)閉
        主站蜘蛛池模板: 平度市| 灵石县| 天峨县| 开江县| 揭东县| 松阳县| 衡阳市| 甘德县| 任丘市| 建阳市| 重庆市| 襄汾县| 确山县| 洪江市| 光泽县| 樟树市| 平潭县| 大连市| 兖州市| 武宁县| 浦东新区| 凉城县| 韶关市| 武平县| 渭源县| 安义县| 科技| 秦安县| 上虞市| 鄂温| 天长市| 嘉义市| 广宗县| 祁东县| 彝良县| 杂多县| 玛多县| 巩留县| 都兰县| 玛曲县| 砚山县|