在IAR編譯器里用關鍵字來__interrupt來定義一個中斷函數。用#pragma vector來提供中斷函數的入口地址。
#pragma vector = 0x12 //定時器0溢出中斷入口地址 __interrupt void time0(void) { ; } 上面的入口地址寫成#pragma vector=TIMER0_OVF_vect更直觀,每種中斷的入口地址在頭文件里有描述。函數名稱time0可以為任意名稱。中斷函數會自動保護局部變量,但不會保護全局變量。
1 .內在函數也可以稱為本征函數 編譯器自己編寫的能夠直接訪問處理器底層特征的函數。在intrinsics.h中有描述完整類型在comp_a90.h里有進一步的簡化書寫方式
延時函數,以周期為標准 __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)
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其實沒有那么多指令的。
3.從FLASH空間指定地址讀取數據 __extended_load_program_memory(unsigned char __farflash *); __load_program_memory(unsigned char __flash *);
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);//無符號數乘法
5.半字節交換指令 __swap_nibbles(unsigned char);
6.MCU控制指令 __no_operation();//空操作指令 _NOP(); __sleep();//休眠指令 _SLEEP(); __watchdog_reset();//看門狗清零 _WDR();