ayb_ice 可以设置一下TIMESHARING为0/5,看看任务2(周期5秒)是如何影响任务0和1(周期0.5秒)的。节拍设置10ms。观测效果完全符合“虚拟MCU”的OS理论和协作式内核调度。
您说的:“可以说实际OS里没有任务可以连续运行40MS,而不被任何任务或中断打断,”
不可以连续40ms?所贴程序任务2 连续运行了5000ms。既可以强迫任务0和1等待,(TIMESHARING=0) 也可以中止任务2使任务0和1实时运行,(TIMESHARING=5)。
只是项目要求不允许中途中止任务2(大概磁盘步进电机一类不可能频繁断开,反正咱也不懂。),否则就没有难度了。
现在买了美国的51_OS,它很容易就实现了。它是怎么做的?我们为什么不行?学长当年也是用的美国人的OS完成的。3000元想支持国人的51_OS,结果一条程序也没求到。 指望HOT的TASK51,还遥遥无期。而且HOT的TASK51功能说明里还没考虑做处理这类问题的系统函数调用。还不能说清老外是怎么做的。
#include<reg51.h> #include <rtx51tny.h>
sbit LED0=P1^0; sbit LED1=P1^1; sbit LED2=P1^2;
void delayms(unsigned int ms) // 延时子程序 { unsigned char i; while(ms--) { for(i = 0; i < 120; i++); } }
void LED00 (void) _task_ 0 { os_create_task(1);//创建进程1
os_create_task(2);//创建进程2
while(1) { LED0=! LED0; os_wait2(K_TMO,50); //延时50节拍 } }
//进程1 void LED01 (void) _task_ 1 { while(1) { LED1=! LED1; os_wait2(K_TMO,50); //延时500ms } }
//进程2 void LED02 (void) _task_ 2 {
while(1) { LED2=! LED2; delayms(5000); //延时5S os_wait2(K_TMO,50); //任务切换 } }
|