利用多线程思想实现单片机系统的伪并行处理

时间:2012-03-23来源:网络

1.开始后,主CPU发给从CPU1一个信号,从CPU启动对象M1进行动作17,并由从CPU向主CPU返回一个信号。主CPU收到信号后,置起标志1。当对象M1进行完动作17后,从CPU向主CPU发出信号,CPU将标志1清掉。

2.开始后,主CPU发给从M2一个信号,从CPU启动对象M2。从CPU向主CPU不断查询标志1。当标志1被清掉后,从//控制对象2执行动作23。

3.开始后,主CPU发给从CPU一个信号,从CPU启动对象M3和对象M4。执行动作25,然后开电磁阀6,然后延时1秒,关电磁阀6,执行动作24,然后执行动作26,等////1的动作17完成后,启动步进电机20,执行动作25,等等。

如上所说, 主CPU设置了多个标志位用以跟踪各个线程的运行情况。并用这些标志位承担了各个相关线程之间的通讯。凡是线程运行到与其他线程相关的地方都会在主CPU 内设置一个标志位以供其它相关线程查询。而那些不相关的线程可以完全独立运行。相关线程除了需检测标志的部分,其他部分也可独立运行。

这种多CPU控制的作法实现了单片机的并行运作方式。但多CPU的控制方案成本几乎是成倍提高,而且在硬件的基础上实现的多CPU之间的通讯花费时间稍长。并且容易有干扰。

方案二(作者推荐): 另一种实现的方法是在软件的层面上模拟多cpu的运作。从而实现单片机的伪并行处理.这种实现方法借鉴了计算机实现多线程的编程方法。

多线程编程编程思想,即:同时给CPU分配了几个任务或线程。当然计算机 CPU实际上不可能同一时间做几件事,而是把时间分到不同的线程,使每个线程都有点进展。如果一个线程无法进行,比如线程要求的键盘输入尚未取得,则转入另一个线程的工作。通常,CPU在线程间的切换非常迅速,使人们感觉好象所有的线程是同时进行的。

多线程编程中有一个很重要的环节:各个线程之间的通讯与控制问题

在多线程编程中,每个线程都用编码提供线程的行为,用数据供给编码操作。多个线程同时处理同一编码和数据,不同线程可能各有不同的编码和数据。事实上,编码和数据部分是相当独立的,需要时即可向线程提供。因此经常是几个线程使用同一段编码和数据这就会出现下面的情况

当一个线程在调用数据时,另一个线程可能正在修改这些数据。则前一个线程所调用的数据出现了不确定性。这会影响整个运行结果。为了避免这个问题,多线程编程中,各个线程之间通讯和控制尤为重要。在将多线程的思想向单片机控制系统移植时,这点要非常注意。因为系统多线程运作的实现从其最基本的层面看仍然是单线程的操作;他的实现归根结底是利用了计算机的高速度。它将系统运行的基准时间分成了许多时间片,将各个时间片分给不同的线程,如此一来在一个基准时间内各个线程全都向前行进了一步,然后运行下一个基准时间,周而复始。这样在用户层的角度看来,各个线程是同步进行的。只要速度够块,时间片的划分不会影响用户层面上的应用,这样就可以实现多线程的操作。近年来单片机速度的大幅度提升,这就使多线程思想向单片机控制系统的移植成为可能。

在整个项目中全部的输入信号共39个;同时并行查询的对象最多时有61个系统要求以步进电机最快的速度打拍。时间约40us---60us,为了保证步进电机打拍的稳定性和灵活性。我选用了DSP内部的一个定时器,定时时间为打拍时间的1/3—1/5。设定为10us中断。这个时间为整个系统运行的基准时间。在这段时间内,系统要查询一遍所有对象并向相应的步进电机打拍。在一些线程中还需要采样多次。换句话说,在这个系统时间内。所有线程都要向前行进一步。

就像计算机一样,将这个基准时间分为多个时间片。将各个时间片分给不同的线程,在这种情况下,各个线程的执行是间断的。这与用硬件模拟多线程有本质的不同。像这样既要应用各线程执行的间断性,又要保证各线程运行的连续性。这对软件的设计有了很高的要求,这同时也是单片机控制系统用软件模拟多线程方法中的难点之一,为了解决这个问题,可在个线程自带线程进度指示器用来标志线程的运行进度,即用一个变量记载线程的每一步;如图2

45.gif
图2

系统设定线程进度指示器用来指引线程的连续运行,同时在一个中断中轮询所有对象。其编程结构大致如下:

时钟中断:
线程1:
线程进度标志:
1: ;
2: ;
3 ;

线程2:
线程进度标志:
1: ;
2: ;
。。。。。。。。

用软件模拟多线程还有很多要注意的地方。

1 2 3

关键词: 系统 并行 处理 单片机 实现 线程 思想 利用

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版