pc上用C语言模拟51多任务的案例程序
#include <stdio.h>
#include <stdlib.h>
//任务槽个数.在本例中并未考虑任务换入换出,所以实际运行的任务有多少个,
//就定义多少个任务槽,不可多定义或少定义
#define MAX_TASKS 5
//任务的栈指针
unsigned char *task_sp[MAX_TASKS];
//最大栈深.最低不得少于2个,保守值为12.
//预估方法:以2为基数,每增加一层函数调用,加2字节.
//如果其间可能发生中断,则还要再加上中断需要的栈深.
//减小栈深的方法:1.尽量少嵌套子程序 2.调子程序前关中断.
#define MAX_TASK_DEP 12
unsigned char task_stack[MAX_TASKS][MAX_TASK_DEP] =
{
0,1,2,3,4,5,6,7,8,9,'a',9,8,7,6,5,4,3,2,1,0,11,12,13,113,31,4
};//任务堆栈.
//任务装入函数.将指定的函数(参数1)装入指定(参数2)的任务槽中.
//如果该槽中原来就有任务,则原任务丢失,但系统本身不会发生错误.
//将各任务的函数地址的低字节和高字节分别入在
//task_stack[任务号][0]和task_stack[任务号][1]中
void task_load(unsigned int fn, unsigned char tid)
{
task_sp[tid] = task_stack[tid] + 1;
task_stack[tid][0] = (unsigned int)fn & 0xff;
task_stack[tid][1] = (unsigned int)fn >> 8;
}
void func1()
{
static unsigned char i;
i = 0;
while(1)
{
if(i<250)
{
i++;
}
if(i>=250)
{
printf("task1\n");
i = 0;
}
//task_switch();
}
}
void func2()
{
static unsigned int j;
j = 0;
while(1)
{
if(j<654)
{
j++;
}
if(j>=654)
{
printf("task2\n");
j = 0;
}
//task_switch();
}
}
int main()
{
printf("Hello world!\n");
printf("task_stack[0] = %p\n",task_stack[0]);
printf("task_stack+0 = %p\n",task_stack+0);
printf("task_stack+1 = %p\n",task_stack+1);
printf("task_stack+2 = %p\n",task_stack+2);
printf("task_stack+3 = %p\n",task_stack+3);
printf("task_stack+4 = %p\n",task_stack+4);
printf("task_stack[0] = %p\n",task_stack[0]);
printf("*(task_stack+0) = %p\n",*(task_stack+0));
printf("*(task_stack+1) = %p\n",*(task_stack+1));
printf("*(task_stack+2) = %p\n",*(task_stack+2));
printf("*(task_stack+3) = %p\n",*(task_stack+3));
printf("*(task_stack+4) = %p\n",*(task_stack+4));
printf("task_stack[0] = %p\n",task_stack[0]);
printf("*(task_stack+0)+0 = %p\n",*(task_stack+0)+0);
printf("*(task_stack+1)+1 = %p\n",*(task_stack+1)+1);
printf("*(task_stack+2)+2 = %p\n",*(task_stack+2)+2);
printf("*(task_stack+3)+3 = %p\n",*(task_stack+3)+3);
printf("*(task_stack+4)+4 = %p\n",*(task_stack+4)+4);
task_sp[0] = (task_stack[0]+1);
task_sp[1] = (task_stack[0]+2);
task_sp[2] = (task_stack[0]+3);
task_sp[3] = (task_stack[0]+4);
task_sp[4] = (task_stack[0]+5);
//task_sp[0] = *(task_stack+0)+9;
printf("task_stack = %p\n",task_stack);
printf("task_stack[0] + 5 = %p\n",(task_stack[0] + 5));
printf("task_sp = %p\n",task_sp);
printf("\ntask_sp[0] = %d\n",task_sp[0]);
printf("task_sp[1] = %d\n",task_sp[1]);
printf("task_sp[2] = %d\n",task_sp[2]);
printf("task_sp[3] = %d\n",task_sp[3]);
printf("task_sp[4] = %d\n",task_sp[4]);
//task_load(func1, 0);//将func1函数装入0号槽
//task_load(func2, 1);//将func2函数装入1号槽
return 0;
}
Hello world!
task_stack[0] = 00403000
task_stack+0 = 00403000
task_stack+1 = 0040300C
task_stack+2 = 00403018
task_stack+3 = 00403024
task_stack+4 = 00403030
task_stack[0] = 00403000
*(task_stack+0) = 00403000
*(task_stack+1) = 0040300C
*(task_stack+2) = 00403018
*(task_stack+3) = 00403024
*(task_stack+4) = 00403030
task_stack[0] = 00403000
*(task_stack+0)+0 = 00403000
*(task_stack+1)+1 = 0040300D
*(task_stack+2)+2 = 0040301A
*(task_stack+3)+3 = 00403027
*(task_stack+4)+4 = 00403034
task_stack = 00403000
task_stack[0] + 5 = 00403005
task_sp = 004050B0
task_sp[0] = 4206593
task_sp[1] = 4206594
task_sp[2] = 4206595
task_sp[3] = 4206596
task_sp[4] = 4206597
Terminated with return code 0
Press any key to continue ...
pc上用C语言模拟51多任务的案例程序的更多相关文章
- [数据结构] 用C语言模拟一个简单的队列程序
#include<stdio.h> #include <stdlib.h> #include<string.h> #include<math.h> // ...
- 在PC上测试移动端网站和模拟手机浏览器的5大方法
在PC上测试移动端网站和模拟手机浏览器的5大方法 来源:互联网 作者:佚名 时间:03-19 10:14:54 [大 中 小] 最近公司要开发网站的移动版,让我准备准备知 ...
- PC上安装多个操作系统
目 录 第1章 绪论 1 1.1 目标 1 1.2 适宜的读者 1 第2章 制作启动U盘 2 2.1 初级安装 2 2.2 启动分析 3 2.3 高级安装 1 ...
- mac os x在PC上安装
系统安装之前的准备工作及安装过程简介 前面我们已经提到,苹果电脑虽然已经采用了x86架构的Intel处理器,但其官方并不提供在非苹果电脑上安装Mac OS的支持.所以,要想在普通PC/笔记本电脑上安装 ...
- 让你在PC上调试Web App,UC浏览器发布开发者版
目前,在手机上使用浏览器访问网页,无法便捷地进行网页语言调试.手机屏幕相对较小且操作不便,直接在手机上进行网页数据调试不太现实. 因此,UC使用技术将手机网页调试信息分离,实现一种能在大屏幕.高配置P ...
- 我用爬虫一天时间“偷了”知乎一百万用户,只为证明PHP是世界上最好的语言
我用爬虫一天时间“偷了”知乎一百万用户,只为证明PHP是世界上最好的语言 2015-08-06 猿圈 我用爬虫一天时间“偷了”知乎一百万用户 只为证明PHP是世界上最好的语言 看了不少朋友圈里推荐的P ...
- PC 上的 LVM 灾难修复
LVM 介绍 LVM 简介 LVM 是逻辑盘卷管理(Logical Volume Manager)的简称,最早是 IBM 为 AIX 研发的存储管理机制.LVM 通过在硬盘和分区之间建立一个逻辑层,可 ...
- NFC手机上基于软件的卡模拟 重大利好还是安全噩梦?(转)
Software Card Emulation in NFC-enabled Mobile Phones: GreatAdvantage or Security Nightmare? Michael ...
- 绕过限制,在PC上调试微信手机页面
场景 假设一个手机页面,开发者对其做了限制,导致只能在微信客户端中打开.而众所周知手机上非常不利于调试页面,所以需要能在电脑上打开并进行调试.这里针对常见的三种页面做一下分析,一一绕过其限制,(当然不 ...
随机推荐
- 【HDU5306】【DTOJ2481】Gorgeous Sequence【线段树】
题目大意:给你一个序列a,你有三个操作,0: x y t将a[x,y]和t取min:1:x y求a[x,y]的最大值:2:x y求a[x,y]的sum 题解:首先很明显就是线段树裸题,那么考虑如何维护 ...
- selenium问题之定位不到元素(NoSuchElementException)
在使用selenium+爬虫的时候,经常会遇到一个问题,就是NoSuchElementException,定位不到元素的问题 一,打开了新页面,一般selenium点击新链接跳转打开了一个新页面,那么 ...
- 富文本编辑器——百度UEditor插件安装教程
一.使用环境 Win7 Eclipse jettty9 chrome 二.下载百度UEditor插件 1.下载地址:http://ueditor.baidu.com/website/download. ...
- 累加器A与ACC区别
累加器写成A或ACC在51汇编语言指令中是有区别的. ACC在汇编后的机器码必有一个字节的操作数,即累加器的字节地址E0H,A在汇编后则隐含在指令操作码中.所以在指令中A不能用ACC来替代,而对A的特 ...
- IDEA默认快捷键
idea常用快捷键大全 Idea常用快捷键大全,拿小本本记下来,忘记了可以方便查找.编写代码Ctrl+Shift + Enter,语句完成“!”,否定完成,输入表达式时按 “!”键Ctrl+E,最 ...
- DB-概念-同义词:同义词/Synonym
ylbtech-DB-概念-同义词:同义词/Synonym 同义词的概念 :英文(synonym)是指向其它数据库表的数据库指针.同义词有私有(private)和公共(public)两种类型. 1.返 ...
- springboot 尚桂谷学习总结02
------向导快速创建Springboot 项目------ 1.使用spring initializer 快速创建一个springboot 项目 选择后 最后点击finsh 向导会联网创建 spr ...
- Engineer Assignment(暴力+状压dp)
题意: n个工程,m个研究员,每个工程需要Ci个领域(X1,X2..Xci)的研究员 ,每个研究员会Di个不同的领域(X1,X2..Xdi),要完成一个工程必须使得分配给这个工程的研究员覆盖了这个工程 ...
- sourcetree配置gitlab
一.准备 1.安装git,下载地址:https://git-scm.com/download 安装教程百度一下 git客户端(1.产生gitlab服务端和本地git相互传输时所需要校验的私钥 ...
- Git的安装配置
Git是什么 Git是一款免费.开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. 与常用的版本控制工具CVS.Subversion等不同的是它采用了分布式版本库的方式,不必 ...