软件架构之时间轮片法_第1页
软件架构之时间轮片法_第2页
软件架构之时间轮片法_第3页
软件架构之时间轮片法_第4页
软件架构之时间轮片法_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

程序架构重要性很多人尤其是初学者在写代码的时候往往都是想一点写一点,最开始没有一个整体的规划,导致后面代码越写越乱,bug不断。最终代码跑起来看似没有问题(有可能也真的没有问题),但是要加一个功能的时候会浪费大量的时间,甚至导致整个代码的崩溃。所以,在一个项目开始的时候多花一些时间在代码的架构设计上是十分有必要的。代码架构确定好了之后你会发现敲代码的时候会特别快,并且在后期调试的时候也不会像无头苍蝇一样胡乱找问题。当然,调试也是一门技术。在学习实时操作系统的过程中,发现实时操作系统框架与个人的业务代码之间的耦合性就非常低,都是只需要将业务代码通过一定的接口函数注册好后就交给操作系统托管了,十分方便。但是操作系统的调度过于复杂,这里就使用操作系统的思维方式来重构这个时间片轮询框架。实现该框架的完全解耦,用户只需要包含头文件,并且在使用过程中不需要改动已经写好的库文件。Demo首先来个demo,该demo是使用电脑开两个线程:一个线程模拟单片机的定时器中断产生时间片轮询个时钟,另一个线程则模拟主函数中一直运行的时间片轮询调度程序。#include<thread>#include<stdio.h>#include<windows.h>#include"timeslice.h"//创建5个任务对象TimesilceTaskObjtask_1,task_2,task_3,task_4,task_5;//具体的任务函数voidtask1_hdl(){printf(">>task1isrunning...\n");}voidtask2_hdl(){printf(">>task2isrunning...\n");}voidtask3_hdl(){printf(">>task3isrunning...\n");}voidtask4_hdl(){printf(">>task4isrunning...\n");}voidtask5_hdl(){printf(">>task5isrunning...\n");}//初始化任务对象,并且将任务添加到时间片轮询调度中voidtask_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);}//开两个线程模拟在单片机上的运行过程voidtimeslice_exec_thread(){while(true){timeslice_exec();}}voidtimeslice_tick_thread(){while(true){timeslice_tick();Sleep(10);}}intmain(){task_init();printf(">>tasknum:%d\n",timeslice_get_task_num());printf(">>tasklen:%d\n",timeslice_get_task_timeslice_len(&task_3));timeslice_task_del(&task_2);printf(">>delettask2\n");printf(">>task2isexist:%d\n",timeslice_task_isexist(&task_2));printf(">>tasknum:%d\n",timeslice_get_task_num());timeslice_task_del(&task_5);printf(">>delettask5\n");printf(">>tasknum:%d\n",timeslice_get_task_num());printf(">>task3isexist:%d\n",timeslice_task_isexist(&task_3));timeslice_task_add(&task_2);printf(">>addtask2\n");printf(">>task2isexist:%d\n",timeslice_task_isexist(&task_2));timeslice_task_add(&task_5);printf(">>addtask5\n");printf(">>tasknum:%d\n",timeslice_get_task_num());printf("\n\n========timeslicerunning===========\n");std::threadthread_1(timeslice_exec_thread);std::threadthread_2(timeslice_tick_thread);thread_1.join();thread_2.join();return0;}运行结果如下:由以上例子可见,这个框架使用十分方便,甚至可以完全不知道其原理,仅仅通过几个简单的接口就可以迅速创建任务并加入到时间片轮询的框架中,十分好用。时间片轮询架构其实该部分主要使用了面向对象的思维,使用结构体作为对象,并使用结构体指针作为参数传递,这样作可以节省资源,并且有着极高的运行效率。其中最难的部分是侵入式链表的使用,这种链表在一些操作系统内核中使用十分广泛,这里是参考RT-Thread实时操作系统中的侵入式链表实现。h文件:#ifndef_TIMESLICE_H#define_TIMESLICE_H#include"./list.h"typedefenum{TASK_STOP,TASK_RUN}IsTaskRun;typedefstructtimesilce{unsignedintid;void(*task_hdl)(void);IsTaskRunis_run;unsignedinttimer;unsignedinttimeslice_len;ListObjtimeslice_task_list;}TimesilceTaskObj;voidtimeslice_exec(void);voidtimeslice_tick(void);voidtimeslice_task_init(TimesilceTaskObj*obj,void(*task_hdl)(void),unsignedintid,unsignedinttimeslice_len);voidtimeslice_task_add(TimesilceTaskObj*obj);voidtimeslice_task_del(TimesilceTaskObj*obj);unsignedinttimeslice_get_task_timeslice_len(TimesilceTaskObj*obj);unsignedinttimeslice_get_task_num(void);unsignedchartimeslice_task_isexist(TimesilceTaskObj*obj);#endifc文件:#include"./timeslice.h"staticLIST_HEAD(timeslice_task_list);voidtimeslice_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;}}}voidtimeslice_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;}}}}unsignedinttimeslice_get_task_num(){returnlist_len(×lice_task_list);}voidtimeslice_task_init(TimesilceTaskObj*obj,void(*task_hdl)(void),unsignedintid,unsignedinttimeslice_len){obj->id=id;obj->is_run=TASK_STOP;obj->task_hdl=task_hdl;obj->timer=timeslice_len;obj->timeslice_len=timeslice_len;}voidtimeslice_task_add(TimesilceTaskObj*obj){list_insert_before(×lice_task_list,&obj->timeslice_task_list);}voidtimeslice_task_del(TimesilceTaskObj*obj){if(timeslice_task_isexist(obj))list_remove(&obj->timeslice_task_list);elsereturn;}unsignedchartimeslice_task_isexist(TimesilceTaskObj*obj){unsignedcharisexist=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;}returnisexist;}unsignedinttimeslice_get_task_timeslice_len(TimesilceTaskObj*obj){returnobj->timeslice_len;}底层侵入式双向链表h文件:#ifndef_LIST_H#define_LIST_H#defineoffset_of(type,member)(unsignedlong)&((type*)0)->member#definecontainer_of(ptr,type,member)((type*)((char*)(ptr)-offset_of(type,member)))typedefstructlist_structure{structlist_structure*next;structlist_structure*prev;}ListObj;#defineLIST_HEAD_INIT(name){&(name),&(name)}#defineLIST_HEAD(name)ListObjname=LIST_HEAD_INIT(name)voidlist_init(ListObj*list);voidlist_insert_after(ListObj*list,ListObj*node);voidlist_insert_before(ListObj*list,ListObj*node);voidlist_remove(ListObj*node);intlist_isempty(constListObj*list);unsignedintlist_len(constListObj*list);#definelist_entry(node,type,member)\container_of(node,type,member)#definelist_for_each(pos,head)\for(pos=(head)->next;pos!=(head);pos=pos->next)#definelist_for_each_safe(pos,n,head)\for(pos=(head)->next,n=pos->next;pos!=(head);\pos=n,n=pos->next)#endifc文件:#include"list.h"voidlist_init(ListObj*list){list->next=list->prev=list;}voidl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论