博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
51系列小型操作系统精髓 简单实现2
阅读量:5092 次
发布时间:2019-06-13

本文共 870 字,大约阅读时间需要 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	  初始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{	//任务时间是否到,任务时间到 实时切换回	//定时时间重载	TIMER_RELOAD();}

4.还须要什么呢?

转载于:https://www.cnblogs.com/yfceshi/p/6794927.html

你可能感兴趣的文章
火狐、谷歌、IE关于document.body.scrollTop和document.documentElement.scrollTop 以及值为0的问题...
查看>>
nodejs fs路径
查看>>
javascript之数组操作
查看>>
Python编译错误总结
查看>>
URL编码与解码
查看>>
Eclipse 安装SVN插件
查看>>
阿里云服务器CentOS6.9安装Mysql
查看>>
剑指offer系列6:数值的整数次方
查看>>
js 过滤敏感词
查看>>
poj2752 Seek the Name, Seek the Fame
查看>>
软件开发和软件测试,我该如何选择?(蜗牛学院)
查看>>
基本封装方法
查看>>
bcb ole拖拽功能的实现
查看>>
生活大爆炸之何为光速
查看>>
bzoj 2456: mode【瞎搞】
查看>>
[Typescript] Specify Exact Values with TypeScript’s Literal Types
查看>>
[GraphQL] Reuse Query Fields with GraphQL Fragments
查看>>
Illustrated C#学习笔记(一)
查看>>
理解oracle中连接和会话
查看>>
两种最常用的Sticky footer布局方式
查看>>