一種面向?qū)ο笏季S的單片機(jī)程序框架
關(guān)注、星標(biāo)公眾號(hào),直達(dá)精彩內(nèi)容
來(lái)源:網(wǎng)絡(luò)素材
大家好,單片機(jī)編碼中稍不注意就會(huì)陷入一種混沌狀態(tài),函數(shù)、變量、文件分類用的多了就會(huì)亂了,對(duì)初學(xué)者尤其如此,實(shí)現(xiàn)功能是簡(jiǎn)單的,但是讓程序變得可移植性好,一目了然,架構(gòu)清晰才是進(jìn)階必經(jīng)之路,今天分享一篇單片機(jī)程序框架的文章,希望對(duì)大家有幫助。
程序架構(gòu)重要性
Demo
// 創(chuàng)建5個(gè)任務(wù)對(duì)象TimesilceTaskObj task_1, task_2, task_3, task_4, task_5;// 具體的任務(wù)函數(shù)void task1_hdl(){printf(">> task 1 is running ...\n");}void task2_hdl(){printf(">> task 2 is running ...\n");}void task3_hdl(){printf(">> task 3 is running ...\n");}void task4_hdl(){printf(">> task 4 is running ...\n");}void task5_hdl(){printf(">> task 5 is running ...\n");}// 初始化任務(wù)對(duì)象,并且將任務(wù)添加到時(shí)間片輪詢調(diào)度中void task_init(){timeslice_task_init(&task_1, task1_hdl, 1, 10);timeslice_task_init(&task_2, task2_hdl, 2, 20);timeslice_task_init(&task_3, task3_hdl, 3, 30);timeslice_task_init(&task_4, task4_hdl, 4, 40);timeslice_task_init(&task_5, task5_hdl, 5, 50);timeslice_task_add(&task_1);timeslice_task_add(&task_2);timeslice_task_add(&task_3);timeslice_task_add(&task_4);timeslice_task_add(&task_5);}// 開(kāi)兩個(gè)線程模擬在單片機(jī)上的運(yùn)行過(guò)程void timeslice_exec_thread(){while (true){timeslice_exec();}}void timeslice_tick_thread(){while (true){timeslice_tick();Sleep(10);}}int main(){task_init();printf(">> task num: %d\n", timeslice_get_task_num());printf(">> task len: %d\n", timeslice_get_task_timeslice_len(&task_3));timeslice_task_del(&task_2);printf(">> delet task 2\n");printf(">> task 2 is exist: %d\n", timeslice_task_isexist(&task_2));printf(">> task num: %d\n", timeslice_get_task_num());timeslice_task_del(&task_5);printf(">> delet task 5\n");printf(">> task num: %d\n", timeslice_get_task_num());printf(">> task 3 is exist: %d\n", timeslice_task_isexist(&task_3));timeslice_task_add(&task_2);printf(">> add task 2\n");printf(">> task 2 is exist: %d\n", timeslice_task_isexist(&task_2));timeslice_task_add(&task_5);printf(">> add task 5\n");printf(">> task num: %d\n", timeslice_get_task_num());printf("\n\n========timeslice running===========\n");std::thread thread_1(timeslice_exec_thread);std::thread thread_2(timeslice_tick_thread);thread_1.join();thread_2.join();return 0;}
運(yùn)行結(jié)果如下:

時(shí)間片輪詢架構(gòu)
其實(shí)該部分主要使用了面向?qū)ο蟮乃季S,使用結(jié)構(gòu)體作為對(duì)象,并使用結(jié)構(gòu)體指針作為參數(shù)傳遞,這樣作可以節(jié)省資源,并且有著極高的運(yùn)行效率。
typedef enum {TASK_STOP,TASK_RUN} IsTaskRun;typedef struct timesilce{unsigned int id;void (*task_hdl)(void);IsTaskRun is_run;unsigned int timer;unsigned int timeslice_len;ListObj timeslice_task_list;} TimesilceTaskObj;void timeslice_exec(void);void timeslice_tick(void);void timeslice_task_init(TimesilceTaskObj* obj, void (*task_hdl)(void), unsigned int id, unsigned int timeslice_len);void timeslice_task_add(TimesilceTaskObj* obj);void timeslice_task_del(TimesilceTaskObj* obj);unsigned int timeslice_get_task_timeslice_len(TimesilceTaskObj* obj);unsigned int timeslice_get_task_num(void);unsigned char timeslice_task_isexist(TimesilceTaskObj* obj);
static LIST_HEAD(timeslice_task_list);void timeslice_exec(){ListObj* node;TimesilceTaskObj* task;list_for_each(node, ×lice_task_list){task = list_entry(node, TimesilceTaskObj, timeslice_task_list);if (task->is_run == TASK_RUN){task->task_hdl();task->is_run = TASK_STOP;}}}void timeslice_tick(){ListObj* node;TimesilceTaskObj* task;list_for_each(node, ×lice_task_list){task = list_entry(node, TimesilceTaskObj, timeslice_task_list);if (task->timer != 0){task->timer--;if (task->timer == 0){task->is_run = TASK_RUN;task->timer = task->timeslice_len;}}}}unsigned int timeslice_get_task_num(){return list_len(×lice_task_list);}void timeslice_task_init(TimesilceTaskObj* obj, void (*task_hdl)(void), unsigned int id, unsigned int timeslice_len){obj->id = id;obj->is_run = TASK_STOP;obj->task_hdl = task_hdl;obj->timer = timeslice_len;obj->timeslice_len = timeslice_len;}void timeslice_task_add(TimesilceTaskObj* obj){list_insert_before(×lice_task_list, &obj->timeslice_task_list);}void timeslice_task_del(TimesilceTaskObj* obj){if (timeslice_task_isexist(obj))list_remove(&obj->timeslice_task_list);elsereturn;}unsigned char timeslice_task_isexist(TimesilceTaskObj* obj){unsigned char isexist = 0;ListObj* node;TimesilceTaskObj* task;list_for_each(node, ×lice_task_list){task = list_entry(node, TimesilceTaskObj, timeslice_task_list);if (obj->id == task->id)isexist = 1;}return isexist;}unsigned int timeslice_get_task_timeslice_len(TimesilceTaskObj* obj){return obj->timeslice_len;}
底層侵入式雙向鏈表
typedef struct list_structure{struct list_structure* next;struct list_structure* prev;} ListObj;void list_init(ListObj* list);void list_insert_after(ListObj* list, ListObj* node);void list_insert_before(ListObj* list, ListObj* node);void list_remove(ListObj* node);int list_isempty(const ListObj* list);unsigned int list_len(const ListObj* list);container_of(node, type, member)for (pos = (head)->next; pos != (head); pos = pos->next)for (pos = (head)->next, n = pos->next; pos != (head); \pos = n, n = pos->next)
#include "list.h"void list_init(ListObj* list){list->next = list->prev = list;}void list_insert_after(ListObj* list, ListObj* node){list->next->prev = node;node->next = list->next;list->next = node;node->prev = list;}void list_insert_before(ListObj* list, ListObj* node){list->prev->next = node;node->prev = list->prev;list->prev = node;node->next = list;}void list_remove(ListObj* node){node->next->prev = node->prev;node->prev->next = node->next;node->next = node->prev = node;}int list_isempty(const ListObj* list){return list->next == list;}unsigned int list_len(const ListObj* list){unsigned int len = 0;const ListObj* p = list;while (p->next != list){p = p->next;len++;}return len;}
本文來(lái)源網(wǎng)絡(luò),版權(quán)歸原作者所有。如涉及作品版權(quán)問(wèn)題,請(qǐng)聯(lián)系我進(jìn)行刪除。
???????????????? END ???????????????? 關(guān)注我的微信公眾號(hào),回復(fù)“加群”按規(guī)則加入技術(shù)交流群。
點(diǎn)擊“閱讀原文”查看更多分享,歡迎點(diǎn)分享、收藏、點(diǎn)贊、在看。
評(píng)論
圖片
表情
