新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 【IAR學習】學習筆記

        【IAR學習】學習筆記

        作者: 時間:2016-11-25 來源:網絡 收藏

        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++;}

        對應匯編:

        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帶存儲特性的關鍵字定義變量的絕對地址__io,__ext_io定義變量在i/o空間

        #i nclude
        __io char u @ 0x65 ;
        void main(void)
        {u++;}

        對應匯編:

        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對比,發現用5.2.2方法定義代碼小多了。

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

        IAR for AVR 學習筆記(6)--中斷及相關函數操作

        6.1.中斷函數:

        在IAR編譯器里用關鍵字來__interrupt來定義一個中斷函數。用#pragma vector來提供中斷函數的入口地址

        #pragma vector=0x12//定時器0溢出中斷入口地址
        __interrupt void time0(void)
        {
        ;
        }

        上面的入口地址寫成#pragma vector=TIMER0_OVF_vect更直觀,每種中斷的入口地址在頭文件里有描述。函數名稱time0可以為任意名稱。中斷函數會自動保護局部變量,但不會保護全局變量。

        6.2.內在函數也可以稱為本征函數

        編譯器自己編寫的能夠直接訪問處理器底層特征的函數。在intrinsics.h中有描述完整類型在comp_a90.h里有進一步的簡化書寫方式

        6.2.1延時函數,以周期為標準

        __delay_cycles(unsigned long );

        如果處理器頻率為1M,延時100us,如下:

        __delay_cycles(100 );

        當然你也可以對該函數進行修改:

        #define CPU_F 1000000
        #define delay_us (unsigned long) __delay_cycles((unsigned long )*CPU_F)
        #define delay_ms (unsigned long) __delay_cycles((unsigned long )*CPU_F/1000)

        6.2.2中斷指令

        __disable_interrupt( );//插入CLI指令, 也可以用_CLI();也可以SREG_Bit7=0;
        __enable_interrupt( );// 插入SEI指令,也可以用_SEI();也可以SREG_Bit7=1;

        其實對于狀態字的置位和清零只有BSET S 和BCLR S兩條指令。像SEI不過是BSET 7;的另一個名字而已。AVR指令中還有很多類似的現象,如:ORI 和 SBR 指令完全一樣,號稱130多條指令的AVR其實沒有那么多指令的。

        6.2.3從FLASH空間指定地址讀取數據

        __extended_load_program_memory(unsigned char __farflash *);
        __load_program_memory(unsigned char __flash *);

        該條指令以及正確的使用方法在4.5.flash 操作宏函數里詳細講解,這里不再重復

        6.2.4乘法函數

        __fracdtional_multiply_signed(signed char, signed char);
        __fractional_multiply_signed_with_unsigned(signed char, unsigned char);
        __fractional_multiply_unsigned(unsigned char, unsigned char);
        //以上為定點小數乘法
        __multiply_signed(signed char, signed char);//有符號數乘法
        __multiply_signed_with_unsigned(signed char, unsigned char);
        //有符號數和無符號數乘法
        __multiply_unsigned(unsigned char, unsigned char);//無符號數乘法

        6.2.4 半字節交換指令

        __swap_nibbles(unsigned char);

        6.2.5 MCU控制指令

        __no_operation();//空操作指令
        _NOP();
        __sleep();//休眠指令
        _SLEEP();
        __watchdog_reset();//看門狗清零
        _WDR();

        IAR for AVR 學習筆記(7)--頭文件含義

        avr_macros.h里面包含了讀寫16位寄存器的簡化書寫,和幾個位操作函數

        comp_a90.h對大量的內在函數做了簡要書寫

        ina90.h包含"inavr.h" "comp_A90.h"文件

        intrinsics.h內在函數提供最簡單的操作處理器底層特征。休眠,看門狗,FLASH函數。

        iomacro.H I/O寄存器定義文件樣本。

        iom8.h 包含I/O等寄存器定義

        IAR for AVR 學習筆記(8)--匯編嵌入方式

        嵌入匯編語言

        在線匯編:使用asm或者__asm,推薦使用__asm。

        #i nclude
        void main()
        {
        asm("NOP "
        "CLH "
        "OR R16,R17 ");
        }

        不過IAR提供了完全可以訪問底層的函數,建議不要頻繁使用匯編


        上一頁 1 2 3 下一頁

        關鍵詞: IAR學習學習筆

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 丹东市| 安国市| 巩义市| 敦煌市| 深圳市| 齐齐哈尔市| 铅山县| 柳州市| 西城区| 凤城市| 云和县| 定结县| 方正县| 绥棱县| 秦皇岛市| 河曲县| 舒城县| 青田县| 阿巴嘎旗| 温州市| 河北区| 东兴市| 繁昌县| 布尔津县| 元江| 佛坪县| 泰宁县| 新和县| 罗田县| 调兵山市| 志丹县| 明水县| 惠来县| 庄河市| 常宁市| 南充市| 旅游| 哈尔滨市| 日照市| 娄底市| 平利县|