欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2573|回復: 13
收起左側

關于單片機中斷的深入探索

[復制鏈接]
ID:825202 發表于 2023-10-24 17:02 | 顯示全部樓層 |閱讀模式
最近在看關于中斷的相關基礎知識點,想請教一下各位大神,關于中斷在應用,原理上的一些相對深入一些的重點知識
回復

使用道具 舉報

ID:883242 發表于 2023-10-29 02:49 | 顯示全部樓層
匯編有兩種寫法,教科書里面講的是absolute location,這種寫法所有變量都是作者自己指定的絕對地址,using這個關鍵字毫無意義。另一種是relocatable,變量地址都是用ds這樣的關鍵字定義的,在匯編期間變量地址都不確定,只有連接期間才會確定,using這個關鍵字是讓linker回避已經使用過的register bank用的,但是這種寫法沒見過中文書籍講解,只能查C51的幫助文件,講匯編的那個。
回復

使用道具 舉報

ID:624769 發表于 2023-10-28 19:42 | 顯示全部樓層
鵜鶘 發表于 2023-10-27 22:43
“在A中 using 號相同 會考驗你保護現場的能力!

——“A”是指的什么?,“C”指的是C語言吧, ...

我前文中的 C指 C51, A指 A51
C51 編程時,中斷函數后面跟的 using x 主要是用來分配 RS0~RS3 這4個通用寄存器組的。
如果你主程序 用的默認RS0,  而中斷函數 用的 RS1 (USING 1指定),則編譯后,會直接利用 PSW = 0x08, 把寄存器組切換到 RS1 組,退出中斷時,通過 POP PSW 來還原寄存器組,恢復部分現場。來實現高效率中斷。
而,如果你主程序用的 RS0, 中斷也使用 RS0 (USING 0), 那么,編譯時,KEIL會 很聰明的 把通用寄存器組的 R0~R7  依次 PUSH 的堆棧里,確保可以返回時恢復現場,當然,這樣的操作會降低中斷的效率。
然后,到了不同優先級的中斷了。由于KEIL無法判斷 嵌套中斷,因此,如果低優先級中斷,和高優先級中斷使用相同的寄存器組,的確會產生低優先級中斷的現場被破壞的情況。如果自己在這方面沒有把握的的話,不建議使用 using 參數,可以在 設置中 用 ONEREGBANK 來屏蔽代碼中的 Using發生作用。畢竟using 的最初設計的應用場景是 基于A51的應用場景。所以在C51中,還是有不少缺陷的。
回復

使用道具 舉報

ID:401564 發表于 2023-10-27 23:58 | 顯示全部樓層
中斷:就是暫停當前的事件,去處理中斷事件,處理完中斷事件,再回來執行剛才正在執行的"當前事件"
你只要知道這個就可以了,其它的就在這個基礎之上出來的,會用就行,沒什么所謂的"探索"
很多東西都是要結合你所用的單片機的資源來搭配使用的
像STM32這種復雜的中斷系統,你能折騰好幾天
但是,像有低端單片機,它就一個中斷源,兩層硬件堆棧,有什么能探索的?
回復

使用道具 舉報

ID:397054 發表于 2023-10-27 22:43 | 顯示全部樓層
188610329 發表于 2023-10-26 20:09
Main 函數不一定是 0 區, 要看你Startup 如何設置。

using 號是可以相同的。

“在A中 using 號相同 會考驗你保護現場的能力!

——“A”是指的什么?,“C”指的是C語言吧,用C編程,兩個不同級別的中斷使用同一個using號多半不行,5樓程序就是個實例,中斷0用的是using 0,這肯定是和主函數沖突,所以“無法返回”,改成using 2或using 3完全就正常了。所謂的“無法返回”是表面現象,實際上返回了,因為根本沒有理由不返回,只是返回后環境變了,CPU進入半死機狀態,看著像沒返回。

“在C中 using 號相同 僅僅是降低了效率而已!
這句話怎么理解?“降低了效率”指的是什么?原理是什么?

using 號相同可能可以,這恐怕要看編譯程序了,keil是不行的,至少我用的這個版本不行,其他的也沒用過。
在keil環境中using 號相同只要懂得這個原理,符合一定的規則也可以,即:同優先級的中斷可以使用相同的using號,不同優先級的中斷,只要能保證不發生中斷嵌套也沒問題——原理是很清楚的。
回復

使用道具 舉報

ID:397054 發表于 2023-10-27 22:02 | 顯示全部樓層
188610329 發表于 2023-10-26 20:09
Main 函數不一定是 0 區, 要看你Startup 如何設置。

using 號是可以相同的。

如果不設置呢?我上面不是說了【兩個中斷函數using號相同時只要不嵌套,運行是正常的】,但發生了嵌套會怎樣?——基本上可以肯定不正常。
回復

使用道具 舉報

ID:73992 發表于 2023-10-26 21:11 | 顯示全部樓層
中斷的普通用法的確太過于平庸,在中斷程序中修改棧內容,并且修改中斷返回地址是高級用法。我記得在《權威指南》這本書上說藝高人膽大的人會用這種方法。我想那種樂趣應該是可以追求一下的。等手頭這個項目做完,我也要感受那種樂趣
回復

使用道具 舉報

ID:624769 發表于 2023-10-26 20:09 | 顯示全部樓層
鵜鶘 發表于 2023-10-25 16:31
【刪除using 0否則無法返回主函數外中斷0的中斷服務函數】
——實際上不必刪除,只要不使用0且不使用另 ...

Main 函數不一定是 0 區, 要看你Startup 如何設置。

using 號是可以相同的。
在C中 using 號相同 僅僅是降低了效率而已。
在A中 using 號相同 會考驗你保護現場的能力。
回復

使用道具 舉報

ID:397054 發表于 2023-10-25 16:31 | 顯示全部樓層
xianfajushi 發表于 2023-10-25 07:55
這是回復題主的代碼,目的是觀察各中斷及返回用的,可以借鑒理解中斷的作用,我實踐是不會這樣寫的.

【刪除using 0否則無法返回主函數外中斷0的中斷服務函數】
——實際上不必刪除,只要不使用0且不使用另外一個using號就行,即兩個中斷都不能using 0,且不能相同,原理是明了的,main肯定使用的是0區,中斷函數再使用0區肯定破壞了現場,返回是反回了,但現場變了。兩個中斷函數using號相同時只要不嵌套,運行是正常的,一嵌套也不行,原理相同。所以using確實是不必要的,可以都刪除。
回復

使用道具 舉報

ID:155507 發表于 2023-10-25 16:17 | 顯示全部樓層
有免費教學視頻

免費教學視頻《STC USB型 真1T 8051 單片機原理及應用-STC8H8K64U》

第十三集 中斷原理及工作機制一

第十四集 中斷原理及工作機制二
回復

使用道具 舉報

ID:332444 發表于 2023-10-25 07:55 | 顯示全部樓層
這是回復題主的代碼,目的是觀察各中斷及返回用的,可以借鑒理解中斷的作用,我實踐是不會這樣寫的.
  1. #include <REG52.H>
  2. #include "intrins.h"
  3. #define uchar unsigned char
  4. bit K1=0,K2=0;//標記邏輯組合可以替代中斷優先
  5. void Delay(unsigned int i)//延時函數                                       
  6. {      
  7.   unsigned int j;
  8.         for(;i>0;i--)               
  9.         for(j=0;j<125;j++)               
  10.         {;}//空函數                                                                       
  11. }
  12. void main()//主函數https://ask.csdn.net/questions/8011758
  13. {
  14.         unsigned char display [9]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//流水燈顯示數據數組
  15.         unsigned char a;
  16.         EA=1;//總中斷允許
  17.         EX0=1;//允許外部中斷0中斷
  18.         EX1=1;//允許外部中斷1中斷
  19.         IT0=1;//選擇外部中斷0為跳沿觸發方式
  20.         IT1=1;//選擇外部中斷1為跳沿觸發方式
  21.         PX0=0;//外部中斷0為低優先級
  22.         PX1=1;//外部中斷1為高優先級  
  23.         for(;;)               
  24.         {     
  25.                 for(a=0;a<9;a++)               
  26.                 {                                               
  27.                         Delay(400);//延時,切換會延時阻塞設定時間
  28.                         P1=display[a];//已定義的流水燈顯示數據送到P1口
  29.                 }
  30.         }
  31. }
  32. void int0_isr() interrupt 0      //刪除using 0否則無法返回主函數外中斷0的中斷服務函數
  33. {
  34.         unsigned char m=0;
  35.   for(m=0;m<10;m++)//標號為偶數的LED和奇數LED交替閃爍10次
  36.   {
  37.     P1=0x55;//標號為偶數的LED燈點亮
  38.     Delay(500);//延時
  39.         P1=0xaa;//標號為奇數的LED燈點亮
  40.         Delay(500);//延時
  41.   }
  42. }
  43. void int1_isr() interrupt 2      //using 1外中斷1的中斷服務函數,體現了中斷優先和返回
  44. {
  45.     unsigned char n=0;
  46.   for(n=0;n<5;n++)//8位LED全亮全滅5次
  47.   {
  48.     P1=0;//8位LED全亮
  49.         Delay(500);//延時
  50.         P1=0xff;//8位LED全滅
  51.         Delay(500);//延時
  52.   }
  53. }
復制代碼



回復

使用道具 舉報

ID:57657 發表于 2023-10-24 20:39 | 顯示全部樓層
常用中斷有定時器中斷、外部中斷、串口中斷,還有硬件SPI中斷、ADC、LVD、I2C等中斷。
回復

使用道具 舉報

ID:883242 發表于 2023-10-24 17:51 | 顯示全部樓層
用就行了,不需要探索,事實上你也探索不出來什么。
回復

使用道具 舉報

ID:195496 發表于 2023-10-24 17:39 | 顯示全部樓層
暫時中斷循環操作,執行相應的中斷請求,再返回大循環程序中
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表