《MCU面向对象思维的架构.docx》由会员分享,可在线阅读,更多相关《MCU面向对象思维的架构.docx(13页珍藏版)》请在第壹文秘上搜索。
1、程序架构重要性很多人尤其是初学者在写代码的时候往往都是想一点写一点,最开始没有一个整体的规划,导致后面代码越写越乱,bug不断.最终代码跑起来看似没有问题(有可能也真的没有问题),但是要加一个功能的时候会浪筑大量的时间,甚至导致整个代码的崩渍。所以,在一个项目开始的时候多花一些时间在代码的架构设计上是十分有必要的.代码架构确定好之后你会发现敲代码的时候会特别快,并且在后期调忒的时候也不会像无头苍蝇一样胡乱找问题。当然,调试也是一门技术。在学习实时操作系统的过程中,发现实时操作系统框架与个人的业务代码之间的耦合性就非常低,都是只需要将业务代码通过一定的接口函数注册好后就交给操作系统托管了,十分方
2、便。但是操作系统的调度过于复杂,这里就使用操作系统的思维方式来重构这个时间片轮询框架。实现该框架的完全解耦.用户只需要包含头文件,并且在使用过程中不需要改动已经写好的库文件。Demo苜先来个dem。,该dem。是使用电脑开两个线程:一个线程模拟雎片机的定时器中断产生时间片轮询个时钟,另一个线程则模拟主函数中一直运行的时间片轮询调度程序。inc1.udeMinc1.udeSinc1.udeItinc1.udetimes1.ice.h/创建5个任务对象TimesiIceTaskObjtask_1.,task_2,task_3,task_4,task_5;/具体的任务函数voidtask1.-hd1
3、.()(printf(task1isrunning.n);)voidtask2-hd1.()printf(task2isrunning.n);voidtask3-hd1.()printf(task3isrunning.);)voidtask4_hd1.()(printf(task4isrunning.);voidtask5-hd1.()(printf(task5isrunning.);)/初始化任务对象,并且将任务添加到时间片轮询调度中voidtaskjnit()(times1.ice_task_init&ta$k_1.,task1._hd1.,1,10);times1.ice_task_in
4、it(&task_2,task2_hd1.,2,20);t1.me$1.ice_task_init(&task_3,ta$k3_hd1.,3,30);times1.ice_task_init&task_4,task4_hd1.,4,40);times1.ice_task_add(&task_1.);times1.ice_task_add(&ta$k_2);times1.ice_task_add(&task_3);times1.ice_task_add(&task_4);times1.ice_task_add(&task_5);/开两个线程模拟在单片机上的运行过程voidtimes1.ice_e
5、xec_thread()(whi1.e(true)(times1.ice_exec();)voidtimes1.ice_tick_thread()whi1.e(true)t1.mes1.ice_tick();SIeep(IO);intmain()(taskjnit();printf(tasknum:%dn,times1.ice_get_task_num();printf(tasken:%dn,times1.ice_get_task_times1.ice_1.en(&task_3);times1.ice_task_de1.(&task_2);printf(de1.ettask2n);printf
6、(task2isexist:%dn,time$1.ice_task_i$exist(&task_2);printf(tasknum:%dnztimes1.ice_get_task_num();times1.ice_task_de1.(&task_5);printf(de1.ettask5n);printf(tasknum:%dn,times1.ice_get_task_num();printf(task3isexist:%dn,times1.ice_task_isexist(&task_3);times1.ice_task_add(&ta$k_2);printf(addtask2n);prin
7、tf(task2isexist:%dn,times1.ice_task_isexist(&task_2);time$1.ice_task_add(&task_5);printf(addtask5n);printf(tasknum:%dn,times1.ice_get_task_num();printf(nn=times1.icerunning=n);stdthreadthread_1.(times1.ice_exec_thread);std:threadthread_2(times1.ice_tick_thread);threadJjoin();thread_2.join();return0;
8、运行结果如下:由以上例子可见,这个框架使用十分方便,甚至可以完全不知道其原理,仅仅通过几个简单的接口就可以迅速创建任务并加入到时间片轮询的框架中,十分好用。时间片轮泡架构其实该部分主要使用了面向对象的思维,使用结构体作为对象,并使用结构体指针作为参数传速,这样作可以节省资源,并且有着极1.的运行效率。其中最难的部分是侵入式链表的使用,这种链表在一些操作系统内核中使用十分广泛,这里是参考RT-Thread实时操作系统中的侵入式链表实现。h文件:MfndefTIMES1.ICEHWdefine_TIMES1.ICE_HWinc1.ude.1.ist.htypedefenum1ASK_ST0RTAS
9、K_RUNIsTaskRun;tpedefstructtimesi1.ce(unsignedintid;void(*task-hd1.)void);IsTaskRunis_run;unsignedinttimer;unsignedinttimes1.icejen;1.istObjtime$1.ice_ta$k_1.ist;JTimesiIceTaskObj;voidtimes1.ice_exec(void);voidtimes1.ice_tickvoid);voidtimes1.ice_task_init(Timesi1.ceTaskObj*obj,void(*task_hd1.)(void)
10、,unsignedintid,unsignedinttimes1.icejen);voidtimes1.ice_task_add(Timesi1.ceTaskObj*obj);voidtimes1.ice_task_de1.(TimeSiICeTaSkobj*obj);unsignedinttimes1.ice_get_task_times1.ice_1.en(Timesi1.ceTaskObj*obj);unsignedinttimes1.ice_get_task_num(void);unsignedchartimes1.ice-taskJsexist(Timesi1.ceTaskObjob
11、j);SendifC文件:Winc1.ude./times1.ice.hstatic1.IST_HEAD(times1.ice_ta$k_1.i$t);voidtimes1.ice-exec()1.istObj*node;TimesiIceTaskObj*task;1.ist_for_each(node,×1.ice_task_1.ist)task=1.ist-entry(node,TimesiIceTaskObj,times1.ice_task_1.ist);if(task-is,run=TASK_RUN)(task-task_hd1.();task-is_run=TASK_ST0
12、P;voidtimes1.ice-tick()(1.istObj*node;TimesiIceTaskObj*task;IisJfOjeaeh(node,×1.ice_task_1.ist)(task=1.ist-entry(node,TimesiIceTaskObj,times1.ice_task_1.ist);if(task-timer!=O)(task-timer-;if(task-timer=O)task-is-run=TASK_RUN;task-timer=task-times1.icejen;)unsignedinttimes1.ice_get_task_num()(re
13、turn1.ist_1.en(×1.ice_task_1.ist);voidtimes1.ice_task_init(Timesi1.ceTaskObj*obj,void(*task_hd1.)(void),unsignedintid,unsignedinttimes1.icejen)(obj-id=id;obj-is-run=TASK_STOP;obj-task_hd1.=task-hd1.;obj-timer=times1.icejen;obj-times1.icejen=times1.icejen;1.i$t_insert_before(×1.ice_task_1.i
14、st,&obj-times1.ice_task_1.ist);)voidtimes1.ice_task_de1.(TimeSi1.CeTaSkObj*obj)(if(times1.ice-taskjseist(obj)1.ist_remove(&obj-times1.ice_task_1.ist);e1.sereturn;unsignedchart1.mes1.1.ce_task_i$exi$t(T1.mes1.1.ceTa$kObj*obj)(unsignedcharisexist=O;1.istObj*node;TimesiIceTaskObj*task;IiSJfOjeaCh(node,×1.ice_task_1.ist)task=1.ist-entry(node,TimesiIceTaskObj,times1.ice_task_1.ist);if(obj-id=task-id)isexist=1;Ireturnisexist;unsignedinttimes1.ice_get_task_times1.ice_1.en(Timesi1.ceTaskObj*obj)returnobj-times1.icejen;