乾貨|小論定時器玩法(時間輪詢法)

經常來說,對於一些不復雜的單片機應用,而且對於內存和存儲要求比較嚴格,又需要多分時去處理一些指定的任務,在無法使用RTOS的情況下,使用一個硬件定時器,來建立各種任務時間標誌位,是比較通用的做法,但是隨著時間標誌位變量的增加,代碼的維護以及簡潔度卻越來越艱難。

因此,樓主使用了一種類似線程管理的時間輪詢方式(可能用詞不當),來進行一個硬件定時器模擬多個軟件定時器(以下就說明為線程吧),支持線程註冊、註銷、掛起、喚醒、處理等接口。在使用上,只需要引用兩個接口,即可開始工作。 先說明下此接口文件的頭文件的一些變量,THREAD_NUM_MAX是指能支持最大的線程數目,理論上可以達到四個字節長度數目。使用時候先初始化線程Thread_Init,然後把Thread_RunCheck放在硬件定時器上1ms查詢一次當作時鐘基準,然後Thread_Process放於while裡面輪詢查找線程標誌。需要定時運行某個任務時候(函數),在進入while裡面之前使用註冊函數Thread_Login即可。主要退出這個函數使用Thread_Logout即可。下面會舉個example來說明這些接口的使用。

乾貨|小論定時器玩法(時間輪詢法)

接下來簡單介紹下一些接口的實現。源碼會放於附件,具體的可以自行分析理解。

首先來說明下兩個結構體定義。首先第一個結構體是對線程狀態封裝,包括線程運行標識flag,當定時輪詢到這個線程此標誌位會置位,運行條件con包括單次執行運行條件,也就是說此線程只執行一次,還有多次執行條件,永久執行條件。此些條件在頭文件的枚舉定義。運行次數表示執行的次數,但為永久執行條件,此cnt賦值為0即可。frep為運行週期,即是多少毫秒運行一次,fun是線程函數的指針。thread_manage結構體是線程管理結構體,裡面包含當前線程運行數和掛起數。在這裡我們申請下一個靜態線程管理實例變量。static struct thread_manage thread;所有的線程狀態變量都在這裡。

乾貨|小論定時器玩法(時間輪詢法)

大概說明下線程是如何一個一個輪詢執行的。主要在Thread_Process接口裡面。

乾貨|小論定時器玩法(時間輪詢法)

同樣再來分析下線程註冊接口,這是在初始化的時候需要用到。

乾貨|小論定時器玩法(時間輪詢法)

線程運行條件核對,放在於1ms的硬件定時器中斷或者回調中,以此輪詢查找線程運行週期狀態是否滿足。

乾貨|小論定時器玩法(時間輪詢法)

在這裡使用的是nucle-L011板子,利用cube生成代碼工程。使用兩個外設,GPIO(LED)和usart,在這裡我們新建兩個線程,一個500ms點燈,一個1s串口發送數據。

乾貨|小論定時器玩法(時間輪詢法)

生成的cube代碼在tim.c文件上,開啟定時器中斷,並且寫上自己的回調函數。

乾貨|小論定時器玩法(時間輪詢法)

寫好自己的線程函數

乾貨|小論定時器玩法(時間輪詢法)

初始化以及註冊線程。

乾貨|小論定時器玩法(時間輪詢法)

以上圖文內容均轉載自訂閱號:電子工程世界(微信搜索 eeworldbbs 關注)

歡迎微博@EEWORLD

如果您也寫過此類原創乾貨歡迎將您的原創發至:[email protected],一經入選,我們將幫你登上頭條!

與更多行業內網友進行交流請登陸EEWorld論壇。


分享到:


相關文章: