本文轉載自:http://blog.csdn.net/morixinguan/article/details/50596760
最近在看linux內核的進程調度算法,也寫了不少的內核注釋,也參考了鴻哥的單片機框架,代碼注釋就開源在我的CSDN的Git代碼庫里,有興趣的可以去瞧瞧。
突發奇想,想到了既然單片機能夠實現,那么我用標准C語言同樣也可以實現,試了一下,真的可以!!這讓我如獲至寶!
在UNIX和linux還有window中存在着多線程的機制,其實就是把一個任務分成若干個時間片,這樣越分越細,執行的效果就好像是在同步在執行,其實這是調度算法在產生效果。如果我們不調用那個所謂的pthread函數,用標准C模擬這樣的效果,完全能夠做到,可以做到多任務同時執行,從開始到結束,都是同時開始,同時結束。
廢話不多說,我們上代碼,看看就知道了:
- #include <stdio.h>
- #include <stdlib.h>
- void thread_work1(void);
- void thread_work2(void);
- void thread_work3(void);
- void thread_work4(void);
- void thread_work5(void);
- void thread_work6(void);
- void delay(void);
- int main(void)
- {
- static int i = 5 ;
- static int j ;
- static int k ;
- while(1)
- {
- printf("---------------第%d次調度開始-----------------\n",++j);
- putchar('\n');
- putchar('\n');
- thread_work1();
- thread_work2();
- thread_work3();
- thread_work4();
- thread_work5();
- putchar('\n');
- putchar('\n');
- printf("---------------第%d次調度完成-----------------\n",++k);
- putchar('\n');
- if(i > 0){
- i-- ;
- if(i == 0)
- break;
- }
- }
- return 0 ;
- }
- void thread_work1(void)
- {
- printf("任務一:\n");
- delay();
- static int type = 0;
- static long int i = 5;
- printf("i的值:%d\n",i) ;
- switch(type)
- {
- case 0 :
- if(i > 0)
- i-- ;
- printf("type 0 :i=%d\n",i);
- type = 1 ;
- break ;
- case 1 :
- if(i > 0)
- i-- ;
- printf("type 1 :i=%d\n",i);
- type = 0 ;
- break ;
- }
- }
- void thread_work2(void)
- {
- printf("任務二:\n");
- delay();
- static int type = 0 ;
- static long int i = 5 ;
- printf("i的值:%d\n",i) ;
- switch(type)
- {
- case 0 :
- if(i > 0)
- i-- ;
- printf("type 0 :i=%d\n",i);
- type = 1 ;
- break ;
- case 1 :
- if(i > 0)
- i-- ;
- printf("type 1 :i=%d\n",i);
- type = 0 ;
- break ;
- }
- }
- void thread_work3(void)
- {
- printf("任務三:\n");
- delay();
- static int type = 0 ;
- static long int i = 5 ;
- printf("i的值:%d\n",i) ;
- switch(type)
- {
- case 0 :
- if(i > 0)
- i-- ;
- printf("type 0 :i=%d\n",i);
- type = 1 ;
- break ;
- case 1 :
- if(i > 0)
- i-- ;
- printf("type 1 :i=%d\n",i);
- type = 0 ;
- break ;
- }
- }
- void thread_work4(void)
- {
- printf("任務四:\n");
- delay();
- static int type = 0 ;
- static long int i = 5;
- printf("i的值:%d\n",i) ;
- switch(type)
- {
- case 0 :
- if(i > 0)
- i-- ;
- printf("type 0 :i=%d\n",i);
- type = 1 ;
- break ;
- case 1 :
- if(i > 0)
- i-- ;
- printf("type 1 :i=%d\n",i);
- type = 0 ;
- break ;
- }
- }
- void thread_work5(void)
- {
- printf("任務五:\n");
- delay();
- static int type = 0 ;
- static long int i = 5;
- printf("i的值:%d\n",i) ;
- switch(type)
- {
- case 0 :
- if(i > 0)
- i-- ;
- printf("type 0 :i=%d\n",i);
- type = 1 ;
- break ;
- case 1 :
- if(i > 0)
- i-- ;
- printf("type 1 :i=%d\n",i);
- type = 0 ;
- break ;
- }
- }
- void delay(void)
- {
- long int i = 0xffffff ;
- while(i > 0)
- i-- ;
- }
我們看到,上面的5個任務其實是在執行同一個操作,就是將5減到0的操作,一些初學者可能會想,函數不是執行完一個,然后再執行下一個嗎?那么我們看看運行結果,這會讓你大吃一驚,事實就是這樣,不信咱們看看:
看到最后的結果,是否覺得很神奇?其實關鍵就是每個函數里的static這個關鍵字,它保留了執行完上一次數值的狀態,再者就是每個函數中都有一個switch的分支,這樣的分支就實現了輪流切換。在我的代碼里,該代碼經過5次調度完成后,數值從5變為0,而且每一個任務都是實現單獨運行,卻沒有相互干擾,正是這樣的機制,運用到單片機和裸板上,這無非就是一種非常好的框架!!!