用简单的C语言实现多任务轮流切换(模拟操作系统线程机制)
最近在看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,而且每一个任务都是实现单独运行,却没有相互干扰,正是这样的机制,运用到单片机和裸板上,这无非就是一种非常好的框架!!!
用简单的C语言实现多任务轮流切换(模拟操作系统线程机制)的更多相关文章
- LANG=C是最早最简单的C语言环境(标准ASCII码)
LANG=C是最早最简单的C语言环境(标准ASCII码)
- 简单的C语言编译器--概述
在学习了编译原理的相关知识后,逐渐的掌握一个编译器的结构.作用和实现方法.同时,希望自己在不断的努力下写出一个简单的C语言编译器. 实现步骤 词法分析器:将C语言测试代码分解成一个一个的词法单元: ...
- 一个简单的C语言程序(详解)
C Primer Plus之一个简单的C语言程序(详解) #include <stdio.h> int main(void) //一个简单的 C程序 { int num; //定义一个名为 ...
- 利用OD破解一个简单的C语言程序
最近在学习汇编(看的是王爽老师的<汇编语言(第三版)>),然后想尝试使用OD(Ollydbg)软件破解一个简单的C语言程序练练手. 环境: C语言编译环境:VC++6.0 系统:在Wind ...
- C++中的虚函数(表)实现机制以及用C语言对其进行的模拟实现
tfref 前言 C++对象的内存布局 只有数据成员的对象 没有虚函数的对象 拥有仅一个虚函数的对象 拥有多个虚函数的对象 单继承且本身不存在虚函数的继承类的内存布局 本身不存在虚函数(不严谨)但存在 ...
- 如何让c语言使用结构体近似模拟c++中的类
如今统治市场的主流编程语言,如c++,java,大都是面向对象类型的编程语言. 而众所周知,c语言是面向过程的编程语言,但是它拥有一个类似于类的结构,叫做结构体,主要的区别在于结构体无法定义函数. 因 ...
- neo4j初次使用学习简单操作-cypher语言使用
Neo4j 使用cypher语言进行操作 Cypher语言是在学习Neo4j时用到数据库操作语言(DML),涵盖对图数据的增删改查 neo4j数据库简单除暴理解的概念: Neo4j中不存在表的概念, ...
- 简单的C语言小学四则运算设计
题目:设计一个简单的四则运算编辑器 思路:我使用的是C语言编程,看到题目首先要随机出3个随机数,其中两个为100以内的随机数(a,b),一个为0~3的随机数(k). k值的变化使得+ - * /的变化 ...
- 从一个新手容易混淆的例子简单分析C语言中函数调用过程
某天,王尼玛写了段C程序: #include <stdio.h> void input() { int i; ]; ; i < ; i++) { array[i] = i; } } ...
随机推荐
- Dynamics CRM2016 关于修改部署管理员账号权限引发的问题
最近在用2016做项目,一个同事的一个操作给我带来了一个头疼的问题,他把部署管理员的CRM账号的管理员权限给移除了,导致整个系统的所有账号进CRM都是下图这样 即使系统中还存在其他的拥有管理员权限的账 ...
- java集合循环删除
java集合循环删除,java list集合操作,java循环.分享牛,分享牛原创.java集合删除方法. 2.6.1.第一种方式 list.add("1"); list.add( ...
- [sed]命令笔记
sed是linux下经常用到的工具,英文全名为stream editor. sed 在windows上的实现可以在这里找到 http://gnuwin32.sourceforge.net/packag ...
- C++:如何删除string对象的末尾非数字字符
功能实现: 现有一个string对象包含数字字符以及非数字字符,实现删除string对象的末尾非数字字符. 实例: 输入为"0 1 1 2 3 " 输出为"0 1 ...
- JAVA面向对象-----super关键字
JAVA面向对象-–super关键字 1:定义Father(父类)类 1:成员变量int x=1; 2:构造方法无参的和有参的,有输出语句 2:定义Son类extends Father类 1:成员变量 ...
- 关于Lt分发系统的时序图分析
我们已经知道,系统共分为两个模块,mather与son 同时系统允许的操作也有三种,向mather提交war包,我某个服务器更新代码,为所有服务器更新代码 我们一个一个来看 先说,向mather提交w ...
- 2.Cocos2d-x-3.2编写3d打飞机,项目代码总结
1.AppDelete中applicationDidFinishLaunching代码示范 2.当电话来了时,停止恢复游戏声音的代码(在AppDelegate中加入下面代码) boolAppDel ...
- ROS讲座 关于ROS2和Gazebo C++ in Open Source Robotics
分享一个不错的介绍ROS2和Gazebo的视频讲座. Gazebo中的云彩飘动起来了!!!! 超清视频分享网址: http://v.youku.com/v_show/id_XMTcyMzY0Nz ...
- ENVI自带的非监督分类测试情况
最近写了两个关于遥感图像的简单的非监督分类算法KMEAN和ISODATA,发现结果和ENVI的一直有差异,而且还蛮大的,找了好久也没有找到原因.于是用PS自己绘制了一个简单的图像用于测试.如图1所示, ...
- C++对象模型的那些事儿之五:NRV优化和初始化列表
前言 在C++对象模型的那些事儿之四:拷贝构造函数中提到如果将一个对象作为函数参数或者返回值的时候,会调用拷贝构造函数,编译器是如何处理这些步骤,又会对其做哪些优化呢?本篇博客就为他家介绍一个编译器的 ...