版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单片机的多任务处理思考对于单片机这样一个非常基础的控制芯片,我们常常用于处理一些针对性比较强的任务,任务的性质比较简单,而且流程是按照顺序执行的,逻辑上非常直白。下面是单片机常见的顺序执行流程开始开始 执行结果结果现实中的情况往往比这要复杂一些例如,显示需要定时刷新,红外接收器接受数据需要立即响应并解码,超声波的数据需要立即分析,这些情况利用中断端口的实时响应特性解决,如果端口的数量比较多,而且要求响应时间比较短,那么程序的结构就不能按照正常的顺序执行来设计。此时,单片机的多任务处理的要求就提出来了,电脑操作系统中有多线程和多任务处理的能力,根据他们的设计思路,我们是不是可以设计出一个符合单片机特性的多任务的程序结构呢!而且对于这个多任务程序结构中不能太依赖单片机的特殊资源,原因就是方便程序的移植。在计算机的编程中,一个基本的概念就是同时对多个任务进行控制。许多程序设计都要求程序能够停下手头的工作,改为处理其他一些问题,再返回主程序。可以通过多种途径达到这个目的。单片机中是通过硬件级的中断实现的。尽管这是一种有效的方法,但编出的程序很难移植,这样就另外一个问题,代价高昂问题,如果所有的编程都需要从头开始编写,尽管这个问题在其他的项目中,也曾遇到过,那么时间价值就浪费掉了,所以多任务的一个基本要求就是不要太依赖硬件给予的特殊资源,其通用性的价值要体现出来。好了,现在我们来看,为了同步完成多项任务,单片机的实际运行效率就要提上来,基础单片机的运行速度是1us,通过提高单片机的晶振频率或者采用增强型的单片机其速度可以更快!而一个单片机的所有任务流程执行下来,如果需要5秒以上,那么对于单片机的来说是难以接受的,其实我们仔细把任务的流程抛开来看的化,我们会发现,单片机的真正执行指令的时间并不长,大部分的时间都在延时程序中中空运转。如果我们能把延时的程序,利用起来,做里外一个工作,那么我们的系统就可以实现两个任务,每个任务的如果只需要简单的逻辑判断,没有非常耗时的浮点运算(其实这也不是单片机的强项)那么我是不是可以多执行两个任务或者N个任务。我就是我想到的简单的思路。任务一我们现在根据单片机的特点,好好的排布一下。我们把任务的性质划分一下,如果任务之间是并列关系,我们可以称之为弱相关,如果任务之间是顺序执行关系,我们称之为强相关,即对应电路的并联和串联关系。任务一任务二任务二1.1.串联执行任务二任务一任务二任务一2.2.并列关系每个任务都是有步骤的进行,无非是步骤之间的多少不同而已!每个任务都划分好相应的时间片段,什么时候执行,什么条件执行,都有严格的规定,时间的计数交给定时器来完成。如何划分步骤?1.第一点根据任务要求的响应时间2.第二点根据周期执行时间来确定 如果第一个任务完整的流程执行时间在1.5ms,而另外一个任务针对外部条件的变化,系统要求在1ms内做出响应,那么第一个任务的流程应该分为两个步骤完成,这样划分时间片段才能符合系统的时间响应要求。超声波数据分析和处理YNYN接受到红外数据?接受到红外数据?红外数据分析和处理 如果是任务之间是并列的关系使用顺序访问是否符合执行条件。例如超声波的数据处理和红外数据的处理,两者之间没有直接的关联,我们称之为若相关,我们使用下面的流程来处理超声波数据分析和处理YNYN接受到红外数据?接受到红外数据?红外数据分析和处理如果任务之间是串联的关系使用寻址方式,或者称为任务调度器来进行访问步骤调度指针步骤调度指针(地址)步骤5步骤4步骤步骤5步骤4步骤3步骤2步骤1下面贴一段代码吧,项目中的一部分仅供参考简单说明一下,用定时器做延时的技术参考,设置一个标志位做索引,延时时间到了,满足条件,步骤指针指向下一步!如果条件不满足,把当前指针压入数组做成的伪堆栈,同时给与指针一个空向值,如果满足条件,则把压入堆栈的数值推送给指针。对于按键的延时检测,可能用到菜单的切换,每个菜单的界面需要做成一个任务,需用时直接当成任务对象调用即可。voidmain(void){ bitflag_work=0; bitflag_error_work=0; bitflag_error_pipe_jam=0; hard_ini(); serial_one_initial(); Pm_step=0; while(1) { // get_result_volt_value(); switch(Pm_step) { case0: if(!water_positionL&&!water_positionH)//高位 water_position_light=1; else water_position_light=0; flag_work=open_or_close();//开机之后,关掉参数设置残留的显示和变量数据值 Pm_step=1; if(flag_work) { flag_error_work=0; //现在的问题是加电之后,电流不进行检测 key_back=0; key_shift=0; flag_setup=0; flag_time=0;//清掉按键设置的参数 Pr_step=0; Pm_step=3; flag_current_enable=0; } break; case1: key_command();//此处放上按键操作,按键主要用于设置各部件的参数 Pm_step=2; if(flag_setup||flag_time) Pm_step=0; break; case2: display_buffer[0]=0x50; display_buffer[1]=0x79; display_buffer[2]=0x5e; display_buffer[3]=0x66; Pm_step=0; break; case3: normal_work_ini(); //key_command1(); Pm_step=4; if(Pr_step==0xaa) { Pw_step=7; Pm_step=6; Pp_step=0; flag_pipe_fail=0;//为压力检测做准备 flag_current_pump2_start=0; } break; case4: flag_work=open_or_close(); Pm_step=5; if(!flag_work) { Pm_step=0; //关机之后,要注意清掉正在运行的事件 display_buffer[0]=0; display_buffer[1]=0; display_buffer[2]=0; display_buffer[3]=0; display_buffer[4]=0; display_buffer[5]=0; display_buffer[6]=0; display_buffer[7]=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_main_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; case5: get_result_volt_value(); if(!flag_error_work) flag_error_work=sys_detection_initial(); Pm_step=3; if(flag_error_work) Pm_step=4; break; case6: normal_work(); Pm_step=7; break; case7: //工作中的操作,要从错误显示里面进行夺权 key_command1(); //解决平时显示温度值,操作是电压电流值 Pm_step=8; //出错误时,显示错误内容 break; case8: flag_work=open_or_close(); Pm_step=9; if(!flag_work) { Pm_step=0; display_work_count=0; //关机之后,要注意清掉正在运行的事件 display_buffer[0]=0; display_buffer[1]=0; display_buffer[2]=0; display_buffer[3]=0; display_buffer[4]=0; display_buffer[5]=0; display_buffer[6]=0; display_buffer[7]=0; flag_water_pump2_open_start=0; flag_water_pump2_open_end=0; flag_water_pump1_open_start=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; flag_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=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; case9: 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; case10: if(!flag_pipe_fail) { f
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年图书馆科幻小说图书采购合同范本3篇
- 2024年度电力系统运维管理合同3篇
- 2024GRG合同范本:环保节能技术研发与应用合作协议2篇
- 2024年版施工项目协议范本版
- 2025版高考物理一轮总复习专题13热学第1讲分子动理论内能课后提能演练
- 龙岩学院《高级语言与程序设计》2023-2024学年第一学期期末试卷
- 2024年度食堂环保评估与整改合同3篇
- 01生物和生物圈教学实录人教版生物七年级上册
- 2024年版云计算服务提供商合同5篇
- 广告拍摄制作合同
- 学校义务教育均衡发展一校一策方案
- ASTM-D3359-(附著力测试标准)-中文版
- 高校实验室安全通识课学习通超星期末考试答案章节答案2024年
- DBJ15-22-2021-T 锤击式预应力混凝土管桩工程技术规程(广东省)
- 银行客户经理招聘面试题与参考回答(某大型集团公司)
- 《安全系统工程》期末考试卷及答案
- 数学师范-大学生职业生涯规划书
- 科学阅读材料(课件)二年级上册科学教科版
- 2022年度尾矿库安全风险辨识及分级管控表
- 投标项目进度计划
- 关于发展乡村产业的建议
评论
0/150
提交评论