内核,中断,死锁,RAM空间

 内核(Kernel)

      多任务系统中,内核负责管理各个任务,或者说为各个任务分配CPU时间,并且负责任务之间的通信。内核提供的基本服务是任务切换。之所以使用实时内核可以大大简化应用系统的设计,是因为实时内核允许将应用分成若干个任务,有实时内核来管理他们。内核本身也增加了应用程序的额外负荷,代码空间增加了ROM的用量,内核本身的数据结构增加了RAM的用量。但更主要的是,每个任务要有自己的栈空间,这一块占起内存来是相当的厉害。内核本身对CPU的占用时间一般在2到5个百分点之间。

 

调度(Scheduler)

      调度也称Dispatcher。究竟何时让高优先级的任务占有CPU的使用权要看用的是什么类型的内核,是占先式的内核还是非占先式的内核。

 

非占先式内核

      非占先式(non-preemptive)内核要求每个任务自我放弃CPU的使用权。非占先式调度法也称作合作型多任务(cooperative multitasking),各个任务合作彼此共享一个CPU。中断服务可以使一个高优先级的任务由刮起状态变为就绪状态。但中断服务以后控制权还是回到原来被中断了的那个任务,直到该任务主动放弃CPU的使用权时,那个高优先级的任务才能获得CPU的使用权。

      非占先式内核的一个优点是响应中断快。在任务级,非占先式内核允许使用不可重入函数。每个任务都可以调用非可重入性函数,而不比担心其他任务可能正在使用该函数,从而造成数据的破坏。因为每个任务要运行到完成时才释放CPU的控制权。

      非占先式内核另一个优点是几乎不需要使用信号量保护共享数据。但这不是绝对的,在某种情况下,信号量还是用得着的。处理共享I/O设备时仍需使用互斥型信号量。

      非占先式内核的最大缺陷在于其响应时间。高优先级的任务已经进入就绪态,但还是不能运行,也许要等很长时间,直到当前运行着的任务释放CPU。与前后台系统一样,非占先式内核的任务级响应时间是不确定的。任务级响应时间要大大好于前后台系统,但仍是不可知的。

     

占先式内核

      当系统响应时间很重要时,要使用占先式(preemptive)内核。

      使用占先式内核,最高优先级任务什么时候都可以执行,可以得到CPU的控制权是可知的。使用占先式内核使得任务级响应时间得以最优化。

      使用占先式内核是,应用程序不应直接使用不可重入型函数。调用不可重入型函数时,要满足互斥条件。

 

信号量(Semaphore)

      在使用信号量之前,一定要对信号量进行初始化。作为互斥条件,信号量初始化为1。

 

死锁

      死锁(dead lock)也称做抱死(deadly embrace),指两个任务无限期地互相等待对方控制着的资源。设任务T1正独享资源R1,任务T2在独享资源R2,而此时T1又要独享R2,T2也要独享R1,于是哪个任务都没法继续执行了,发生了死锁。最简单的防止发生死锁的任务是让每个任务:

1)            先得到全部需要资源再做下一步的工作;

2)            用同样的顺序去申请多个资源;

3)            释放资源时使用相反的顺序。

内核大多允许用户在申请信号量的时候定义等待超时,以此化解死锁。当等待时间超过了某一确定值,信号量还是无效状态就会返回某种形式的出现超时错误的代码,这个出错代码告知该任务,不是得到了资源的使用权,而是系统错误。死锁一般发生在大型多任务系统中,在嵌入式系统中不易出现。

 

中断

      在实时环境中,关中断的时间应尽量的短。关中断影响中断延迟时间。关中断时间太久可能会引起中断丢失。处理器一般允许中断嵌套,也就是说在中断服务期间,微处理器可以识别另一个更重要的中断,并服务于那个更重要的重端。

 

中断延迟

      可能实时内核最重要的指标就是中断关了多长时间。所有实时系统在进入临界段之前都要关中断,执行完临界代码后再开中断。关中断的时间越长,中断延迟就越长。

      中断延迟 = 关中断的最长时间+开始执行中断服务子程序的第一条指令的时间

 

中断响应

      中断响应定义为从中断发生到开始执行用户的中断服务子程序代码来处理这个中断的时间。中断响应时间包括开始处理这个中断前的全部开销。典型地,执行用户代码之前要保护现场,将CPU的各寄存器入栈。这段时间被记作中断响应时间。

      对前后台系统,保存寄存器以后立即执行用户代码,

      中断响应时间 = 中断延迟 + 保存CPU内部寄存器的时间

      对非占先式内核时,微处理器保存内部寄存器以后,用户的中断服务子程序代码立即得到执行。

      中断响应时间 = 中断延迟 + 保存CPU内部寄存器的时间

      对占先式内核时,则要先调用一个特定的函数,该函数通知内核即将进行中断服务,使得内核可以跟踪中断的嵌套。对于uC/OS-II来说这个函数是OSIntEnter(),占先式内核的响应中断时间:

      中断响应时间 = 中断延迟 + 保存CPU内部寄存器的时间 + 内核的进入中断服务函数的执行时间

 

中断恢复时间

       中断恢复时间(interrupt recovery)的定义是微处理器返回到被中断了的程序代码所需要的时间。

      前后台系统和非占先式系统:

      中断恢复时间 = 恢复CPU内部寄存器值的时间+执行中断返回指令的时间

      对于占先式内核,中断的恢复要负责一些。典型的,在中断服务子程序的末尾,要调用一个由实时内核提供的函数。在uC/OS-II中,这个函数叫做OSIntExit(),这个函数用于判定中断是否脱离了所有的中断嵌套。如果脱离了嵌套,内核要进行一次调度。

      中断恢复时间 = 判定是否有优先级更高的任务进入了就绪状态的时间 + 恢复那个优先级更高任务的CPU内部寄存器的时间 + 执行中断返回指令的时间

 

对存储器的需求

      因为每个任务都是独立运行的,必须给每个任务提供单独的栈空间(RAM)。应用程序设计人员决定分配给每个任务多少栈空间时,应该尽可能使之接近实际需求。栈空间的大小不仅仅要计算任务本身的需求(局部变量,函数调用等),还要计算最多中断嵌套层数(保存寄存器,中断服务程序中的局部变量等)。根据不同的目标微处理器和内核的类型,任务栈和系统栈可以分开的。系统栈专门用于处理中断级代码。这样做的好处是每个任务需要的栈空间可以大大减少。所有内核都需要有额外的栈空间以保证内部变量,数据结构,队列等。

      对于RAM空间的处理:

1)            定义函数和中断服务子程序中的局部变量,特别是定义大型数组和数据结构;

2)            函数(即子程序)的嵌套;

3)            库函数需要的栈空间;

4)            多变元的函数调用。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lemon_fantasy/archive/2008/07/12/2642995.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值