51系列小型操作系统精髓 简单实现2

Posted yfceshi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51系列小型操作系统精髓 简单实现2相关的知识,希望对你有一定的参考价值。

 

在51单片机中,不能直接改动PC,但有一种方法是能够改变PC的。函数调用里会把PC值压入堆栈中,调用结束后,会把PC值弹出到PC

能改变PC就能够控制程序流程。

1.在任务中切换出去

#define MAX_TASKS 8 //任务槽最大个数.
unsigned char idata task_stack[MAX_TASKS][2];//任务堆栈.


//保存当前断点 并把SP=SP-2;
task_stack[task_id][0] =*(SP--);
task_stack[task_id][1] =*(SP--); 

2.在定时器中,定时时间到就切换回来。

// 实时切换回
SP=task_stack[task_id]+1;


3.还须要存储定时时间

unsigned char idata task_time[MAX_TASKS];  //一个任务一个定时时间

比方定时器定时时间是10ms  ,每10ms查询一次各个实时任务时间是否到。到了就切换相应的任务运行。否则各任务定时时间减10ms

#define TIMER_RELOAD()  {TL0=0x00;TH0=0xC4;}//使能T/C<span style="white-space:pre">	</span>  初始10ms
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 tm0_isr() interrupt 1 using 1
{


<span style="white-space: pre;">	</span>//任务时间是否到,任务时间到 实时切换回

<span style="white-space: pre;">	</span>//定时时间重载
<span style="white-space: pre;">	</span>TIMER_RELOAD();
}


4.还须要什么呢?



以上是关于51系列小型操作系统精髓 简单实现2的主要内容,如果未能解决你的问题,请参考以下文章

如何学习一个嵌入式系统?学这些精髓!

华为配置ACL——小型公司案例实验

SpringCloud系列十一:SpringCloudStream(SpringCloudStream 简介创建消息生产者创建消息消费者自定义消息通道分组与持久化设置 RoutingKey)(代码片段

Mybatis 系列2

SpringCloud系列四:Eureka 服务发现框架(定义 Eureka 服务端Eureka 服务信息Eureka 发现管理Eureka 安全配置Eureka-HA(高可用) 机制Eur(代码片段

白话系列之IOC,三个类实现简单的Ioc