ustcanycall / OS

0 stars 0 forks source link

调研5 #8

Open ustcanycall opened 10 years ago

ustcanycall commented 10 years ago

嵌入式系统设计方法

分析uC/OS提供了哪些系统服务,各服务的执行时间是多少?

uC/OS提供任务调度和管理、时钟管理、任务同步与信号、内存管理和中断服务等。具体时间多少需要根据具体服务设定的等待的节拍数决定

分析uC/OS消除优先级翻转的算法

所谓优先级翻转问题(priorityinversion)即当一个高优先级任务通过信号量机制访问共享资源时,该信号量已被一低优先级任务占有,而这个低优先级任务在访问共享资源时可能又被其它一些中等优先级任务抢先,因此造成高优先级任务被许多具有较低优先级任务阻塞,实时性难以得到保证。

例如:有优先级为A、B和C三个任务,优先级A>B>C,任务A,B处于挂起状态,等待某一事件发生,任务C正在运行,此时任务C开始使用某一共享资源S。在使用中,任务A等待事件到来,任务A转为就绪态,因为它比任务C优先级高,所以立即执行。当任务A要使用共享资源S时,由于其正在被任务C使用,因此任务A被挂起,任务C开始运行。如果此时任务B等待事件到来,则任务B转为就绪态。由于任务B优先级比任务C高,因此任务B开始运行,直到其运行完毕,任务C才开始运行。直到任务C释放共享资源S后,任务A才得以执行。在这种情况下,优先级发生了翻转,任务B先于任务A运行。

优先级天花板

优先级天花板是当任务申请某资源时,把该任务的优先级提升到可访问这个资源的所有任务中的最高优先级, 这个优先级称为该资源的优先级天花板。这种方法简单易行,不必进行复杂的判断,不管任务是否阻塞了高优先级任务的运行, 只要任务访问共享资源都会提升任务的优先级。

优先级继承

优先级继承是当任务A 申请共享资源S时,如果S正在被任务C使用,通过比较任务C与自身的优先级,如发现任务C 的优先级小于自身的优先级, 则将任务C的优先级提升到自身的优先级, 任务C 释放资源S 后,再恢复任务C 的原优先级。这种方法只在占有资源的低优先级任务阻塞了高优先级任务时才动态的改变任务的优先级,如果过程较复杂, 则需要进行判断。

分析uC/OS的内存占用情况

uC/OS中把连续的大块内存按分区管理。每个分区中包含整数个大小相同的内存块,但不同分区之间的内存块大小可以不同。用户需要动态分配内存时,系统选择一个适当的分区,按块来分配内存。释放内存时将该块放回它以前所属的分区,这样能有效解决碎片问题,同时执行时间也是固定的。

如果应用程序要使用动态内存,内存的划分可动态分配:uC/OS给每个内存分区定义了一个叫做内存控制块(OS-MEM)的数据结构,系统用这个内存控制块来记录和跟踪每一个分区的状态。

如何使uC/OS支持同优先级?

uC/OS作为一种抢占式的实时操作系统,在不少方面有着可以与商业内核相比的功能。但是uC/OS不支持同优先级任务的调度,而实际的应用中,往往有些任务需要同优先级新型调度。

uC/OS支持不同优先级任务调度的数据结构

1 这是一个双向线性链表结构,任务调度是从线性链表上的一个节点(一个TCB控制块)切换到从链表上的另一个节点,而不同的结点对应着不同的优先级,这样来完成不同优先级的任务调度。

uC/OS支持同优先级任务调度的数据结构

2 任务A、任务B、任务C为不同优先级的任务,任务A、任务D、任务E为同优先级的任务。当没有比任务A更高的优先级任务时,每发生一次节拍中断,任务A、任务D、任务E就依次在运行态和就绪态切换,这里可以通过改变OSTCBPrioTbl[prio1]指向的任务TCB,也就是要修改OSSched()来实现。另外,很容易看出同优先级任务间的数据结构是一个循环链表结构,所以TCB也应相应的扩展两个指针域。新的数据结构将使就绪任务的TCB在一个循环链表和线性链表上不断的切换,而对于等待任务的TCB,也将在一个循环链表和线性链表上不断的切换。