zoukankan      html  css  js  c++  java
  • 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
    ");
    			i = 0;
    		}
    		//task_switch();
    	}
    }
    void func2()
    {
    	static unsigned int j;
    	j = 0;
    
    	while(1)
    	{
    		if(j<654)
    		{
    			j++;
    		}
    		if(j>=654)
    		{
    			printf("task2
    ");
    			j = 0;
    		}
    		//task_switch();
    	}
    }
    
    
    int main()
    {
        printf("Hello world!
    ");
    
        printf("task_stack[0] = %p
    ",task_stack[0]);
        printf("task_stack+0 = %p
    ",task_stack+0);
        printf("task_stack+1 = %p
    ",task_stack+1);
        printf("task_stack+2 = %p
    ",task_stack+2);
        printf("task_stack+3 = %p
    ",task_stack+3);
        printf("task_stack+4 = %p
    ",task_stack+4);
    
        printf("task_stack[0] = %p
    ",task_stack[0]);
        printf("*(task_stack+0) = %p
    ",*(task_stack+0));
        printf("*(task_stack+1) = %p
    ",*(task_stack+1));
        printf("*(task_stack+2) = %p
    ",*(task_stack+2));
        printf("*(task_stack+3) = %p
    ",*(task_stack+3));
        printf("*(task_stack+4) = %p
    ",*(task_stack+4));
    
        printf("task_stack[0] = %p
    ",task_stack[0]);
        printf("*(task_stack+0)+0 = %p
    ",*(task_stack+0)+0);
        printf("*(task_stack+1)+1 = %p
    ",*(task_stack+1)+1);
        printf("*(task_stack+2)+2 = %p
    ",*(task_stack+2)+2);
        printf("*(task_stack+3)+3 = %p
    ",*(task_stack+3)+3);
        printf("*(task_stack+4)+4 = %p
    ",*(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
    ",task_stack);
        printf("task_stack[0] + 5 = %p
    ",(task_stack[0] + 5));
        printf("task_sp = %p
    ",task_sp);
        
        printf("
    task_sp[0] = %d
    ",task_sp[0]);
        printf("task_sp[1] = %d
    ",task_sp[1]);
        printf("task_sp[2] = %d
    ",task_sp[2]);
        printf("task_sp[3] = %d
    ",task_sp[3]);
        printf("task_sp[4] = %d
    ",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 ...
    
  • 相关阅读:
    IE6浏览器无法打开QQ邮箱
    vue 项目中 点击回车键 自动登录
    从后台拿数据来排序
    webpack 学习文档 自己留着用
    vue父子之间的传参问题
    vue中引入mint-ui的步骤 + mintui快速上手
    vue页面刷新
    调试兼容性该注意的的点
    垂直居中的几种方式 + css文本框文字溢出显示省略号
    elementui 鼠标悬停出现下拉列表
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/12007456.html
Copyright © 2011-2022 走看看