EEWORLD
電子資訊 犀利解讀
技術乾貨 每日更新
經常來說,對於一些不複雜的單片機應用,而且對於內存和存儲要求比較嚴格,又需要多分時去處理一些指定的任務,在無法使用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;所有的線程狀態變量都在這裡。
生成的cube代碼在tim.c文件上,開啟定時器中斷,並且寫上自己的回調函數。
寫好自己的線程函數
初始化以及註冊線程。
以下微信公眾號均屬於
EEWorld(www.eeworld.com.cn)
歡迎長按二維碼關注!
EEWorld訂閱號:電子工程世界
EEWorld服務號:電子工程世界福利社