单片机的多任务思考(共8页)_第1页
单片机的多任务思考(共8页)_第2页
单片机的多任务思考(共8页)_第3页
单片机的多任务思考(共8页)_第4页
单片机的多任务思考(共8页)_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

1、单片机的多任务处理思考(sko)对于单片机这样一个非常基础的控制芯片,我们常常用于处理一些针对性比较强的任务,任务的性质比较简单,而且(r qi)流程是按照顺序执行的,逻辑上非常直白。下面(xi mian)是单片机常见的顺序执行流程开始执行结果现实中的情况往往比这要复杂一些例如,显示需要定时刷新,红外接收器接受数据需要立即响应并解码,超声波的数据需要立即分析,这些情况利用中断端口的实时响应特性解决,如果端口的数量比较多,而且要求响应时间比较短,那么程序的结构就不能按照正常的顺序执行来设计。此时,单片机的多任务处理的要求就提出来了,电脑操作系统中有多线程和多任务处理的能力,根据他们的设计思路,我

2、们是不是可以设计出一个符合单片机特性的多任务的程序结构呢!而且对于这个多任务程序结构中不能太依赖单片机的特殊资源,原因就是方便程序的移植。在计算机的编程中,一个基本的概念就是同时对多个任务进行控制。许多程序设计都要求程序能够停下手头的工作,改为处理其他一些问题,再返回主程序。可以通过多种途径达到这个目的。单片机中是通过硬件级的中断实现的。尽管这是一种有效的方法,但编出的程序很难移植,这样就另外一个问题,代价高昂问题,如果所有的编程都需要从头开始编写,尽管这个问题在其他的项目中,也曾遇到过,那么时间价值就浪费掉了,所以多任务的一个基本要求就是不要太依赖硬件给予的特殊资源,其通用性的价值要体现出来

3、。好了,现在我们来看,为了同步完成多项任务,单片机的实际运行效率就要提上来,基础单片机的运行速度是1us,通过提高单片机的晶振频率或者采用增强型的单片机其速度可以更快!而一个单片机的所有任务流程执行下来,如果需要5秒以上,那么对于单片机的来说是难以接受的,其实我们仔细把任务的流程抛开来看的化,我们会发现,单片机的真正执行指令的时间并不长,大部分的时间都在延时程序中中空运转。如果我们能把延时的程序,利用起来,做里外一个工作,那么我们的系统就可以实现两个任务,每个任务的如果只需要简单的逻辑判断,没有非常耗时的浮点运算(其实这也不是单片机的强项)那么我是不是可以多执行两个任务或者N个任务。我就是我想

4、到的简单的思路。任务一我们现在根据单片机的特点,好好的排布一下。我们把任务的性质划分一下,如果任务之间是并列关系,我们可以称之为弱相关,如果任务之间是顺序执行关系,我们称之为强相关,即对应电路的并联和串联关系。任务二1.串联执行任务二任务一2.并列关系每个任务都是有步骤的进行(jnxng),无非是步骤之间的多少不同而已!每个任务都划分好相应的时间片段,什么时候(sh hou)执行,什么条件执行,都有严格的规定(gudng),时间的计数交给定时器来完成。如何划分步骤?1.第一点根据任务要求的响应时间2.第二点根据周期执行时间来确定如果第一个任务完整的流程执行时间在1.5ms,而另外一个任务针对外

5、部条件的变化,系统要求在1ms内做出响应,那么第一个任务的流程应该分为两个步骤完成,这样划分时间片段才能符合系统的时间响应要求。超声波数据分析和处理YNYN接受到红外数据?接受到红外数据?红外数据分析和处理如果是任务之间是并列的关系使用顺序访问是否符合执行条件。例如超声波的数据处理和红外数据的处理,两者之间没有直接的关联,我们称之为若相关,我们使用下面的流程来处理如果任务之间是串联的关系使用寻址方式,或者称为任务调度器来进行访问步骤调度指针(地址)步骤5步骤4步骤3步骤2步骤1下面(xi mian)贴一段代码吧,项目(xingm)中的一部分仅供参考简单说明一下,用定时器做延时的技术参考,设置一

6、个标志位做索引,延时时间到了,满足条件,步骤指针指向下一步(y b)!如果条件不满足,把当前指针压入数组做成的伪堆栈,同时给与指针一个空向值,如果满足条件,则把压入堆栈的数值推送给指针。对于按键的延时检测,可能用到菜单的切换,每个菜单的界面需要做成一个任务,需用时直接当成任务对象调用即可。void main(void)bit flag_work=0; bit flag_error_work=0;bit flag_error_pipe_jam=0;hard_ini();serial_one_initial();Pm_step=0;while(1)/get_result_volt_value();

7、switch(Pm_step)case 0:if(!water_positionL&!water_positionH)/高位water_position_light=1;elsewater_position_light=0;flag_work=open_or_close();/开机之后,关掉参数设置残留的显示和变量数据值Pm_step=1; if(flag_work)flag_error_work=0; /现在的问题(wnt)是加电之后,电流不进行检测key_back=0;key_shift=0;flag_setup=0;flag_time=0;/清掉按键(n jin)设置的参数Pr_step

8、=0;Pm_step=3;flag_current_enable=0;break;case 1:key_command();/此处放上按键操作,按键主要用于设置各部件(bjin)的参数Pm_step=2;if(flag_setup|flag_time)Pm_step=0;break;case 2:display_buffer0=0 x50;display_buffer1=0 x79;display_buffer2=0 x5e;display_buffer3=0 x66;Pm_step=0;break;case 3:normal_work_ini();/key_command1();Pm_ste

9、p=4;if(Pr_step=0 xaa)Pw_step=7;Pm_step=6;Pp_step=0;flag_pipe_fail=0;/为压力检测做准备flag_current_pump2_start=0;break;case 4:flag_work=open_or_close();Pm_step=5;if(!flag_work)Pm_step=0; /关机之后(zhhu),要注意清掉正在运行的事件display_buffer0=0;display_buffer1=0;display_buffer2=0;display_buffer3=0;display_buffer4=0;display_

10、buffer5=0;display_buffer6=0;display_buffer7=0;flag_draught_open_start=0;flag_draught_open_end=0;flag_draught_close_start=0;flag_draught_close_end=0;flag_fire_open_start=0;flag_fire_open_end=0;flag_fire_close_start=0;flag_fire_close_end=0;flag_main_valve_open_start=0;flag_main_valve_open_end=0;flag_m

11、ain_valve_close_start=0;flag_main_valve_close_end=0;flag_fire_fail_start=0;flag_fire_fail_end=0;fail_count=0;temp_draught_open=0;temp_draught_close=0;temp_fire_open=0;temp_fire_close=0;temp_main_valve_open=0;temp_main_valve_close=0;temp_fire_fail=0;flag_current_pump2_start=0;break;case 5:get_result_

12、volt_value();if(!flag_error_work)flag_error_work=sys_detection_initial();Pm_step=3;if(flag_error_work)Pm_step=4;break;case 6:normal_work();Pm_step=7;break;case 7: /工作中的操作,要从错误(cuw)显示里面进行夺权key_command1(); /解决平时(pngsh)显示温度值,操作是电压电流值Pm_step=8; /出错误时,显示(xinsh)错误内容break;case 8:flag_work=open_or_close();P

13、m_step=9;if(!flag_work)Pm_step=0;display_work_count=0; /关机之后,要注意清掉正在运行的事件display_buffer0=0;display_buffer1=0;display_buffer2=0;display_buffer3=0;display_buffer4=0;display_buffer5=0;display_buffer6=0;display_buffer7=0;flag_water_pump2_open_start=0;flag_water_pump2_open_end=0;flag_water_pump1_open_sta

14、rt=0;flag_water_pump1_open_end=0;flag_subordination_valve_open_start=0;flag_subordination_valve_open_end=0;temp_water_pump2_open=0;temp_water_pump2_close=0;temp_water_pump1_open=0;temp_water_pump1_close=0;temp_subordination_valve_open=0;temp_subordination_valve_close=0;Pp_step=0;pipe_fail_count=0;fl

15、ag_pipe_water_pump1_open_start=0;flag_pipe_water_pump1_open_end=0;flag_pipe_water_pump1_close_start=0;flag_pipe_water_pump1_close_end=0;flag_pipe_water_pump2_open_start=0;flag_pipe_water_pump2_open_end=0;flag_pipe_water_pump2_close_start=0;flag_pipe_water_pump2_close_end=0;temp_pipe_water_pump1_open

16、=0;temp_pipe_water_pump1_close=0;temp_pipe_water_pump2_open=0;temp_pipe_water_pump2_close=0;flag_current_pump2_start=0;break;case 9:get_result_volt_value();if(!flag_error_work)flag_error_work=sys_detection_work();Pm_step=10;if(flag_error_work)Pm_step=8;break;case 10:if(!flag_pipe_fail)flag_error_pipe_jam=pipe_jam_detection();if(flag_error_pipe_jam)Pm_step=8;/如果有压力错误那么立即转入等待待机和检测(jin c)的工作部分elsePm_step=6;/如果途中(t zhn)压力错误消失,进入正常工作状态elsePm_step=8;/错误(cuw)不可挽回的时候,只能

温馨提示

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

评论

0/150

提交评论