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上调试微信手机页面
场景 假设一个手机页面,开发者对其做了限制,导致只能在微信客户端中打开.而众所周知手机上非常不利于调试页面,所以需要能在电脑上打开并进行调试.这里针对常见的三种页面做一下分析,一一绕过其限制,(当然不 ...
随机推荐
- 常用jstl
求list中某一值的和 <c:set var="total" value="${0}" /> <c:forEach var="tLi ...
- vagrant(一)初识与安装
链接:https://pan.baidu.com/s/1I2RNMNq9G-P4k42-U1Jjtw (这里有需要准备的安装包以及镜像文件,也可自己去官网下载)提取码:jis8 安装VirtualBo ...
- php strtolower()函数 语法
php strtolower()函数 语法 作用:把所有字符转换为小写.大理石量具 语法:strtolower(string) 参数: 参数 描述 string 必须,规定要转换的字符串 说明:str ...
- paper 166:梯度下降法及其Python实现
参考来源:https://blog.csdn.net/yhao2014/article/details/51554910 梯度下降法(gradient descent),又名最速下降法(steepes ...
- [CSP-S模拟测试]:v(hash表+期望DP)
题目背景 $\frac{1}{4}$遇到了一道水题,又完全不会做,于是去请教小$D$.小$D$看了$0.607$眼就切掉了这题,嘲讽了$\frac{1}{4}$一番就离开了.于是,$\frac{1}{ ...
- selenium2-java 浏览器操作常用命令语法
WebDriver driver = new ChromeDriver(); xpath定位:driver.findElement(By.xpath("//div[@id='register ...
- android 关联某些后缀使用app打开
<intent-filter> <action android:name="android.intent.action.VIEW" /> <categ ...
- linux 部署系统通过SecureCRT启动tomcat 控制台中文乱码
查资料又是查了半天 首先 查看linux 当前系统字符集命令 echo $LANG 查看linux 当前系统语言 locale 网上说的又是下中文包,又是改临时语言,这些不能一概而论,我也觉得我不是中 ...
- 深入研究浏览器对HTML解析过程
HTML HTML解析 HTML解析是一个将字节转化为字符,字符解析为标记,标记生成节点,节点构建树的过程. 标记化算法 是词法分析过程,将输入内容解析成多个标记.HTML标记包括起始标记.结束标记. ...
- springCloud的使用06-----分布式配置
1 分布式配置中心的搭建 1.1 在git仓库中创建配置文件 1.2 创建springboot项目引入相应jar依赖 <project xmlns="http://maven.apac ...