單片機應用程序框架時間片輪詢法的學習。
根據所見的,學的,看的。大致分爲三類程序結構。
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();
}
}
這樣就很方便的管理了我們的邏輯。也很好的理清我們的邏輯。不管移植還是需求的改動我們也很方便的去添加。