• 用简单的C语言实现多任务轮流切换(模拟操作系统线程机制)【转】


    本文转载自:http://blog.csdn.net/morixinguan/article/details/50596760

    最近在看linux内核的进程调度算法,也写了不少的内核注释,也参考了鸿哥的单片机框架,代码注释就开源在我的CSDN的Git代码库里,有兴趣的可以去瞧瞧。

    突发奇想,想到了既然单片机能够实现,那么我用标准C语言同样也可以实现,试了一下,真的可以!!大笑大笑大笑这让我如获至宝!生气

    在UNIX和linux还有window中存在着多线程的机制,其实就是把一个任务分成若干个时间片,这样越分越细,执行的效果就好像是在同步在执行,其实这是调度算法在产生效果。如果我们不调用那个所谓的pthread函数,用标准C模拟这样的效果,完全能够做到,可以做到多任务同时执行,从开始到结束,都是同时开始,同时结束。

            废话不多说,我们上代码,看看就知道了:大笑

    [cpp] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. #include <stdio.h>  
    2. #include <stdlib.h>  
    3.   
    4. void  thread_work1(void);  
    5. void  thread_work2(void);   
    6. void  thread_work3(void);  
    7. void  thread_work4(void);  
    8. void  thread_work5(void);  
    9. void  thread_work6(void);  
    10. void  delay(void);  
    11.   
    12. int main(void)  
    13. {  
    14.     static int i = 5 ;  
    15.     static int j ;  
    16.     static int k ;  
    17.     while(1)  
    18.     {  
    19.         printf("---------------第%d次调度开始----------------- ",++j);  
    20.         putchar(' ');  
    21.         putchar(' ');  
    22.         thread_work1();  
    23.         thread_work2();  
    24.         thread_work3();  
    25.         thread_work4();  
    26.         thread_work5();  
    27.         putchar(' ');  
    28.         putchar(' ');  
    29.         printf("---------------第%d次调度完成----------------- ",++k);  
    30.         putchar(' ');  
    31.         if(i > 0){  
    32.             i-- ;  
    33.             if(i == 0)  
    34.                 break;   
    35.         }  
    36.     }  
    37.       
    38.     return 0 ;  
    39. }  
    40.   
    41. void thread_work1(void)  
    42. {  
    43.     printf("任务一: ");  
    44.     delay();  
    45.     static int type = 0;   
    46.     static long int i = 5;  
    47.     printf("i的值:%d ",i) ;  
    48.     switch(type)  
    49.         {  
    50.             case 0 :   
    51.                    if(i > 0)  
    52.                        i-- ;   
    53.                    printf("type 0 :i=%d ",i);  
    54.                    type = 1 ;   
    55.                    break ;   
    56.             case 1 :   
    57.                    if(i > 0)  
    58.                     i-- ;  
    59.                     printf("type 1 :i=%d ",i);  
    60.                    type = 0 ;  
    61.                    break ;  
    62.         }  
    63. }  
    64.   
    65. void thread_work2(void)  
    66. {  
    67.     printf("任务二: ");  
    68.     delay();  
    69.     static int type = 0 ;   
    70.     static long int i = 5 ;  
    71.     printf("i的值:%d ",i) ;   
    72.     switch(type)  
    73.     {  
    74.         case 0 :  
    75.                 if(i > 0)  
    76.                     i-- ;  
    77.                 printf("type 0 :i=%d ",i);  
    78.                 type = 1 ;  
    79.                 break ;  
    80.         case 1 :  
    81.                 if(i > 0)  
    82.                     i-- ;  
    83.                 printf("type 1 :i=%d ",i);  
    84.                 type = 0 ;   
    85.                 break ;  
    86.     }  
    87. }  
    88.   
    89. void thread_work3(void)  
    90. {  
    91.     printf("任务三: ");  
    92.     delay();  
    93.     static int type = 0 ;   
    94.     static long int i = 5 ;   
    95.     printf("i的值:%d ",i) ;  
    96.     switch(type)  
    97.     {  
    98.         case 0 :  
    99.                 if(i > 0)  
    100.                     i-- ;  
    101.                 printf("type 0 :i=%d ",i);  
    102.                 type = 1 ;  
    103.                 break ;  
    104.         case 1 :  
    105.                 if(i > 0)  
    106.                     i-- ;  
    107.                 printf("type 1 :i=%d ",i);  
    108.                 type = 0 ;   
    109.                 break ;  
    110.     }  
    111. }  
    112.   
    113. void thread_work4(void)  
    114. {  
    115.     printf("任务四: ");  
    116.     delay();  
    117.     static int type = 0 ;   
    118.     static long int i = 5;   
    119.     printf("i的值:%d ",i) ;  
    120.     switch(type)  
    121.     {  
    122.         case 0 :  
    123.                 if(i > 0)  
    124.                     i-- ;  
    125.                 printf("type 0 :i=%d ",i);  
    126.                 type = 1 ;  
    127.                 break ;  
    128.         case 1 :  
    129.                 if(i > 0)  
    130.                     i-- ;  
    131.                 printf("type 1 :i=%d ",i);  
    132.                 type = 0 ;   
    133.                 break ;  
    134.     }  
    135. }  
    136.   
    137. void thread_work5(void)  
    138. {  
    139.     printf("任务五: ");  
    140.     delay();  
    141.     static int type = 0 ;   
    142.     static long int i = 5;   
    143.     printf("i的值:%d ",i) ;  
    144.     switch(type)  
    145.     {  
    146.         case 0 :  
    147.                 if(i > 0)  
    148.                     i-- ;  
    149.                 printf("type 0 :i=%d ",i);  
    150.                 type = 1 ;  
    151.                 break ;  
    152.         case 1 :  
    153.                 if(i > 0)  
    154.                     i-- ;  
    155.                 printf("type 1 :i=%d ",i);  
    156.                 type = 0 ;   
    157.                 break ;  
    158.     }     
    159. }  
    160.   
    161. void delay(void)  
    162. {  
    163.     long int i = 0xffffff ;  
    164.     while(i > 0)  
    165.         i-- ;   
    166. }  

    我们看到,上面的5个任务其实是在执行同一个操作,就是将5减到0的操作,一些初学者可能会想,函数不是执行完一个,然后再执行下一个吗?那么我们看看运行结果,这会让你大吃一惊,事实就是这样,不信咱们看看:

    看到最后的结果,是否觉得很神奇?大笑其实关键就是每个函数里的static这个关键字,它保留了执行完上一次数值的状态,再者就是每个函数中都有一个switch的分支,这样的分支就实现了轮流切换。在我的代码里,该代码经过5次调度完成后,数值从5变为0,而且每一个任务都是实现单独运行,却没有相互干扰,正是这样的机制,运用到单片机和裸板上,这无非就是一种非常好的框架!!!

  • 相关阅读:
    osg::BlendFunc来设置透明度
    LCA(Tarjan)
    CODEVS1073 家族 (并查集)
    CODEVS1533 互斥的数(哈希表)
    2014-12-4
    BZOJ2661 连连看 (费用流)
    2014-11-30
    JAVA语法基础作业——动手动脑以及课后实验性问题
    课后作业01——相加
    再读大道至简第二章
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/6358504.html
Copyright © 2020-2023  润新知