不合理的地方歡迎批評指正!!!
個人感覺這個博主講的挺全面的,想全面了解協程的小夥伴,可以移步如下鏈結
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...