跟着计算机的不断开展,越来越多的,优异的编程思维被提出来,并付诸实践。在某些方面已呈现了根本性的革新。另一方面,单片机自从80年代诞生以来,便以飞快的速度开展起来,但由于其物理条件的约束,单片机操控体系的编程依然局限于经历的形式,很少运用那些新提出的高档言语的编程思维。假如将不断开展的编程思维与广泛运用的单片机操控体系结合起来,一定会大大促进单片机操控体系的进一步开展。使其更广泛的运用于各个方面。
在下面这个详细项目中,实践状况对体系有一些比较严苛的要求。依照一般的单线程的操控办法现已无法满意实践需求。
目标M1开端动作17操作,即首要步进电机M1(正向)滚动查找光电开关信号PS1;查到后履行两次‘进程1‘。进程1:向电机打出30拍。由表1可知该动作从C 段履行到 K段中止;
目标M2即步进电机M2等目标M1履行完动作17后履行动作23等。目标M3和目标M4 则在开端时一起发动,别离履行各自的动作。各个目标之间有的独立,有的互相相关。
整个项目需求操控16台步进电机,21个电磁阀,3个泵,1个直流电机,体系要求悉数履行时刻为6秒钟,体系要求步进电机以其最快的速度—–40us—60us打拍。假如以单线程的办法编程让一台电机转到位之后,再转其他电机。这样16台电机打一拍就需求640us—960us现已无法满意体系要求。这就需求使单片机并行操控多台电机作业。这种以并行的办法驱动各个电机一起发动能够在最短的时刻将各个电机一起到位。在滚动电机的一起还需求检测一些开关量已确认电机的方位。为了完成这个意图。下面供应第一种处理计划(此计划是常用的计划之一,但作者并不引荐这个计划。由于这个计划本钱太高。)。
计划一: 硬件完成。
咱们能够用多个CPU,将各个电机的操控分到不同的CPU中履行,并可将不互相冲突的电机操控进程放到一个CPU中。
体系中设定一个主CPU,其功能为与计算机通讯,并将计算机下达的指令分发给相应的从CPU,更首要的是主CPU将监控整个并行操控的运作。由于各个操控进程之间有的互相相关,所以主CPU不只需操控各个线程的履行,还要统筹线程之间的通讯。以表1为例,详细作法如下:
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中止。这个时刻为整个体系运转的基准时刻。在这段时刻内,体系要查询一遍一切目标并向相应的步进电机打拍。在一些线程中还需求采样屡次。换句话说,在这个体系时刻内。一切线程都要向前跋涉一步。
就像计算机相同,将这个基准时刻分为多个时刻片。将各个时刻片分给不同的线程,在这种状况下,各个线程的履行是接连的。这与用硬件模仿多线程有实质的不同。像这样既要运用各线程履行的接连性,又要确保各线程运转的接连性。这对软件的规划有了很高的要求,这一起也是单片机操控体系用软件模仿多线程办法中的难点之一,为了处理这个问题,可在个线程自带线程进展指示器用来标志线程的运转进展,即用一个变量记载线程的每一步。
体系设定线程进展指示器用来指引线程的接连运转,一起在一个中止中轮询一切目标。其编程结构大致如下:
时钟中止:
线程1:
线程进展标志:
1: ;
2: ;
3;
线程2:
线程进展标志:
1: ;
2: ;
。。。。。。。。