构造一个51单片机的实时操作系统

[09-12 17:52:51]   来源:http://www.88dzw.com  单片机学习   阅读:8693

文章摘要: 为什么要以这样一种规律而不是其他的方式呢?这样由于在任务建立后,还未进行任务调度之前,各任务的堆栈实际上是它们自身的地址,因而其堆栈深度为2,为了程序的简便而直接填入。 void main(void){ OSInit(); /*初始化OSTaskStackBotton队列*/ TMOD=(TMOD&0XF0)0X01; TL0=0xBF;

构造一个51单片机的实时操作系统,标签:单片机开发,单片机原理,单片机教程,http://www.88dzw.com

为什么要以这样一种规律而不是其他的方式呢?这样由于在任务建立后,还未进行任务调度之前,各任务的堆栈实际上是它们自身的地址,因而其堆栈深度为2,为了程序的简便而直接填入。

void main(void){
OSInit(); /*初始化OSTaskStackBotton队列*/
TMOD=(TMOD&0XF0)0X01;
TL0=0xBF;
TH0=0xFC;
TR0=1;
ET0=1;
TF0=0;
OSTaskCreate(TaskA,NULL,0);
OSTaskCreate(TaskB,NULL,1);
OSTaskCreate(TaskC,NULL,2);
OSStart();
}
上面这段代码中,所有任务建立后,便调用OSStart()开始任务调度。OSStart()是一个宏定义,如下所示:
#define OSStart() do{\
OSTaskCreate(TaskIdle,NULL,OS_MAX_TASKS);\
EA=1;\
return;\
}while(0)

首先,它创建了一个空闲任务并打开中断,然后便返回。返回到那里了呢?我们知道,空闲任务是优先级最低的任务,当调OSTaskCreate建立时,会将其地址填入到SP的位置,并把SP向后移动2个字节(见图2及说明),因而此时处在堆栈顶端的,一定是空闲任务TaskIdle。这就使得这里的return一定会返回到空闲任务。至此,系统进入正常运行状态。

3.2 任务的切换

任务的切换分两种情况,在当前任务优先级低于下一个取得CPU的控制权的任务时,将下一个取得CPU控制权的任务的栈顶到当前任务的栈顶之间的内容向RAM空间的高端搬移,以空出全部的RAM空间作下一个任务的堆空间,同时更新对应的OSTaskStackBotton,使其指向新的正确任务的堆栈栈底。如果当前任务的优先级高于下一个任务的优先级,则作相反的搬移,如图3与图4所示。

所有任务必须主动调用OSSleep,放弃CPU的控制权。任务调用OSSleep后,将选择优先级最高的就绪任务运行。

(编者注:实时操作系统源代码见本刊网站www.mesnet.com.cn。)

结语

系统完成后,内核的代码量在400多个字节左右,占用1个定时器中断及小量的内存空间。系统设置容量为8个任务,用户实际可用任务为7个,能够满足一般需求,也达到了在小容量芯片中应用的开发要求。由于没有采用占先式的任务调度,除开全程相关的个别任务的一些局部变量外,其他局部变量已经不存在覆盖关系,由于是任务主动放弃CPU控制权,对于个别需要保护的变量单独进行处理也变得容易。在系统中,全程不需要反复地开关中断,实时性能也很好。对个别时序要求严格的外设(如DS18B20)除外。

注:本文所说的重入不一定是严格意义上的重入,很大程度上仅指函数被打断后再次进入时,程序能正确运行,并不是说其环境变量没有改变。


上一页  [1] [2] [3] 


Tag:单片机学习单片机开发,单片机原理,单片机教程单片机学习

《构造一个51单片机的实时操作系统》相关文章

分类导航
最新更新
热门排行