用简单的C语言实现多任务轮流切换(模拟操作系统线程机制)【转】
2017-01-30 23:22
711 查看
本文转载自:http://blog.csdn.net/morixinguan/article/details/50596760
最近在看linux内核的进程调度算法,也写了不少的内核注释,也参考了鸿哥的单片机框架,代码注释就开源在我的CSDN的Git代码库里,有兴趣的可以去瞧瞧。
突发奇想,想到了既然单片机能够实现,那么我用标准C语言同样也可以实现,试了一下,真的可以!!
这让我如获至宝!
在UNIX和linux还有window中存在着多线程的机制,其实就是把一个任务分成若干个时间片,这样越分越细,执行的效果就好像是在同步在执行,其实这是调度算法在产生效果。如果我们不调用那个所谓的pthread函数,用标准C模拟这样的效果,完全能够做到,可以做到多任务同时执行,从开始到结束,都是同时开始,同时结束。
废话不多说,我们上代码,看看就知道了:
[cpp] view plain copy
print?
#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,而且每一个任务都是实现单独运行,却没有相互干扰,正是这样的机制,运用到单片机和裸板上,这无非就是一种非常好的框架!!!
最近在看linux内核的进程调度算法,也写了不少的内核注释,也参考了鸿哥的单片机框架,代码注释就开源在我的CSDN的Git代码库里,有兴趣的可以去瞧瞧。
突发奇想,想到了既然单片机能够实现,那么我用标准C语言同样也可以实现,试了一下,真的可以!!
这让我如获至宝!
在UNIX和linux还有window中存在着多线程的机制,其实就是把一个任务分成若干个时间片,这样越分越细,执行的效果就好像是在同步在执行,其实这是调度算法在产生效果。如果我们不调用那个所谓的pthread函数,用标准C模拟这样的效果,完全能够做到,可以做到多任务同时执行,从开始到结束,都是同时开始,同时结束。
废话不多说,我们上代码,看看就知道了:
[cpp] view plain copy
print?
#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语言实现多任务轮流切换(模拟操作系统线程机制)
- 用简单的C语言实现多任务轮流切换(模拟操作系统线程机制)
- 纯C语言实现简单继承机制
- 一个简单的32位多任务操作系统的实现
- 一步一步实现一个简单的OS(试验任务切换)
- 利用C语言实现POST数据包如此简单【模拟网页提交表单】
- 用C语言实现对N个进程的简单时间片轮转法Round Robin的调度模拟
- 一个简单的32位多任务操作系统的实现
- 操作系统,模拟进程管理之PCB块管理法,C语言实现
- 模拟QQ侧滑控件 实现三种界面切换效果(知识点:回调机制,解析网络json数据,fragment用法等)。
- linux0.11学习笔记-技术铺垫-简单AB任务切换程序(1)-实现一个简单的bootloader
- 协议实现:如何实现一个最简单的通信协议(线程模拟)
- linux0.11学习笔记-技术铺垫-简单AB任务切换程序(5)-实现三个任务切换
- C语言模拟通讯录系统的简单实现
- 【操作系统】C语言模拟操作系统实现动态分区分配算法
- linux0.11学习笔记-技术铺垫-简单AB任务切换程序(5)-实现三个任务切换
- linux0.11学习笔记-技术铺垫-简单AB任务切换程序(1)-实现一个简单的bootloader
- c++ 简单模拟实现 游戏定时开启任务
- C++中的虚函数(表)实现机制以及用C语言对其进行的模拟实现