在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!) 创芯人才网--重磅上线啦!
查看: 2028|回复: 0

[资料] 基于单片机系统中的多义务多线程机制的实现

[复制链接]
发表于 2011-4-11 14:55:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
起首要指出的是一点是,我们不是评论斗嘴嵌入式及时多义务操作系统(RTOS)的设计。我们评论斗嘴的是,在晦气用RTOS的节制系统中,若何暗示多义务多线程机制的法度设计思惟。
    一些嵌入式设备可以需要操作系统,例如掌上电脑、PDA、收集节制器等高机能的手持设备和移动设备。它们往往和无线通信、互联网接见和多媒体处理等复杂而强除夜的功能联系袈溱一路;对CPU要求也很高,往往是以通用CPU为原型的各类高端嵌入式处理器。
    作为一个完整的操作系统,RTOS有一个靠得住性很高的及时内核,将CPU时辰、中止、I/O、准时器等本钱都包孕起来,留给用户一个标准的应用法度接口(API);按照各个义务的优先级,合理地在不合义务之间分拨CPU的时辰,包管法度执行的及时性、靠得住性。内核一般都能供应义务调剂和中止办事等功能,部分高档贸易化产品,如Windows XP Embedded,甚至支撑32位地址空间、虚拟存储治理、多进程以及嵌入式操作系统中不多见的动态链接库(DLL)。对于这些RTOS来说,多义务及时处理不是件难题的工作。


但更多的景遇下,用户哄骗的昵囗一类CPU——微节制器,即单片机,往往是按照某一流程执行单一义务。出于成本和手艺上的原因,这类软件斥地多半照样基于处理器直接编写,没有选配及时多义务操作系统作为斥地平台,也不需要将系统软件和应用软件分隔隔离分散处理。然则在实际应用中,有时也会晤对同时处理多个并行义务的要求,这就需要放置一种运行机制,来模拟RTOS中的处理方式。
1 RTOS中的设计思惟
单处理机多道法度系统具有如下特征:
①除夜宏不雅上看,几种法度“同时运行”。即它们先后最先了各自的运行,且均未结束。
②除夜微机上看,几道法度“瓜代执行”。对于单处理机系统而言,它们只能轮流地占用CPU。
    其本色是指几道法度在处理机中“瓜代执行”。我们按照如今常用的方式,把一道法度和一个义务对应,把义务中的每个分隔隔离分散的、自力执行的部分称之为线程。
    具体到RTOS来说,一方面,及时操作中的多义务引起的并发性和及时性,要求操作系统对本钱分拨具有更强的节制能力。常日的举措办法是回收设立前台与后台两个功课的分拨举措办法。前台功课中包含及时采集、节制、处理有关的义务,义务优先级较高;后台功课一般是对数据进行理会、输出数据、响应操作员请求等义务,优先级较低。后台功课中与后台功课并非完全孤立的;后台功课所需数据由前台功课存储共享内存区内,功课之间经由过程共享存储区进行数据交流。
    另一方面,及时义务老是由某个事宜发生或时辰前提知足来激活。事宜有两种:内部事宜和外部事宜。时辰驱动也有两种:按绝对时辰驱动和按相对时辰驱动。内部事宜驱动是指某一法度运行的后不雅导致另一义务的启动,这个后不雅可能是数据知足必然前提,也可能是释放了某一本钱;而最典型的及时义务是由外部事宜驱动的。在及时系统中,外部事宜发生有时是弗成猜测的,由外部事宜驱动的义务一般是需要当即执行的义务,它的优先级最高。绝对时辰驱动是指在某指准时刻执行的义务,也就是在天然时钟的绝对时辰执行。相对时辰驱动是指周期性执行的义务,老是相对上一次执行时辰计时,执行时辰距离必然。除了周期性义务外,还有一些同步义务也可能由相对时辰驱动,如守候某种前提到来。守候时辰是编程设定的。相对时辰可用较劲争论机内部时钟或软件计时。

我们在及时设计傍边,这两方面的问题都有所暗示,所有的事宜驱动和时辰驱动都体如今设置响应的义务标识和线程标识。除夜后面的评论斗嘴中可以看出,当硬件环境一准时,依据这些标识,经由过程放置系统里面止响应体式技俩和调整义务调剂算法,可以有效解决多义务并行问题,因为系统的及时性首要取决于这两点。
2 多义务多线程机制的实现
    我们设计的对象是双通道和四通道测试的某型医用考验设备。每个通道可以置入样本,设置不合的测试项目,完成测试后输出不合的测试后不雅和附加的枷⒚后不雅。
    常规的处理方式是如许的:和通道只能测试同一个项目,按同一步调同步执行各义务的沟通阶段,其处理示意如图1。为简化起见,我们用双通道进行申明。
    显然,如许做不仅会落空测试的天真性,例如不克不及同时测量不项目,不过随意在不合通道中测试不合版本,即使有空余通道也不克不及在上一样本测试过程中启动下一样本的测试;并且还牺牲效率,虚耗时辰,因为要等每个阶段最慢的一个处理完才能进入下一阶段。这其实是单义务的多次简单反复,设计也随意草率。国内很多雷同产品采用了这种方案,但我们摒弃了。
    我们选择了安然并行的设计,即要求所有通道可以完全自力工作;随意率性启动和住手;彼此没有约速;时辰上可以随意率性重叠;是几个自力的义务,如图2。
    这里我们把每一个启动通道进行测试的法度叫做一个义务,把各自义务下的每一个零丁的、分隔隔离分散处理的法度段叫做一个线程,每个线程依靠本身的标识来识别。一个通道的测试义务可分为启动、设置、加样品、预温计时、加试剂与搅拌、通道轮流采样、数据处理和作图打印等多个线程。别的,有一个温度的实瓯`控自力线程,它的优先级要次于通道的测试采样。

      这些线程可分属于前台和后台两类:前台首如不雅一些中止的处理,例如两路温度的实瓯`控、每100ms内的各通道轮回检测一遍、采用中止体式技俩的键盘干涉干与等;后台首如不雅扫描体式技俩下响应操作员的按键请求、数据处理、图形显示、打印申报等内容。
    整个实现机制可以简单地概括如下:前台经由过程合理放置中止的响应和办事体式技俩来对多个义务的及时线程进行处理;后台操作首要以轮回体式技俩扫描各个义务的线程标识,知足前提的线程被激活予以处理。
    限于篇幅,弗成能具体介绍整个设计方案,在此只能给出各测试通道工作义务的前台和后台线程划分及流程,供参考。然后,给出一个中止退出后返回到随意率性地址的函数,它比C51本身的setjmp和longjmp全程跳转函数的哄骗要苟且很多。及时义务中,中止办事结束后不是返回到断点地址执行原有法度,而是强制返回到某一地址执行新法度的景遇异常遍及。我们采用设置环境变量的方式,使中止退出后可以随意率性返回到多个设置进口中的某一个去执行,有效地解决了前台和后台义务线程的天真切换这一关键问题。我们哄骗的CPU是97C52,编程措辞为Keil C51 6.0版。
    图3是主准时器中止办事,12C887供应中止请求旗子暗记至int0。12C887的三个中止触发办事中,温度扫描是自力线程,四次500ms“周期中止”(即每2s)后执行一遍;需要屏幕显示预温侄计时的时刻哄骗“更新中止”,每秒一次,各测试义务,其倒计时线程依靠各自的标识启动和住手;“报警中止”需要时设置为每分钟1次,用于主菜单界面显示当前时辰和长准时的返回。
    图4是CPU内部准时器0的中止办事,用于A/D转换。每个测试义务的A/D分为两个线程:检测试剂参预和测试剂样品的烦?功曲线,当然都是经由过程对光学传感器和输出进行检测的,但处理方式完全不合,数据量也很不一样。准时器0设定为每100ms中止1次,因为要用高精度∑-Δ转换器件,CPU必需直接节制器件的┞符个转换过程,所以,要属意所有通道轮扫一遍A/D的时辰不克不及跨越100ms。
    图5为后台流程。后台法度依靠通道按键启动一个测试义务,然后进行该义务预处理,雷同初始化的一些功能。假如这时代又启动其余义务,则未初始化完的先前义务中止。
   

初始化完成后进入多义务所属线程的轮回处理阶段,其间可以随时由通道按键引起的中止来参预新的义务,每个线程的调剂标识可以由相关的前台线程给出,也可来自相关的后台线程。合营Getadd()和Putadd()除夜中止强制返回某地此后,哄骗跳转语句到真正的方针地址。
最后给出强制返回法度代码(供参考):
/*留存当前地址信息到环境变量JMPEnv[env1][]中,每个变量由三项构成,env1是二维下标参数*/
void getadd(unsigned char env1)
{unsigned char temp;
temp=SP;
JMPEnv[env1][0]=(*((unsigned char idata*)SP));
temp--;
JMPEnv[env1][1]=(*((unsigned char idata*)temp));
JMPEnv[env1][2]=SP-2;
}
/*置中止返回的随意率性跳转地址*/
void putadd(unsigned char env1)reentrant
{ unsigned char temp[15];char i;
/*下面留存进入中止法度时的压栈值*/
for(i=0,i<15;i++)
{temp[i]=(*((unsigned char idata*)SP));
SP--;
}
/*放置新地址*/
SP=JMPEnv[env1][2];SP++;
(*((unsigned char idata*)SP)=JMPEnv[env1][1];SP++;
(*((unsigned char idata*)SP))=JMPEnv[env1][0];
/*恢复中止最先时的那些压栈值*/
for(i=14;i>=0;i--)
{SP++;
(*((unsigned char idata*)SP))=temp[i];
}
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-27 01:31 , Processed in 0.027860 second(s), 10 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表