久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標(biāo)題: 51單片機中斷系統(tǒng)如何返回時不回當(dāng)時離開時的主函數(shù) [打印本頁]

作者: 小臭臭廢    時間: 2023-9-22 20:32
標(biāo)題: 51單片機中斷系統(tǒng)如何返回時不回當(dāng)時離開時的主函數(shù)
求大佬解惑

mmexport1695385900628.png (213.58 KB, 下載次數(shù): 63)

mmexport1695385900628.png

作者: Hephaestus    時間: 2023-9-22 22:38
你不知道在哪里發(fā)生中斷,不返回原地址肯定亂套了,這個問題你永遠解決不了。
作者: 188610329    時間: 2023-9-23 20:49
你通過 SP 找到棧 再到 棧里面  把 入棧的 PC指針 改成 你希望跳轉(zhuǎn)到的地址。 就能不返回 原函數(shù)了。
不過,看你用的是 C51 而不是 A51 估計,做到這點 夠嗆……


作者: 小臭臭廢    時間: 2023-9-23 21:21
188610329 發(fā)表于 2023-9-23 20:49
你通過 SP 找到棧 再到 棧里面  把 入棧的 PC指針 改成 你希望跳轉(zhuǎn)到的地址。 就能不返回 原函數(shù)了。
不過 ...

感謝,我純小白真看不出懂,哈哈看看以后能不能解決了,
作者: Hephaestus    時間: 2023-9-23 21:50
188610329 發(fā)表于 2023-9-23 20:49
你通過 SP 找到棧 再到 棧里面  把 入棧的 PC指針 改成 你希望跳轉(zhuǎn)到的地址。 就能不返回 原函數(shù)了。
不過 ...

那你用A51實現(xiàn)下讓我也樂一樂。
作者: mcza30    時間: 2023-9-24 12:48
Hephaestus 發(fā)表于 2023-9-22 22:38
你不知道在哪里發(fā)生中斷,不返回原地址肯定亂套了,這個問題你永遠解決不了。

這個問題早年51流行的時候就解決了,就是三樓的思路,不過還要加上清除相關(guān)標(biāo)記等操作才能正常跳轉(zhuǎn)。

作者: angmall    時間: 2023-9-24 13:35
我給你來個程序試試。




  1. ;====================================================================
  2. ; Main.asm file generated by New Project wizard
  3. ; Compiler:  ASEM-51 (Proteus)
  4. ;====================================================================

  5. $NOMOD51
  6. $INCLUDE (8051.MCU)

  7. ;====================================================================
  8. ; DEFINITIONS
  9. ;====================================================================

  10. LED1                BIT P1.0
  11. LED2                BIT P1.1
  12. LED3                BIT P1.2
  13. LED4                BIT P1.3

  14. ;====================================================================
  15. ; VARIABLES
  16. ;====================================================================
  17. CNT1                DATA        60H                ;儲存器的絕對地址。
  18. ADDR1                DATA        62H
  19. ADDR2                DATA        64H
  20. ADDR3                DATA        66H
  21. ADDR4                DATA        68H

  22. ;====================================================================
  23. ; RESET and INTERRUPT VECTORS
  24. ;====================================================================

  25.       ; Reset Vector
  26.       org   0000h
  27.       jmp   Start
  28.       ; Timer 0 Vector
  29.       org   000Bh
  30.       jmp   Tim0

  31. ;====================================================================
  32. ; CODE SEGMENT
  33. ;====================================================================

  34.         org   0100h
  35. Start:       
  36.                 USING 0
  37.                 MOV                SP, #40H                ;堆棧指針指向內(nèi)部數(shù)據(jù)存儲器的堆棧區(qū)。
  38. TIMER0_INIT:                                        ;1毫秒@12.000MHz
  39. ;                ANL                AUXR,#7FH                ;定時器時鐘12T模式
  40.                 ANL                TMOD,#0F0H                ;設(shè)置定時器模式
  41.                 ORL                TMOD,#01H                ;設(shè)置定時器模式
  42.                 MOV                TL0,#018H                ;設(shè)置定時初始值
  43.                 MOV                TH0,#0FCH                ;設(shè)置定時初始值
  44.                 CLR                TF0                                ;清除TF0標(biāo)志
  45.                 SETB        TR0                                ;定時器0開始計時
  46.                 SETB         ET0                                ;使能定時器0中斷。
  47.                 SETB         EA                                ;使能中斷總開關(guān)。
  48.                 MOV         DPTR, #L1                ;16位的地址復(fù)制到數(shù)據(jù)指針DPTR寄存器中。
  49.                 MOV         ADDR1, DPH                ;將高八位的地址,復(fù)制到 ADDR1 內(nèi)部RAM的地址。
  50.                 MOV         ADDR1+1, DPL        ;將低八位的地址,復(fù)制到 ADDR1 內(nèi)部RAM的地址。
  51.                 MOV         DPTR, #L2                ;16位的地址復(fù)制到數(shù)據(jù)指針DPTR寄存器中。
  52.                 MOV         ADDR2, DPH                ;將高八位的地址,復(fù)制到 ADDR2 內(nèi)部RAM的地址。
  53.                 MOV         ADDR2+1, DPL        ;將低八位的地址,復(fù)制到 ADDR2 內(nèi)部RAM的地址。
  54.                 MOV         DPTR, #L3                ;16位的地址復(fù)制到數(shù)據(jù)指針DPTR寄存器中。
  55.                 MOV         ADDR3, DPH                ;將高八位的地址,復(fù)制到 ADDR3 內(nèi)部RAM的地址。
  56.                 MOV         ADDR3+1, DPL        ;將低八位的地址,復(fù)制到 ADDR3 內(nèi)部RAM的地址。
  57.                 MOV         DPTR, #L4                ;16位的地址復(fù)制到數(shù)據(jù)指針DPTR寄存器中。
  58.                 MOV         ADDR4, DPH                ;將高八位的地址,復(fù)制到 ADDR4 內(nèi)部RAM的地址。
  59.                 MOV         ADDR4+1, DPL        ;將低八位的地址,復(fù)制到 ADDR4 內(nèi)部RAM的地址。

  60.       ; Write your code here
  61. Loop:
  62.         jmp Loop
  63. L1:                                        ;測試子程序
  64.                 CPL LED1
  65.                 NOP
  66.                 NOP
  67.                 SJMP L1
  68. L2:                                        ;測試子程序
  69.                 CPL LED2
  70.                 NOP
  71.                 NOP
  72.                 NOP
  73.                 SJMP L2

  74. L3:                                        ;測試子程序
  75.                 CPL LED3
  76.                 NOP
  77.                 NOP
  78.                 NOP
  79.                 NOP
  80.                 SJMP L3

  81. L4:                                        ;測試子程序
  82.                 CPL LED4
  83.                 NOP
  84.                 NOP
  85.                 NOP
  86.                 NOP
  87.                 NOP
  88.                 SJMP L4
  89. Tim0:
  90.                 MOV                TL0,#018H                ;設(shè)置定時初始值
  91.                 MOV                TH0,#0FCH                ;設(shè)置定時初始值

  92.                 POP         ACC                                ;之前的調(diào)入地址出棧
  93.                 POP         ACC                                ;丟掉之前的調(diào)入地址
  94.                 MOV         A, CNT1                        ;
  95.                 MOV         R0, #ADDR1+1        ;
  96.                 ADD         A, R0                        ;計算下一個調(diào)入地址。
  97.                 MOV         R0, A                        ;
  98.                 MOV         A, @R0                        ;
  99.                 PUSH         ACC                                ;裝載低位地址入棧
  100.                 MOV         A, CNT1                        ;
  101.                 MOV         R0, #ADDR1                ;
  102.                 ADD         A, R0                        ;
  103.                 MOV         R0, A                        ;
  104.                 MOV         A, @R0                        ;
  105.                 PUSH         ACC                                ;裝載高位地址入棧

  106.                
  107.                 INC         CNT1                        ;計速器遞增
  108.                 INC         CNT1                        ;
  109.                 ANL         CNT1, #07H                ;不要超過7

  110.                 RETI                                        ;中斷返回
  111. ;====================================================================
  112.       END


復(fù)制代碼




作者: lkc8210    時間: 2023-9-25 09:03
各位大佬不用想的太深
這問題想達到的目的只是
"如何在有長時間阻塞式延時的請況下,用外中斷來快速切換模式"
最簡單的方法就是在delay里加跳出判斷
作者: yuxuesuixing    時間: 2023-9-25 09:38
這個問題是屁股決定腦袋,不返回當(dāng)時的函數(shù)要返回到哪里去?那么多現(xiàn)場變量保存了有啥意義?每跳轉(zhuǎn)一次棧就廢棄一堆空間,幾次你棧就溢出了。

問問題就是仔仔細細說,你一句話沒有人能理解你的用意。我用通俗的方式描述你的問題:如何把胳膊卸下來,然后進這個洞離去
作者: 18680365301    時間: 2023-9-25 10:23
yuxuesuixing 發(fā)表于 2023-9-25 09:38
這個問題是屁股決定腦袋,不返回當(dāng)時的函數(shù)要返回到哪里去?那么多現(xiàn)場變量保存了有啥意義?每跳轉(zhuǎn)一次棧就 ...

多任務(wù)就是不能返回到之前的函數(shù)
作者: 人中狼    時間: 2023-9-25 10:35
多任務(wù)應(yīng)該還是回到分配任務(wù)的函數(shù),否則代碼是會跑飛的,樓主這是想要做類似操作系統(tǒng)的東西,但是又似乎是不要受到任何約束,任何代碼的跳轉(zhuǎn)本身就是因為約束條件而跳轉(zhuǎn)的,這等于是吃著大米長大,然后說從未吃過大米
作者: 188610329    時間: 2023-9-25 19:34
Hephaestus 發(fā)表于 2023-9-22 22:38
你不知道在哪里發(fā)生中斷,不返回原地址肯定亂套了,這個問題你永遠解決不了。

本次不返回,不代表永遠不返回,你覺得肯定會亂套,是因為局限于你的能力,你要是有掌握和規(guī)劃全局的能力,就能讓它亂不起來,那么也就不會這么以為了……
先給自己充充電,再來捉摸這個問題吧。這么武斷用上 永遠   絕對  這些詞的習(xí)慣,你該改改了,除了暴露你知識的局限性,給你帶不來任何好處。

作者: 188610329    時間: 2023-9-25 19:40
Hephaestus 發(fā)表于 2023-9-23 21:50
那你用A51實現(xiàn)下讓我也樂一樂。

我能說出A51能實現(xiàn),自然是可以實現(xiàn)的,但是……,憑什么給你看? 還是讓你“樂一樂”?
俗話說得好,教你是把錢塞你口袋里,你早就把我得罪死了。你覺得我是圣人么? 以德報怨?
有些白眼狼養(yǎng)不熟的,我相信我就算把錢賽你口袋里,你不但不記好,還會變本加厲,所以……  呵呵,長得不怎么樣,就不要想得美了。
作者: 小臭臭廢    時間: 2023-10-5 18:12
lkc8210 發(fā)表于 2023-9-25 09:03
各位大佬不用想的太深
這問題想達到的目的只是
"如何在有長時間阻塞式延時的請況下,用外中斷來快速切換 ...

知己難得




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 在线不卡av| 一二三四区在线观看 | 国产激情网站 | 黄色大片av | 日韩精品观看 | 成年人午夜视频 | 免费午夜视频 | 午夜看看 | 久久99视频 | 国产精品嫩草影院桃色 | 欧美日韩亚洲天堂 | 日本成人黄色 | 免费av网址在线观看 | 青青青草视频 | 精品蜜桃一区二区三区 | 亚洲国产精品久久久久 | 国产一级一片免费播放放a 男男成人高潮片免费网站 精品视频在线观看 | 亚洲在线播放 | 成人小视频在线 | 亚洲视频免费看 | 在线观看黄网站 | 久久久久成人网 | 久久99九九 | 美日韩一区二区三区 | av2014天堂网| 一级毛片黄色 | 免费在线播放av | 国产精品成人免费视频 | 密乳av | 青青综合| 日韩一区二区视频在线观看 | 国产视频福利 | 久久精品日韩 | 国产精品欧美在线 | 亚洲免费视频观看 | 日韩视频一区 | 99一区二区 | 中文字幕国产在线 | 91亚洲成人 | 99热在线播放 | 国产精品二区一区二区aⅴ污介绍 |