Ultra96 PYNQ入門之三 中斷與協程

2021-10-06 08:48:21 字數 4036 閱讀 7970

不合理的地方歡迎批評指正!!!

個人感覺這個博主講的挺全面的,想全面了解協程的小夥伴,可以移步如下鏈結

asyncio 學習筆記:基本用法

asyncio 學習筆記:呼叫定時函式

asyncio 學習筆記:併發執行 task

asyncio 學習筆記:產生非同步結果

asyncio 學習筆記:控制組合式 coroutines

asyncio 學習筆記:同步原語

asyncio 學習筆記:使用抽象類 protocol 實現非同步 i/o

如不想全面性了解協程這個東西,可以看下我的簡練的總結,可以看懂如下的實驗,只不過沒法進一步個性化設計。

完成協程直至返回return_value = start_loop.run_until_complete(button_led())協程中等待await button_inter.wait_for_value_async(1),等待屬於非同步操作,並不占用cpu。可以建立多個協程,相應多個中斷,這個會在後面提及。

注:目前個人感覺協程這個東西,和裸機開發中的中斷還是有區別的,屬於軟體排程的中斷?效率不咋高,所以千萬不要在1秒內相應上千個中斷,否則你會發現中斷執行的時間還沒有中斷觸發的時間延遲長呢。

很簡單的乙個設計,可以在vivado中的tcl控制台通過如下命令,進行快速重建

button、led均用口袋儀器**

中斷控制器這裡,僅實驗了預設的高電平中斷,小夥伴可以嘗試邊沿中斷,來進行實驗

軟體**如下

import time

from pynq import overlay

import asyncio

gpio_inter_design = overlay(

"./data/3.axi_gpio_interrupt.bit"

)button_inter = gpio_inter_design.axi_gpio_0.input( parent=gpio_inter_design.axi_gpio_0.channel1,

start=

0, stop=1)

led = gpio_inter_design.axi_gpio_0.output( parent=gpio_inter_design.axi_gpio_0.channel2,

start=

0, stop=1)

async

defbutton_led()

:for i in

range(10

):start = time.time(

)await button_inter.wait_for_value_async(1)

led.toggle(

) end = time.time(

)print

("中斷的週期 :{}s"

.format

(end -start)

)

start_loop = asyncio.get_event_loop(

)return_value = start_loop.run_until_complete(button_led(

))

button利用訊號發生器模擬,1hz、1.8v、5%的脈衝波

實驗的結果慘不忍睹

中斷的週期 :0.6854667663574219s

中斷的週期 :6.651878356933594e-05s

中斷的週期 :5.888938903808594e-05s

中斷的週期 :5.817413330078125e-05s

中斷的週期 :5.888938903808594e-05s

中斷的週期 :5.745887756347656e-05s

中斷的週期 :5.745887756347656e-05s

中斷的週期 :5.793571472167969e-05s

中斷的週期 :5.817413330078125e-05s

中斷的週期 :5.8650970458984375e-05s

分析原因

中斷控制器採用了預設的高電平中斷,即使中斷之後清除中斷,由於是高電平觸發,中斷控制器仍然定義發生了中斷。

import time

from pynq import overlay

import asyncio

gpio_inter_design = overlay(

"./data/3.axi_gpio_interrupt.bit")

button_inter = gpio_inter_design.axi_gpio_0.input( parent=gpio_inter_design.axi_gpio_0.channel1,

start=

0, stop=1)

led = gpio_inter_design.axi_gpio_0.output( parent=gpio_inter_design.axi_gpio_0.channel2,

start=

0, stop=1)

async

defbutton_led()

:for i in

range(10

):start = time.time(

)await button_inter.wait_for_value_async(1)

led.toggle(

)await asyncio.sleep(

0.05

) end = time.time(

)print

("中斷的週期 :{}s"

.format

(end -start)

)

start_loop = asyncio.get_event_loop(

) return_value = start_loop.run_until_complete(button_led(

))

使用await asyncio.sleep(0.05)跳過高電平脈衝時間,即可正確的產生中斷。

中斷的週期 :0.1248316764831543s

中斷的週期 :0.9994022846221924s

中斷的週期 :0.9997074604034424s

中斷的週期 :0.9996352195739746s

中斷的週期 :0.999701738357544s

中斷的週期 :0.9996013641357422s

中斷的週期 :0.9996085166931152s

中斷的週期 :1.0001087188720703s

中斷的週期 :0.9996082782745361s

中斷的週期 :0.9993538856506348s

同樣button利用訊號發生器模擬,1hz、1.8v、5%的脈衝波,邏輯分析儀測試結果如下

這裡僅演示了單高電平觸發的中斷,嘗試利用協程實現多中斷,充分利用cpu。

原創不易,嚴禁剽竊!

ExtJS入門之三 查詢

在web開發中,對htmldom進行查詢是必不可少的,extjs提供了高效能的查詢功能,支援css3選擇器 selector 查詢和基本的xpath查詢。extjs的查詢對xml和html均成立 看下面的html divid mydiv input type checkbox value 1 inp...

ExtJS入門之三 查詢

在web開發中,對htmldom進行查詢是必不可少的,extjs提供了高效能的查詢功能,支援css3選擇器 selector 查詢和基本的xpath查詢。extjs的查詢對xml和html均成立 看下面的html divid mydiv input type checkbox value 1 inp...

lua入門之三module

1 模組與包23 定義乙個名為 module 的模組 4module 56 module.consta 這是乙個常量 7 8function module func1 9io.write func1共有函式 n 10end 1112 local function func2 13io.write f...