用VC++模拟多任务(用于嵌入式)

首先我们来理解“任务”,所谓任务,就是需要CPU周期“关照”的事件,绝大多数任务不需要CPU一直“关照”,例如启动ADC的启动读取。甚至有些任务“害怕”CPU一直“关照”例如LCD的刷新,因为LCD是显示给人看的,并不需要高速刷新,即便是显示的

内容在高速变化,也不需要高速刷新,道理是一样的。这样看来,让CPU做简单任务一定很浪费,事实也是如此,绝大多数简单任务,CPU都是在“空转”(循环踏步延时)。对任务总结还可以知道,很多任务需要CPU不断“关照”,其实这种“不断”也是有极限的,比如数码管动态扫描,能够做到40Hz就可以了,又如键盘扫描,能够做到20Hz(经验值),基本上也就不会丢有效按键键值了,再如LCD刷新,我觉得做到10Hz就可以了,等等。看来,绝大多数任务都是工作在低速频度。而我们的CPU一旦运行起来,速度又很快,CPU本身就是靠很快的速度执行很简单的指令来胜任复杂的任务(逻辑)的。如果有办法把“快”的CPU分成多个慢的CPU,然后给不同的任务分配不同速度的CPU,这种设想是不是很好呢!确实很好,下面就看如何将“快”的CPU划分成多个“慢”的CPU。


这是用VC++模拟多任务:

这个卖票的程序……

#include "stdafx.h"

int main(int argc, char* argv[])
{
    int tastf[]={0,1,1,1}; //1待完成
    int tast[]={1,912,993,994}; //待售票
    int ticks=2917; //70;

        int i1,i2,i3;
    int ti1,ti2,ti3;

    for(int n=0;n<9999;++n) { //for10
        //int tn=n%4;
        switch (n%4)
        {
        case 3: if(0<tast[3]) goto t3_1; break;
        case 2: if(0<tast[2]) goto t2_1; break;
        case 1: if(0<tast[1]) goto t1_1; break;
        case 0: break;
        }//switch(tn
select12:
        if (ticks<=0) {printf("票已销售謦!%",ticks); goto end11;}
        if (0>=tast[1] & 0>=tast[2] & 0>=tast[3]) {goto end11;}
    }//for int n//for10


    for(i1=tast[1];i1>=0;) {
t1_1:
        printf("还剩下%d张票,",ticks);
        printf("售票窗(1),还有%d个购票者,",tast[1]);
        if(tast[1]>0) {
        --ticks; --i1; --tast[1];
        printf("售票窗一服务了1个购票者,还剩%d个购票者\n",tast[1]); }//if11
        printf("还剩下%d张票\n",ticks);

        goto select12;

    }//fori1 11


    do {
t2_1:
        printf("还剩下%d张票,",ticks);
        printf("售票窗(2),还剩%d个购票者,",tast[2]);
        if(tast[2]>0) {
        --ticks;--i2; --tast[2];
        printf("售票窗二服务了1个购票者,还剩%d个购票者\n",tast[2]); }//if22
        printf("还剩下%d张票\n",ticks);

        goto select12;

    }while(1); //fori2 22


    do {
t3_1:
        printf("还剩下%d张票,",ticks);
        printf("售票窗(3),还剩%d个购票者,",tast[3]);
        if(tast[3]>0) {
        --ticks;--i3; --tast[3];
        printf("售票窗三服务了1个购票者,还剩%d购票者\n",tast[3]); }//if33
        printf("还剩下%d张票\n",ticks);

        goto select12;

    }while(1) ; //do while(1 dowhile33//fori3 33


    goto select12;

end11:
    printf("end11!\n");
    return 0;
}

这是教学用的……用c 写 汇编……

想实用还得多改进……

-----------------------------------------------------------------------

//三个窗口,不用函数的,以后再补充用函数的
#include "stdafx.h"

int main(int argc, char* argv[])
{
    int tastf[]={0,1,1,1}; //1待完成
    int tast[]={1,912,993,994}; //待售票
    int ticks=2917; //70;

        int i1,i2,i3;
    int ti1,ti2,ti3;

    for(int n=0;n<9999;++n) { //for10
        //int tn=n%4;
        switch (n%4)
        {
        case 3: if(0<tast[3]) goto t3_1; break;
        case 2: if(0<tast[2]) goto t2_1; break;
        case 1: if(0<tast[1]) goto t1_1; break;
        case 0: break;
        }//switch(tn
select12:
        if (ticks<=0) {printf("票已销售謦!%",ticks); goto end11;}
        if (0>=tast[1] & 0>=tast[2] & 0>=tast[3]) {goto end11;}
    }//for int n//for10


    for(i1=tast[1];i1>=0;) {
t1_1:
        printf("还剩下%d张票,",ticks);
        printf("售票窗(1),还有%d个购票者,",tast[1]);
        if(tast[1]>0) {
        --ticks; --i1; --tast[1];
        printf("售票窗一服务了1个购票者,还剩%d个购票者\n",tast[1]); }//if11
        printf("还剩下%d张票\n",ticks);

        goto select12;

    }//fori1 11


    do {
t2_1:
        printf("还剩下%d张票,",ticks);
        printf("售票窗(2),还剩%d个购票者,",tast[2]);
        if(tast[2]>0) {
        --ticks;--i2; --tast[2];
        printf("售票窗二服务了1个购票者,还剩%d个购票者\n",tast[2]); }//if22
        printf("还剩下%d张票\n",ticks);

        goto select12;

    }while(1); //fori2 22


    do {
t3_1:
        printf("还剩下%d张票,",ticks);
        printf("售票窗(3),还剩%d个购票者,",tast[3]);
        if(tast[3]>0) {
        --ticks;--i3; --tast[3];
        printf("售票窗三服务了1个购票者,还剩%d购票者\n",tast[3]); }//if33
        printf("还剩下%d张票\n",ticks);

        goto select12;

    }while(1) ; //do while(1 dowhile33//fori3 33


    goto select12;

end11:
    printf("end11!\n");
    return 0;
}

=========================================


下面是按时间片来的:

----------------------

// 模拟 按时间片的多任务.
//

#include "stdafx.h"
#include<iostream>
#include<windows.h>

const int tick10=1; //2;
int ticks99=999; //9999;

int ar[4]={0,92,93,94};
int tas1t (int n1,int arn)
{
    //DWORD
//    DWORD t0=GetTickCount();
    for(int i1i=arn;i1i>0; ++i1i) {
        //1处: 从(1处)到(2处)(强制要求)是线程安全的…当然,如果出现阻塞,当然会影响别的时间片的进行,(所以据此只能说是某种程度的时间片多任务
            if (ticks99<=0) break;

            printf("第(%d号窗:还有%d个客人需要服务,还有%d张票,Waiting…",n1, arn,ticks99);
            --arn; ticks99--;
            printf("服务了1个人…还有%d个人需要服务,还剩%d张票!\n",arn, ticks99);
            
            DWORD t1=GetTickCount();
        //2处: 从(1处)到(2处)(强制要求)是线程安全的…
//            if ( (t1-t0)>tick10) goto fan_hui22;
    }//for(int i1i


//fan_hui22:
    return arn;
}

int main(int argc, char* argv[])
{
    DWORD t0=GetTickCount();
    DWORD t1=t0;

    for(int i=1; true; ++i) {
        if (ticks99<=0) break;
        if ( 0>=ar[1]+ar[2]+ar[3] ) break; //没有这句就跑飞!

        int imod=i%4;
        
        switch (i%4)
        {
//            case 1:  if( ar[imod]>0) {ar[imod]=tas1t( imod,ar[imod] ); }
//                        break;
//            case 2:  if( ar[imod]>0) {ar[imod]=tas1t( imod, ar[imod] ); }
//                        break;
            case 0:  break;
            default: if( ar[imod]>0) {
                                        //ar[imod]=tas1t( imod,ar[imod] );
                                        for(int i1i=ar[imod];i1i>0; ++i1i) {
    
                                            if (ticks99<=0) break;
                                            if (ar[imod]<=0) break;

                                                printf("第(%d号窗:还有%d个客人需要服务,还有%d张票,Waiting…", imod, ar[imod],ticks99);
                                                --ar[imod]; ticks99--;
                                                printf("服务了1个人…还有%d个人需要服务,还剩%d张票!\n",ar[imod], ticks99);
            
                                                //DWORD
                                                t1=GetTickCount();
                                                if ( (t1-t0)>tick10) {t0=t1; goto fan_hui11;}
                                        }//for(int i1i
                    
                     }
                        break;
        }//switch(i%4
fan_hui11:

;
    
    }//for(int i

    printf("hello1!");
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值