用簡單的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次調度開始-----------------\n",++j);  
  20.         putchar('\n');  
  21.         putchar('\n');  
  22.         thread_work1();  
  23.         thread_work2();  
  24.         thread_work3();  
  25.         thread_work4();  
  26.         thread_work5();  
  27.         putchar('\n');  
  28.         putchar('\n');  
  29.         printf("---------------第%d次調度完成-----------------\n",++k);  
  30.         putchar('\n');  
  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("任務一:\n");  
  44.     delay();  
  45.     static int type = 0;   
  46.     static long int i = 5;  
  47.     printf("i的值:%d\n",i) ;  
  48.     switch(type)  
  49.         {  
  50.             case 0 :   
  51.                    if(i > 0)  
  52.                        i-- ;   
  53.                    printf("type 0 :i=%d\n",i);  
  54.                    type = 1 ;   
  55.                    break ;   
  56.             case 1 :   
  57.                    if(i > 0)  
  58.                     i-- ;  
  59.                     printf("type 1 :i=%d\n",i);  
  60.                    type = 0 ;  
  61.                    break ;  
  62.         }  
  63. }  
  64.   
  65. void thread_work2(void)  
  66. {  
  67.     printf("任務二:\n");  
  68.     delay();  
  69.     static int type = 0 ;   
  70.     static long int i = 5 ;  
  71.     printf("i的值:%d\n",i) ;   
  72.     switch(type)  
  73.     {  
  74.         case 0 :  
  75.                 if(i > 0)  
  76.                     i-- ;  
  77.                 printf("type 0 :i=%d\n",i);  
  78.                 type = 1 ;  
  79.                 break ;  
  80.         case 1 :  
  81.                 if(i > 0)  
  82.                     i-- ;  
  83.                 printf("type 1 :i=%d\n",i);  
  84.                 type = 0 ;   
  85.                 break ;  
  86.     }  
  87. }  
  88.   
  89. void thread_work3(void)  
  90. {  
  91.     printf("任務三:\n");  
  92.     delay();  
  93.     static int type = 0 ;   
  94.     static long int i = 5 ;   
  95.     printf("i的值:%d\n",i) ;  
  96.     switch(type)  
  97.     {  
  98.         case 0 :  
  99.                 if(i > 0)  
  100.                     i-- ;  
  101.                 printf("type 0 :i=%d\n",i);  
  102.                 type = 1 ;  
  103.                 break ;  
  104.         case 1 :  
  105.                 if(i > 0)  
  106.                     i-- ;  
  107.                 printf("type 1 :i=%d\n",i);  
  108.                 type = 0 ;   
  109.                 break ;  
  110.     }  
  111. }  
  112.   
  113. void thread_work4(void)  
  114. {  
  115.     printf("任務四:\n");  
  116.     delay();  
  117.     static int type = 0 ;   
  118.     static long int i = 5;   
  119.     printf("i的值:%d\n",i) ;  
  120.     switch(type)  
  121.     {  
  122.         case 0 :  
  123.                 if(i > 0)  
  124.                     i-- ;  
  125.                 printf("type 0 :i=%d\n",i);  
  126.                 type = 1 ;  
  127.                 break ;  
  128.         case 1 :  
  129.                 if(i > 0)  
  130.                     i-- ;  
  131.                 printf("type 1 :i=%d\n",i);  
  132.                 type = 0 ;   
  133.                 break ;  
  134.     }  
  135. }  
  136.   
  137. void thread_work5(void)  
  138. {  
  139.     printf("任務五:\n");  
  140.     delay();  
  141.     static int type = 0 ;   
  142.     static long int i = 5;   
  143.     printf("i的值:%d\n",i) ;  
  144.     switch(type)  
  145.     {  
  146.         case 0 :  
  147.                 if(i > 0)  
  148.                     i-- ;  
  149.                 printf("type 0 :i=%d\n",i);  
  150.                 type = 1 ;  
  151.                 break ;  
  152.         case 1 :  
  153.                 if(i > 0)  
  154.                     i-- ;  
  155.                 printf("type 1 :i=%d\n",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,而且每一個任務都是實現單獨運行,卻沒有相互干擾,正是這樣的機制,運用到單片機和裸板上,這無非就是一種非常好的框架!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM