51系列小型操作系统精髓 简单实现6 C语言版待改进

本文探讨了如何使用STC12C5A微控制器实现任务调度和定时器中断功能,通过具体代码展示了如何创建任务堆栈、设置任务时间以及中断处理逻辑。

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

#include "STC12C5A.H"


#define TIMER_RELOAD()  {TL0=0x00;TH0=0xC4;}//使能T/C  初始10ms


#define MAX_TASKS 8 //任务槽最大个数.
unsigned char idata task_stack[MAX_TASKS][2];//任务堆栈.  PC指针为16位,需2个字节。
unsigned char idata task_time[MAX_TASKS]; //定时时间
unsigned char task_id=0; //当前活动任务号


void rtos_wait(unsigned char time)
{


//保存当前任务时间
task_time[task_id]=time;


//保存当前断点 并把SP=SP-2,任务切换到下一任务;
task_stack[task_id][1] =*((unsigned char *)(SP));
SP--;
task_stack[task_id][0] =*((unsigned char *)(SP));
SP--;



//任务号
if(++task_id == MAX_TASKS)
task_id = 0;
}
unsigned char a=0;
unsigned char b=0;
void task_test()
{
while(1)
{
a++;
rtos_wait(100); //运行完后,记录下一步地址,返回
a++;


}
}
void task_test2()
{
while(1)
{
b++;
rtos_wait(10); //运行完后,记录下一步地址,返回
b++;
}
}
void Timer0Init() //@18.432MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x00; //设置定时初值
TH0 =0xC4; //设置定时初值 10ms
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0開始计时


ET0=1;
EA=1;
}
void main()
{
Timer0Init();
task_test();
task_test2();
while(1);
}
void rwcl() //任务时间是否到,任务时间到 实时切换回
{
//从把定时时间减1 ,找看哪个任务到 ,任务时间到 实时切换回
unsigned char i;
for(i=0;i<MAX_TASKS;i++)
{
if(task_time[i])
{
task_time[i]--;
if(task_time[i]==0)
SP=task_stack[i]+1;
}
}
}
void tm0_isr() interrupt 1 using 1
{
  //定时时间重载
TIMER_RELOAD();


rwcl(); //任务时间是否到,任务时间到 实时切换回
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值