#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多任务的案例程序的更多相关文章

  1. [数据结构] 用C语言模拟一个简单的队列程序

    #include<stdio.h> #include <stdlib.h> #include<string.h> #include<math.h> // ...

  2. 在PC上测试移动端网站和模拟手机浏览器的5大方法

    在PC上测试移动端网站和模拟手机浏览器的5大方法 来源:互联网 作者:佚名 时间:03-19 10:14:54 [大 中 小]                最近公司要开发网站的移动版,让我准备准备知 ...

  3. PC上安装多个操作系统

    目 录 第1章 绪论    1 1.1 目标    1 1.2 适宜的读者    1 第2章 制作启动U盘    2 2.1 初级安装    2 2.2 启动分析    3 2.3 高级安装    1 ...

  4. mac os x在PC上安装

    系统安装之前的准备工作及安装过程简介 前面我们已经提到,苹果电脑虽然已经采用了x86架构的Intel处理器,但其官方并不提供在非苹果电脑上安装Mac OS的支持.所以,要想在普通PC/笔记本电脑上安装 ...

  5. 让你在PC上调试Web App,UC浏览器发布开发者版

    目前,在手机上使用浏览器访问网页,无法便捷地进行网页语言调试.手机屏幕相对较小且操作不便,直接在手机上进行网页数据调试不太现实. 因此,UC使用技术将手机网页调试信息分离,实现一种能在大屏幕.高配置P ...

  6. 我用爬虫一天时间“偷了”知乎一百万用户,只为证明PHP是世界上最好的语言

    我用爬虫一天时间“偷了”知乎一百万用户,只为证明PHP是世界上最好的语言 2015-08-06 猿圈 我用爬虫一天时间“偷了”知乎一百万用户 只为证明PHP是世界上最好的语言 看了不少朋友圈里推荐的P ...

  7. PC 上的 LVM 灾难修复

    LVM 介绍 LVM 简介 LVM 是逻辑盘卷管理(Logical Volume Manager)的简称,最早是 IBM 为 AIX 研发的存储管理机制.LVM 通过在硬盘和分区之间建立一个逻辑层,可 ...

  8. NFC手机上基于软件的卡模拟 重大利好还是安全噩梦?(转)

    Software Card Emulation in NFC-enabled Mobile Phones: GreatAdvantage or Security Nightmare? Michael ...

  9. 绕过限制,在PC上调试微信手机页面

    场景 假设一个手机页面,开发者对其做了限制,导致只能在微信客户端中打开.而众所周知手机上非常不利于调试页面,所以需要能在电脑上打开并进行调试.这里针对常见的三种页面做一下分析,一一绕过其限制,(当然不 ...

随机推荐

  1. 常用jstl

    求list中某一值的和 <c:set var="total" value="${0}" /> <c:forEach var="tLi ...

  2. vagrant(一)初识与安装

    链接:https://pan.baidu.com/s/1I2RNMNq9G-P4k42-U1Jjtw (这里有需要准备的安装包以及镜像文件,也可自己去官网下载)提取码:jis8 安装VirtualBo ...

  3. php strtolower()函数 语法

    php strtolower()函数 语法 作用:把所有字符转换为小写.大理石量具 语法:strtolower(string) 参数: 参数 描述 string 必须,规定要转换的字符串 说明:str ...

  4. paper 166:梯度下降法及其Python实现

    参考来源:https://blog.csdn.net/yhao2014/article/details/51554910 梯度下降法(gradient descent),又名最速下降法(steepes ...

  5. [CSP-S模拟测试]:v(hash表+期望DP)

    题目背景 $\frac{1}{4}$遇到了一道水题,又完全不会做,于是去请教小$D$.小$D$看了$0.607$眼就切掉了这题,嘲讽了$\frac{1}{4}$一番就离开了.于是,$\frac{1}{ ...

  6. selenium2-java 浏览器操作常用命令语法

    WebDriver driver = new ChromeDriver(); xpath定位:driver.findElement(By.xpath("//div[@id='register ...

  7. android 关联某些后缀使用app打开

    <intent-filter> <action android:name="android.intent.action.VIEW" /> <categ ...

  8. linux 部署系统通过SecureCRT启动tomcat 控制台中文乱码

    查资料又是查了半天 首先 查看linux 当前系统字符集命令 echo $LANG 查看linux 当前系统语言 locale 网上说的又是下中文包,又是改临时语言,这些不能一概而论,我也觉得我不是中 ...

  9. 深入研究浏览器对HTML解析过程

    HTML HTML解析 HTML解析是一个将字节转化为字符,字符解析为标记,标记生成节点,节点构建树的过程. 标记化算法 是词法分析过程,将输入内容解析成多个标记.HTML标记包括起始标记.结束标记. ...

  10. springCloud的使用06-----分布式配置

    1 分布式配置中心的搭建 1.1 在git仓库中创建配置文件 1.2 创建springboot项目引入相应jar依赖 <project xmlns="http://maven.apac ...