最近在看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语言实现多任务轮流切换(模拟操作系统线程机制)的更多相关文章

  1. LANG=C是最早最简单的C语言环境(标准ASCII码)

    LANG=C是最早最简单的C语言环境(标准ASCII码)

  2. 简单的C语言编译器--概述

      在学习了编译原理的相关知识后,逐渐的掌握一个编译器的结构.作用和实现方法.同时,希望自己在不断的努力下写出一个简单的C语言编译器. 实现步骤 词法分析器:将C语言测试代码分解成一个一个的词法单元: ...

  3. 一个简单的C语言程序(详解)

    C Primer Plus之一个简单的C语言程序(详解) #include <stdio.h> int main(void) //一个简单的 C程序 { int num; //定义一个名为 ...

  4. 利用OD破解一个简单的C语言程序

    最近在学习汇编(看的是王爽老师的<汇编语言(第三版)>),然后想尝试使用OD(Ollydbg)软件破解一个简单的C语言程序练练手. 环境: C语言编译环境:VC++6.0 系统:在Wind ...

  5. C++中的虚函数(表)实现机制以及用C语言对其进行的模拟实现

    tfref 前言 C++对象的内存布局 只有数据成员的对象 没有虚函数的对象 拥有仅一个虚函数的对象 拥有多个虚函数的对象 单继承且本身不存在虚函数的继承类的内存布局 本身不存在虚函数(不严谨)但存在 ...

  6. 如何让c语言使用结构体近似模拟c++中的类

    如今统治市场的主流编程语言,如c++,java,大都是面向对象类型的编程语言. 而众所周知,c语言是面向过程的编程语言,但是它拥有一个类似于类的结构,叫做结构体,主要的区别在于结构体无法定义函数. 因 ...

  7. neo4j初次使用学习简单操作-cypher语言使用

    Neo4j 使用cypher语言进行操作 Cypher语言是在学习Neo4j时用到数据库操作语言(DML),涵盖对图数据的增删改查  neo4j数据库简单除暴理解的概念: Neo4j中不存在表的概念, ...

  8. 简单的C语言小学四则运算设计

    题目:设计一个简单的四则运算编辑器 思路:我使用的是C语言编程,看到题目首先要随机出3个随机数,其中两个为100以内的随机数(a,b),一个为0~3的随机数(k). k值的变化使得+ - * /的变化 ...

  9. 从一个新手容易混淆的例子简单分析C语言中函数调用过程

    某天,王尼玛写了段C程序: #include <stdio.h> void input() { int i; ]; ; i < ; i++) { array[i] = i; } } ...

随机推荐

  1. eclipse安装和中文汉化,以及配置

    官网下载 eclipse http://www.eclipse.org/downloads/eclipse-packages/ ----选择 "Eclipse IDE for Java De ...

  2. Swift按照数组元素出现的次数及大小排序

    要求如下: 1.已知一个数组,按照单个元素在数组中出现的次数作为重新排序的依据,个数多的排在前面 2.相同个数时候,元素值大的排前面 例子: [1, 2, 2, 3, 5, 5] 经过计算得到的结果是 ...

  3. J2EE进阶(十六)Hibernate 中getHibernateTemplate()方法使用

    J2EE进阶(十六)Hibernate 中getHibernateTemplate()方法使用   spring 中获得由spring所配置的hibernate的操作对象,然后利用此对象进行,保存,修 ...

  4. Spark技术内幕:Storage 模块整体架构

    Storage模块负责了Spark计算过程中所有的存储,包括基于Disk的和基于Memory的.用户在实际编程中,面对的是RDD,可以将RDD的数据通过调用org.apache.spark.rdd.R ...

  5. ORACLE EBS 表空间控制

    --1G=1024MB --1M=1024KB --1K=1024Bytes --1M=11048576Bytes --1G=1024*11048576Bytes=11313741824Bytes S ...

  6. Python optparser库详解

    一直以来对optparser不是特别的理解,今天就狠下心,静下心研究了一下这个库.当然了,不敢说理解的很到位,但是足以应付正常的使用了.废话不多说,开始今天的分享吧. 简介 optparse模块主要用 ...

  7. 一个ExtJS实例

    聊聊ExtJS 这几天接触了一个项目 前台用的是extjs 发现这个东西还是有点意思的  就把前台的部分 剥离了下来 有兴趣的朋友可以当做模板学习 不多说先上效果图 这篇文章 可以看作是ext知识的一 ...

  8. (NO.00004)iOS实现打砖块游戏(十六):导弹发射道具的实现(下)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 上一篇我们完成了导弹道具相关的道具制作,本篇中我们来完成其实现 ...

  9. 使用JavaScript在Canvas上画出一片星空

    随着Html5的迅猛发展,画布也变得越来越重要.下面我就写一个关于在canvas上画出一片星空的简单的代码的示例. 理论基础 初始化一个canvas,获得一个用于绘制图形的上下文环境context.并 ...

  10. [GitHub]第六讲:开源项目贡献流程

    Github 是目前世界上最大的开源项目的托管交流平台.贡献开源项目的流程也是 Github 全力支持的,也一样是遵循 Github Flow,虽然跟前面团队合作流程会有一点差别.在团队内部,大家都是 ...