用简单的C语言实现多任务轮流切换(模拟操作系统线程机制)
2016-01-27 21:44
591 查看
最近在看linux内核的进程调度算法,也写了不少的内核注释,也参考了鸿哥的单片机框架,代码注释就开源在我的CSDN的git代码库里,有兴趣的可以去瞧瞧。
突发奇想,想到了既然单片机能够实现,那么我用标准C语言同样也可以实现,试了一下,真的可以!!
这让我如获至宝!
在UNIX和linux还有window中存在着多线程的机制,其实就是把一个任务分成若干个时间片,这样越分越细,执行的效果就好像是在同步在执行,其实这是调度算法在产生效果。如果我们不调用那个所谓的pthread函数,用标准C模拟这样的效果,完全能够做到,可以做到多任务同时执行,从开始到结束,都是同时开始,同时结束。
废话不多说,我们上代码,看看就知道了:
看到最后的结果,是否觉得很神奇?
其实关键就是每个函数里的static这个关键字,它保留了执行完上一次数值的状态,再者就是每个函数中都有一个switch的分支,这样的分支就实现了轮流切换。在我的代码里,该代码经过5次调度完成后,数值从5变为0,而且每一个任务都是实现单独运行,却没有相互干扰,正是这样的机制,运用到单片机和裸板上,这无非就是一种非常好的框架!!!
突发奇想,想到了既然单片机能够实现,那么我用标准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,而且每一个任务都是实现单独运行,却没有相互干扰,正是这样的机制,运用到单片机和裸板上,这无非就是一种非常好的框架!!!
相关文章推荐
- 用简单的C语言实现多任务轮流切换(模拟操作系统线程机制)
- C++:const限定符基本解析
- Guess Your Way Out! II---cf 558D (区间覆盖,c++STL map 的使用)
- 【手打】LZW编码的C/C++实现
- 英语数字转换器
- C++文件读写
- 小蚂蚁学习C语言(36)——题目——字符串的倒置
- UTF-8, Unicode, GB2312格式串转换之C语言版
- [土狗之路]coursera上C语言进阶第二周作业
- 类和对象—复数类
- C++ 类模板
- 快速排序算法的实现
- C++小实验:在C++中实现类似于动态语言函数定义的宏
- C语言-----算法
- 20160126.CCPP体系详解(0005天)
- C++项目文件中的后缀名为SDF的文件是什么?有什么用?
- effective C++ 笔记二
- C++:wchar_t 和C++新增类型:char16_t char32_t
- using c++11 standerd in qt
- C语言学习笔记 逻辑结构关键字