我正在開發基於ARM Cortex M3的微控制器上運行的嵌入式項目。我們供應商提供的一些代碼使用延遲功能,設置內置硬件定時器,然後旋轉直到定時器到期。通常用於等待1到幾百微秒。這些延遲幾乎是因爲他們在等待一些寄存器,芯片或總線來完成一個動作,並且需要等待至少給定的微秒數。硬件計時器的開銷似乎至少需要6微秒才能完成設置。ARM嵌入式延遲硬件定時器與CPU週期計數器
在多線程環境中,這是一個問題,因爲有N個線程,但只有1個硬件定時器。我可以禁止中斷,而定時器正在使用,以防止上下文切換,因此競爭條件,但它似乎有點難看。我想用一個使用ARM CPU週期計數器(CCNT)的函數替換使用硬件定時器的函數。我是否缺少缺陷或其他選擇?很明顯,週期計數器功能要求將其調整到適當的CPU頻率,這對我們的系統來說永遠不會改變,但我想可以在使用硬件定時器以編程方式引導時檢測到。
哪種ARM M3有單個硬件定時器?你說你有一個多線程環境,所以調度器的計時器是必需的:你是否說你唯一的計時器是分配給調度器的計時器? – LPs
實際上有2個硬件定時器,還有一個系統時鐘中斷,每隔1毫秒觸發一次。系統滴答中斷不是一個計時器,你不能查詢已經過了多少時間,你只需要每1毫秒獲取一次中斷,這通常用於通知搶先調度器。 1毫秒的分辨率對於我感興趣的延遲來說也太長了。 – satur9nine
對於現代MCU來說,忙碌的這麼長時間是一個非常糟糕的方法。如果他們使用這樣的東西,我會懷疑其餘的質量.. – Olaf