资源描述:
《单片机系统中多任务多线程机制的实现》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、单片机系统中多任务多线程机制的实现.freelbedded,甚至支持32位地址空间、虚拟存储管理、多进程以及嵌入式操作系统中不多见的动态链接库(dll)。对于这些rtos来说,多任务实时处理不是件困难的事情。但更多的情况下,用户使用的是另一类cpu——微控制器,即单片机,往往是按照某一流程执行单一任务。出于成本和技术上的原因,这类软件开发多数还是基于处理器直接编写,没有选配实时多任务操作系统作为开发平台,也不需要将系统软件和应用软件分开处理。但是在实际应用中,有时也会面临同时处理多个并行任务的要求,这就需要安排一种运行机制,来模拟rtos中的处理方法。1rtos中的设
2、计思想单处理机多道程序系统具有如下特征:①从宏观上看,几种程序“同时运行”。即它们先后开始了各自的运行,且均未结束。②从微机上看,几道程序“交替执行”。对于单处理机系统而言,它们只能轮流地占用cpu。其实质是指几道程序在处理机中“交替执行”。我们按照现在常用的方法,把一道程序和一个任务对应,把任务中的每个分开的、独立执行的部分称之为线程。具体到rtos来说,一方面,实时操作中的多任务引起的并发性和实时性,要求操作系统对资源分配具有更强的控制能力。通常的办法是采取设立前台与后台两个作业的分配办法。前台作业中包含实时采集、控制、处理有关的任务,任务优先级较高;后台作业一般
3、是对数据进行分析、输出数据、响应操作员请求等任务,优先级较低。后台作业中与后台作业并非完全孤立的;后台作业所需数据由前台作业存储共享内存区内,作业之间通过共享存储区进行数据交换。另一方面,实时任务总是由某个事件发生或时间条件满足来激活。事件有两种:内部事件和外部事件。时间驱动也有两种:按绝对时间驱动和按相对时间驱动。内部事件驱动是指某一程序运行的结果导致另一任务的启动,这个结果可能是数据满足一定条件,也可能是释放了某一资源;而最典型的实时任务是由外部事件驱动的。在实时系统中,外部事件发生有时是不可预测的,由外部事件驱动的任务一般是需要立即执行的任务,它的优先级最高。绝
4、对时间驱动是指在某指定时刻执行的任务,也就是在自然时钟的绝对时间执行。相对时间驱动是指周期性执行的任务,总是相对上一次执行时间计时,执行时间间隔一定。除了周期性任务外,还有一些同步任务也可能由相对时间驱动,如等待某种条件到来。等待时间是编程设定的。相对时间可用计算机内部时钟或软件计时。图2独立并行任务我们在实时设计当中,这两方面的问题都有所体现,所有的事件驱动和时间驱动都体现在设置相应的任务标识和线程标识。从后面的讨论中可以看出,当硬件环境一定时,依据这些标识,通过安排系统内中断响应方式和调整任务调度算法,可以有效解决多任务并行问题,因为系统的实时性主要取决于这两点。
5、2多任务多线程机制的实现我们设计的对象是双通道和四通道测试的某型医用检验设备。每个通道可以置入样本,设置不同的测试项目,完成测试后输出不同的测试结果和附加的计算结果。常规的处理方法是这样的:和通道只能测试同一个项目,按统一步骤同步执行各任务的相同阶段,其处理示意如图1。为简化起见,我们用双通道进行说明。显然,这样做不仅会失去测试的灵活性,例如不能同时测量不项目,不过随意在不同通道中测试不同版本,即使有空余通道也不能在上一样本测试过程中启动下一样本的测试;而且还牺牲效率,浪费时间,因为要等每个阶段最慢的一个处理完才能进入下一阶段。这其实是单任务的多次简单重复,设计也容易
6、。国内很多类似产品采用了这种方案,但我们放弃了。我们选择了安全并行的设计,即要求所有通道可以完全独立工作;任意启动和停止;彼此没有约速;时间上可以任意重叠;是几个独立的任务,如图2。这里我们把每一个启动通道进行测试的程序叫做一个任务,把各自任务下的每一个单独的、分开处理的程序段叫做一个线程,每个线程依靠自己的标识来识别。一个通道的测试任务可分为启动、设置、加样品、预温计时、加试剂与搅拌、通道轮流采样、数据处理和作图打印等多个线程。另外,有一个温度的实时监控独立线程,它的优先级要次于通道的测试采样。图3前台控制流程1----voidxlnt0()interrupt0这些
7、线程可分属于前台和后台两类:前台主要是一些中断的处理,例如两路温度的实时监控、每100ms内的各通道循环检测一遍、采用中断方式的键盘干预等;后台主要是扫描方式下响应操作员的按键请求、数据处理、图形显示、打印报告等内容。整个实现机制可以简单地概括如下:前台通过合理安排中断的响应和服务方式来对多个任务的实时线程进行处理;后台操作主要以循环方式扫描各个任务的线程标识,满足条件的线程被激活予以处理。限于篇幅,不可能详细介绍整个设计方案,在此只能给出各测试通道工作任务的前台和后台线程划分及流程,供参考。然后,给出一个中断退出后返回到任意地址的函数,它比c51自