簡體   English   中英

等待信號時避免忙等待

[英]Avoid Busy waiting when waiting for a signal

我正在嘗試編寫一個可以輕松移植到任何 MCU 的代碼。 該 MCU 將充當主機並與另一個音頻編解碼器芯片通信。 與芯片通信時,主機MCU會向芯片寫入請求,並等待中斷線使go為高電平,然后讀取芯片的響應。

目前,我使用 Raspberry Pi 作為主機,因此我可以poll中斷線的sysfs條目。 如何在可能沒有poll方法的原始系統中實現這一點。 我在想我可以在中斷 ISR 中更新一個全局變量並反復檢查這個全局變量。 這就是我想要避免的問題。 主程序循環本身可能會從 Timer 中斷處理程序之一調用,而忙等待可能不是一個好的選擇。

有任何想法嗎?

一種尺寸適合所有人,沒有人適合。 特別是在空間有限的 mcus 中,使通用的一種尺寸適合所有庫。 所以請謹慎行事。

每個 mcu 都不同,它們處理數據移動的方式各不相同,有些有緩沖區,有些有 dma 等。人們會期望在設計中可能會出現中斷,但並不是每個人都想做。

您留下了大量的系統信息,聽起來這是一個外部編解碼器芯片,但“響應”是什么意思。 大多數 MCU 可以處理導致中斷的 gpio 輸入上升沿或電平,但您沒有描述編解碼器芯片的接口,如果它是 i2c 或 spi 之類的通用接口,您正在移動什么樣的數據以及結果如何每個單片機都處理這個問題,這當然是品牌和系列特定的,充其量很難制作一個通用(而不是臃腫)的庫。

如果有庫需要專注於回調和處理功能,庫絕不應該關心數據的中斷或移動,用戶提供它,庫反而專注於數據。 最壞的情況庫有 function 調用它使用戶填寫實現事物,發送命令,發送數據,接收數據,等待事件等。

如果這是 i2c,那么確保您也可以使用 bit bang 庫,並擁有一個通用的驅動高、驅動低、浮點輸入、讀取輸入、延遲半周期等列表,等待事件,然后實現rest。 (好吧,您也可以使用 bit-bang spi 並且獨立於 mcu 類型)。

通常,微控制器有多種低功耗“睡眠模式”。 每種睡眠模式都有不同的仍在運行的事物組合以及可以喚醒微控制器的不同事物組合。 例如,在一種模式下,您可以讓 SPI 外圍設備傳輸數據,並通過中斷喚醒,因此您可以給它一些數據以進行傳輸,然后進入睡眠模式,直到它完成。 不同的模式可能會關閉除 GPIO 引腳之外的所有外設。 不同的模式可能會關閉一切,只讓微控制器被復位引腳喚醒。

由於您的代碼旨在移植到任何微控制器,因此您不能假設哪些睡眠模式可用。 但是您可以編寫一個帶有可選睡眠的忙等待循環,如下所示:

setUpInterrupt();
while(!interruptHappened) {
    enterAppropriateSleepModeIfAvailable(); // the person who ports the code implements this
}

如果微控制器沒有適當的睡眠模式,搬運工將使其進入適當睡眠模式如果enterAppropriateSleepModeIfAvailable不做任何事情,這將是一個忙等待。 否則,它將等待中斷發生。

如果中斷發生在while(!interruptHappened)之后但enterAppropriateSleepModeIfAvailable()之前,請確保微控制器仍然喚醒 - 並且不會陷入睡眠模式。

你可以嘗試信號量、互斥體、鎖、監視器。 鎖、互斥、信號量……有什么區別? 這將告訴您它們之間的基本區別。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM