單片機應用程序架構-時間片輪詢法

單片機應用程序框架時間片輪詢法的學習。

根據所見的,學的,看的。大致分爲三類程序結構。
1. 簡單的前後臺順序執行程序。
2. 時間片輪詢法。
3. 操作系統。

簡單的順序執行的程序,寫起來往往很混亂。越複雜的需求程序,完成需求的時間會更多,質量也並不好,bug也會越多,導致程序一直不能讓自己滿意。
爲此我們需要用某個東西去管理我們的mcu中的執行邏輯。也就很容易想到用時間這條線去管理我們的邏輯。

首先我們需要構建一個結構體數據類型去管理任務

typedef struct
{
	void(*task_func)(void);   //函數指針
	uint16_t interval_time;	  //執行時間間隔
	uint16_t run_timer;		  //倒計時器
	uint8_t	 run_sign;        //程序運行標誌
} schedule_task_t;

我們還得有任務

void task_1(void)
{
	printf("我是任務1");
}
void task_2(void)
{
	printf("我是任務2");;
}
void task_3(void)
{
	printf("我是任務3");;
}

然後定義一個結構體,創建任務管理配置

//創建任務配置
static schedule_task_t schedule_task[] =
{
	{task_1, 20, 20, 0}     //task_1(函數名) 20 (執行週期) 20(計時器) 0(任務執行標誌)
	{task_2, 10, 10, 0},
	{task_3, 5,  5, 0}			
};

當然我們要知道任務數量,可以根據數組長度去判斷

//根據數組長度,判斷任務數量
#define TASK_NUM (sizeof(schedule_task)/sizeof(schedule_task_t))

我們需要一個定時器中斷資源去計時。讓這個定時器來管理我們的任務。所以我們需要在中斷中去判斷查詢任務標誌。

// 在中斷中調用次函數判斷任務標誌
void task_interrupt(void)
{
	uint8_t index = 0;
	
	// 循環判斷
	for (index = 0; index < TASK_NUM; index++)
	{
		// 判斷計時器是否到時間
		if (schedule_task[index].run_timer)    //不爲0
		{
			// 計時器減1
			schedule_task[index].run_timer--;
			//判斷計時器是否到時間
			if (0 == schedule_task[index].run_timer)
			{
				// 恢復倒計時器的時間
				schedule_task[index].run_timer = schedule_task[index].interval_time;  
				// 任務標誌置1
				schedule_task[index].run_sign = 1;
			}
		}	
	}
}

任務的週期由定時器去判斷,管理。我們只需要在主循環中判斷有無任務標誌,然後執行它即可。

void task_process(void)
{
	uint8_t index = 0;
	
	// 循環判斷任務
	for (index = 0; index < TASK_NUM; index++)
	{
		if (schedule_task[index].run_sign)
		{
			// 清除任務標誌
			schedule_task[index].run_sign = 0; 
			// 使用函數指針,執行任務,
			schedule_task[index].task_func();
		}
	}
}
void main(void)
{
	for (;;)
	{
		task_process();
	}
}

這樣就很方便的管理了我們的邏輯。也很好的理清我們的邏輯。不管移植還是需求的改動我們也很方便的去添加。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章