死循环之间穿梭(51操作系统之任务主动放弃cpu控制权)
2015-08-28 15:52
211 查看
[align=center][/align] #include<reg52.h> #define uint unsigned int #define uchar unsigned char void cswitch(); void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } uchar temp,i; void taskA() { while(1) { temp=0x01; for(i=0;i<8;i++) { delay(300); P1=temp; temp=temp<<1; cswitch(); } } } void taskB() { while(1) { P2+=1; delay(300); cswitch(); } } void taskC() { while(1) { P3+=2; delay(300); cswitch(); } } void * const func[]={taskA,taskB,taskC}; uchar tasknum=0; uchar stk[3*2]; main() { uchar num,j; tasknum=0; for(;num<3;num++,j+=2) { stk[j]=((uint)(func[num]))%256; stk[j+1]=((uint)(func[num]))/256; } // taskA(); cswitch(); } void cswitch() { uchar idata *ssp; ssp=(uchar *)SP-1; if(tasknum>=1) { tasknum--; stk[tasknum++]=*ssp++; stk[tasknum++]=*ssp; ssp--;//注意:这里不能直接对SP进行只增或减操作,这样会造成堆栈溢出 if(tasknum>5) tasknum=0; } *ssp++=stk[tasknum++]; *ssp=stk[tasknum]; } 该程序主要是通过任务自己调用切换函数,所以相当于一般函数调用那样,不需要将寄存器压入堆栈的操作.直接恢复PC指针就可以了. |
相关文章推荐
- git - 命令模式使用指南
- push 时添加自定义动画
- 并发访问超时的问题可能性(引用)
- Miller&&Pollard POJ 1811 Prime Test
- 浅谈Thrift内部实现原理
- fprintf 函数详解
- 排洪河道规划问题(C语言建模)
- [leetcode] 92.Reverse Linked List II
- CocoaPods版本升级
- Cocos2D-X设计模式:外观模式
- springmvc导入Excel例子
- zzuli OJ 1024: 计算字母序号
- Spinner与适配器Adapter使用总结
- 小孩有多少种上楼梯的方式
- 谁动了我的cpu——oprofile使用札记
- AIDLservice
- Colored Sticks
- Dynamics CRM 2011编程系列(1):系统实体状态更新
- linux 使用nice命令设置进程优先级
- Android PinyinIME 源码笔记 -- 附A.1 输入法的启动