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

2020-12-17 電子產品世界

6.1.中斷函數:

IAR編譯器裡用關鍵字來__interrupt來定義一個中斷函數。用#pragma vector來提供中斷函數的入口地址
#pragma vector=0x12//定時器0溢出中斷入口地址
__interrupt void time0(void)
{
;
}
上面的入口地址寫成#pragma vector=TIMER0_OVF_vect更直觀,每種中斷的入口地址在頭文件裡有描述。函數名稱time0可以為任意名稱。中斷函數會自動保護局部變量,但不會保護全局變量

本文引用地址:http://www.eepw.com.cn/article/201611/316461.htm

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 \n"
"CLH \n"
"OR R16,R17 \n");
}
不過IAR提供了完全可以訪問底層的函數,建議不要頻繁使用彙編


相關焦點

  • AVRGCC/WinAVR編譯環境中斷函數的使用方法
    早期版本的avr-libc 對中斷服務程序的書寫提供了兩個宏SIGNAL 和INTERRUPT,並且需要包含兩個頭文件:avr/signal.h 和avr/interrupt.h。
  • AVR單片機外部中斷觸發的流水燈程序
    概述: 8位流水非精確定時,一秒循環燈閃爍,等待外部中斷一下降沿中斷觸發信號, 外部中斷一旦觸發,等待觸發按鍵彈起(此時流水燈暫停狀態),中斷按鍵一旦彈起,繼續運行上一級程序(流水燈繼續運行); accomplish time : 2014-2-7 22:47:15;*/
  • IAR STM32 函數和變量的絕對地址定位
    整個test.c文件的所有函數,都在0x08018000 之後。如果有多個函數需要單獨更新,建議採用第二種方式, 只需要對c文件編譯後的地址定位,那麼該c文件的所有函數都定位了。絕對定位的函數,只要指定了地址,那麼在flash裡面的位置就是固定的。
  • IAR for AVR 學習筆記(5)--SRAM操作
    SARM數據類型的具體操作方法 SARM空間是AVR單片機最重要的部分,所有的操作必須依賴該部分來完成。Register_R15_is_global_regvarINC R15// 6 P++; }INC R14RET注意:定義在寄存器裡變量不能帶有初始值。最好不要使用超過9個寄存器變量,不然可能引起潛在的危險,因為建立庫的時候沒有鎖定任何寄存器。
  • 乾貨| FreeRTOS學習筆記——中斷與任務切換
    前面的連載中已經介紹過,FreeRTOS 對每個任務分配了獨立的堆棧空間,用於保存函數的局部變量等等。在發生中斷時,CPU的某些寄存器會被保存到當前的堆棧裡(而不是指定某任務的堆棧),然後開始執行ISR程序。如果當前是某個任務的代碼正被執行,則會佔用該任務的堆棧;如果當前是另外一個 ISR 的代碼正在執行即發生中斷嵌套,那麼可能繼續用更早被中斷的任務的堆棧(註:這與平臺有關。
  • 各種單片機中斷程序的寫法
    /324648.htmvoid main(){}void interrupt tt() //中斷服務程序,不用申明{}////////////////////////////////////////// 下面AVR單片機GCC中斷程序的寫法 ///////
  • 學習筆記:ReLU的各種變形函數
    在ReLU函數的基礎上,又出現了幾種變形函數。進一步對比,我們把ReLU、Leaky ReLU、PReLU和RReLU的函數圖像描繪出來,如下圖所示。Bounded ReLU函數Bounded ReLU函數簡稱BReLU,其表達式如下所示。n值是可以調整的,在TensorFlow中提供了BReLU-6,或是直接寫成ReLU6。
  • 痞子衡嵌入式:JLink Script文件基礎及其在IAR下調用方法
    ,這些功能通過API函數接口形式開放給JLink Script來調用,這些API全部以JLINK_為前綴。舉一個比較常用的API函數JLINK_TARGET_Halt(),這個函數功能就是掛起目標內核。
  • avr單片機和stm32區別與優缺點分析
    avr單片機缺點:   1. 是沒有位操作,都是以字節形式來控制和判斷相關寄存器位的   2. C語言與51的C語言在寫法上存在很大的差異,這讓從開始學習51單片機的朋友很不習慣   3. 通用寄存器一共32個(R0~R31),前16個寄存器(R0~R15)都不能直接與立即數打交道,因而通用性有所下降。
  • CV學習筆記(十二):二值化操作
    關注「深度學習衝鴨」,一起學習一起衝鴨!
  • 單片機multiple中斷調用子函數
    *所有中斷中調用子函數的問題,都是由於函數的再入問題引起的本文引用地址:http://www.eepw.com.cn/article/201611/321054.htm 在KeilC中,如果要在中斷中調用其他函數,如果此函數在中斷外沒有其他程序調用,自然是沒有關係,否則需要將被調用的函數設置為可重入
  • 【MIT 6.824】學習筆記 1: MapReduce
    開課了,記錄和分享一下自己的學習筆記,歡迎一起學習。導讀MapReduce 的問世讓集群分布式計算流行起來,同時,作為分布式系統學習的經典案例,MapReduce 很好地展示了分布式系統的概貌,以及我們在 6.824 要學習到的一些主題。本期材料主要來自於 MapReduce 論文和 MIT 6.824 2021 視頻。
  • Arduino在中斷函數裡面怎麼延時
    Arduino在中斷函數裡面怎麼延時Arduino裡面有兩種中斷,一種是內部中斷,就象系統時鐘那樣,
  • ARM Cortex-M3 MCU的I2C和DMA操作被中斷打斷的解決方法
    直到I2C被頻繁中斷,clock吐不出來為止,SCK和SDA都被拉低,此時明顯的I2C和DMA的配合過程被其他因素頻繁的幹擾打死了。 通過示波器抓到的波形驗證了這一點,然後再來分析代碼和串口輸出,發現是外部GPIO一直有中斷輸入,Cortex-M3 MCU頻繁的響應中斷,導致I2C&DMA操作被打掛了。 有什麼辦法來解決這個問題?
  • numpy中數組操作的相關函數
    在numpy中,有一系列對數組進行操作的函數,在使用這些函數之前,必須先了解以下兩個基本概念副本視圖副本是一個數組的完整拷貝
  • S32K1xx系列MCU應用開發指南之IAR toolchain樣例工程及使用常見問題(FAQ)
    1.1 S32K1xx系列MCU的IAR樣例工程的獲取其實,在NXP提供的S32K1xx系列MCU的SDK安裝目錄下就提供了相應各個part number的IAR樣例工程--hello_world_iar:比如,S32K1xx SDK RTM3.0.0中集成的S32K144 IAR樣例工程目錄如下:hello_world_iar.ewp:IAR工程文件;hello_world_iar.eww
  • Cortex-M3 (NXP LPC1788)之外部中斷操作
    要使用LPC1788的外部中斷,要進行兩部分的操作。由於外部中斷的管腳採用I/O復用的形式,顯然我們首先要對管腳進行配置,使其工作在外部中斷輸入的模式。其次,我們需要配置中斷相關的寄存器包括中斷使能以及中斷的觸發方式等。 由於我們使用的是外部中斷0,查閱數據手冊,其GPIO管腳為P2_10,為此我們設置IOCON_P2_10寄存器的FUNC欄位,設置成001即為EINT0模式。 配置完引腳後,還需要繼續配置具體的中斷功能。
  • Linux中斷機制:硬體處理,初始化和中斷處理
    概覽中斷讓外設能夠通知CPU他需要獲得服務(讓CPU執行指定的中斷服務例程ISR)。為了達到這個目的,首先要為中斷執行做好準備,完成初始化相關的操作。4、 NMI NMI是不可屏蔽中斷(不可通過IF標誌屏蔽),是通過CPU的NMI管腳發出的中斷或者通過delivery mode為NMI的方式提交的中斷。NMI中斷在執行前,CPU不僅會屏蔽其它中斷,也會屏蔽NMI中斷,直到NMI中斷處理執行完成(IRET指令被執行)。使用INT 2指令雖然能執行NMI中斷處理函數,但是相關硬體不會介入,也就是沒有相關的屏蔽NMI中斷的操作。
  • Linux中斷(interrupt)子系統之一:中斷系統基本原理
    中斷通用邏輯層通過標準的封裝接口(實際上就是struct irq_chip定義的接口)訪問並控制中斷控制器的行為,體系相關的中斷入口函數在獲取IRQ編號後,通過中斷通用邏輯層提供的標準函數,把中斷調用傳遞到中斷流控層中。
  • 乾貨 | FreeRTOS 學習筆記——FreeRTOS的軟體結構
    在我的學習筆記系列裡面這部分內容倒不是首要的,因為我想分享的是從我對 FreeRTOS 代碼的分析和實踐了解到它是怎麼工作的,帶來了什麼好處)。 從 freertos.org 網站上可以找到下載原始碼包的連結。