μC/OS-II的内核结构
tr只在函数OstaskCreateExt()中使用,故使用时要将
OS_TASK_CREAT_EN设为1,以允许建立任务函数的扩展。例如用户可以建立一个数据结
构,这个数据结构包含每个任务的名字,或跟踪某个任务的执行时间,或者跟踪切换到某
个任务的次数(见例3)。注意,笔者将这个扩展指针变量放在紧跟着堆栈指针的位置,
为的是当用户需要在汇编语言中处理这个变量时,从数据结构的头上算偏移量比较方便。
.OSTCBStkBottom 是指向任务栈底的指针。如果微处理器的栈指针是递减的,即栈存储器
从高地址向低地址方向分配,则OSTCBStkBottom指向任务使用的栈空间的最低地址。类似
地,如果微处理器的栈是从低地址向高地址递增型的,则OSTCBStkBottom指向任务可以使
用的栈空间的最高地址。函数OSTaskStkChk()要用到变量OSTCBStkBottom,在运行中检验
栈空间的使用情况。用户可以用它来确定任务实际需要的栈空间。这个功能只有当用户在
任务建立时允许使用OSTaskCreateExt()函数时才能实现。这就要求用户将
OS_TASK_CREATE_EXT_EN设为1,以便允许该功能。
.OSTCBStkSize 存有栈中可容纳的指针元数目而不是用字节(Byte)表示的栈容量总数。
也就是说,如果栈中可以保存1,000个入口地址,每个地址宽度是32位的,则实际栈容量
是4,000字节。同样是1,000个入口地址,如果每个地址宽度是16位的,则总栈容量只有
2,000字节。在函数OSStakChk()中要调用OSTCBStkSize。同理,若使用该函数的话,要将
OS_TASK_CREAT_EXT_EN设为1。
.OSTCBOpt 把“选择项”传给OSTaskCreateExt(),只有在用户将OS_TASK_CREATE_EXT_EN
设为1时,这个变量才有效。μC/OS-Ⅱ目前只支持3个选择项(见uCOS_II.H):
OS_TASK_OTP_STK_CHK,OS_TASK_OPT_STK_CLR和OS_TASK_OPT_SAVE_FP。
OS_TASK_OTP_STK_CHK用于告知TaskCreateExt(),在任务建立的时候任务栈检验功能得
到了允许。OS_TASK_OPT_STK_CLR表示任务建立的时候任务栈要清零。只有在用户需要有
栈检验功能时,才需要将栈清零。如果不定义OS_TASK_OPT_STK_CLR,而后又建立、删除
了任务,栈检验功能报告的栈使用情况将是错误的。如果任务一旦建立就决不会被删除,
而用户初始化时,已将RAM清过零,则OS_TASK_OPT_STK_CLR不需要再定义,这可以节约程
序执行时间。传递了OS_TASK_OPT_STK_CLR将增加TaskCreateExt()函数的执行时间,因为
要将栈空间清零。栈容量越大,清零花的时间越长。最后一个选择项
OS_TASK_OPT_SAVE_FP通知TaskCreateExt(),任务要做浮点运算。如果微处理器有硬件的
浮点协处理器,则所建立的任务在做任务调度切换时,浮点寄存器的内容要保存。
.OSTCBId用于存储任务的识别码。这个变量现在没有使用,留给将来扩展用。
.OSTCBNext 和.OSTCBPrev 用于任务控制块OS_TCBs的双重链接,该链表在时钟节拍函数
OSTimeTick()中使用,用于刷新各个任务的任务延迟变量.OSTCBDly,每个任务的任务控制
块OS_TCB在任务建立的时候被链接到链表中,在任务删除的时候从链表中被删除。双重连
接的链表使得任一成员都能被快速插入或删除。
.OSTCBEventPtr是指向事件控制块的指针,后面的章节中会有所描述(见第6章任务间通
讯与同步)。
.OSTCBMsg是指向传给任务的消息的指针。用法将在后面的章节中提到(见第6章任务间通
讯与同步)。
.OSTCBDly 当需要把任务延时若干时钟节拍时要用到这个变量,或者需要把任务挂起一段
时间以等待某事件的发生,这种等待是有超时限制的。在这种情况下,这个变量保存的是
任务允许等待事件发生的最多时钟节拍数。如果这个变量为0,表示任务不延时,或者表
示等待事件发生的时间没有限制。
.OSTCBStat是任务的状态字。当.OSTCBStat为0,任务进入就绪态。可以给.OSTCBStat赋
其它的值,在文件uCOS_II.H中有关于这个值的描述。
.OSTCBPrio是任务优先级。高优先级任务的.OSTCBPrio值小。也就是说,这个值越小,任
务的优先级越高。
.OSTCBX,.OSTCBY,.OSTCBBitX和.OSTCBBitY 用于加速任务进入就绪态的过程或进入等
待事件发生状态的过程(避免在运行中去计算这些值)。这些值是在任务建立时算好的,
或者是在改变任务优先级时算出的。这些值的算法见程序清单L3.4。
程序清单 L3.4 任务控制块OS_TCB中几个成员的算法
OSTCBY=priority>>3;
OSTCBBitY=OSMapTbl[priority>>3];
OSTCBX=priority0x07;
OSTCBBitX=OSMapTbl[priority0x07];
.OSTCBDelReq是一个布尔量,用于表示该任务是否需要删除,用法将在后面的章节中描述
(见第4章任务管理)
应用程序中可以有的最多任务
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)
