用c语言在电脑模拟一秒,pc上用C语言模拟51多任务的案例程序

本文介绍了嵌入式系统中任务调度的基本概念,包括任务槽的定义、栈指针的管理以及任务堆栈的分配。通过示例展示了如何装载任务到特定的任务槽,并讨论了栈深度的估算方法。此外,还展示了如何更新任务栈指针来切换任务。虽然例子未涉及实际的任务切换函数,但阐述了任务管理和栈操作的基础知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//任务槽个数.在本例中并未考虑任务换入换出,所以实际运行的任务有多少个,

//就定义多少个任务槽,不可多定义或少定义

#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("task1n");

i = 0;

}

//task_switch();

}

}

void func2()

{

static unsigned int j;

j = 0;

while(1)

{

if(j<654)

{

j++;

}

if(j>=654)

{

printf("task2n");

j = 0;

}

//task_switch();

}

}

int main()

{

printf("Hello world!n");

printf("task_stack[0] = %pn",task_stack[0]);

printf("task_stack+0 = %pn",task_stack+0);

printf("task_stack+1 = %pn",task_stack+1);

printf("task_stack+2 = %pn",task_stack+2);

printf("task_stack+3 = %pn",task_stack+3);

printf("task_stack+4 = %pn",task_stack+4);

printf("task_stack[0] = %pn",task_stack[0]);

printf("*(task_stack+0) = %pn",*(task_stack+0));

printf("*(task_stack+1) = %pn",*(task_stack+1));

printf("*(task_stack+2) = %pn",*(task_stack+2));

printf("*(task_stack+3) = %pn",*(task_stack+3));

printf("*(task_stack+4) = %pn",*(task_stack+4));

printf("task_stack[0] = %pn",task_stack[0]);

printf("*(task_stack+0)+0 = %pn",*(task_stack+0)+0);

printf("*(task_stack+1)+1 = %pn",*(task_stack+1)+1);

printf("*(task_stack+2)+2 = %pn",*(task_stack+2)+2);

printf("*(task_stack+3)+3 = %pn",*(task_stack+3)+3);

printf("*(task_stack+4)+4 = %pn",*(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 = %pn",task_stack);

printf("task_stack[0] + 5 = %pn",(task_stack[0] + 5));

printf("task_sp = %pn",task_sp);

printf("ntask_sp[0] = %dn",task_sp[0]);

printf("task_sp[1] = %dn",task_sp[1]);

printf("task_sp[2] = %dn",task_sp[2]);

printf("task_sp[3] = %dn",task_sp[3]);

printf("task_sp[4] = %dn",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 ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值