Symbian OS高级开发内核篇之中断与Nanokernel

来源:互联网 发布:linux如何修改静态ip 编辑:程序博客网 时间:2024/05/21 09:25

 中断

中断是挂起CPU正常执行的程序,进入中断处理状态,并跳转到处理中断的代码段。中断源是指可以迫使CPU进入中断处理状态的一个硬件设备或软件行为,中断源用一个TInt类型数字来标示, 这个数字通常作为中断ID,中断控制器来监控中断源。硬件给CPU产生中断信号通知,并提供挂起的中断信息。

 

ISR

中断服务程序或叫ISRInterrupt Service Routine)是处理中断的代码,Symbian OS Kernel 调用ISR来响应中断通知,调用ISR的过程称为中断调度。ISR是一个单一的函数,并非类的成员函数。每个ISR携带一个32位的TAny*参数,它可以指向任何值,所以经常会有类型转换,具有代表性的是它通常指向一个类。ISR通常在中断向量表中维护。

 

每个中断源只能分配或绑定一个ISRISR可以在正常运行时绑定和释放,但每次只能绑定到一个中断源。设备驱动程序可以通过中断源ID来绑定和解绑定ISR

 

中断向量表定义了哪些中断源绑定了哪些ISR,这个表必须有足够的空间来存放这些。在Symbian OS中,中断向量表就是一个数组。中断服务请求IRQ和快速中断请求FIQ需要区别开来,尽管中断向量表一个元素对应一个中断源,但在构建中断向量表时还是应将IRQFIQ分组,这样就可以通过中断ID号快速决定是IRQ还是FIQ。如下图所示:

 

 

 Symbian OS 中断

 

1 中断向量表示意图 (源:SDL

 

Nanokernel

NanokernelKernel的内核,它是一个小型的RTOSreal-time operation system)用来运行Symbian OS

 

Nanokernel线程

 

Nanokernel线程是最基本的执行单元,具有线程优先级,范围为064,调度时基于优先级的高低,高优先级的先调用。0优先级系统保留,为idle线程使用。优先级12748,为Symbian OS 线程使用,其中优先级12是为前台应用程序使用,剩下的35个优先级为实时程序所用。

 

Nanokernel线程可以动态创建和销毁,但是它不做任何内存管理工作,线程对象及线程堆栈的内存都由线程调用者提供,其实这个规则不仅是对线程,而是遍布整个Nanokernel,所有动态创建的对象的内存,都必须由调用者来创建和销毁。

 

Nanokernel同步

 

Nanokernel提供了如下的同步对象:

  • NFastSemaphore对象,一个快速的信号量。它是特定Nanokernel线程所拥有的一个轻量级信号量,任何线程可以发信号给它,但只有它的所有者可以等待这个信号量。
  • NFastMutex对象,一个快速的互斥体。它是一个轻量级的互斥体。它为快速请求和释放作了优化,并提供优先级继承。它不可以嵌套,如一个线程不能同时拥有或等待两个互斥体。另外,拥有互斥体的线程不能阻塞任何其他的等待对象。
  • 延迟调用(DFCDeferred function calls)。

 

线程同步时可以通过调用NKern::DisableAllInterrupts()来禁用中断,还可以调用NKern::Lock()来禁止抢占。当然,要谨慎使用这两个功能,因为它会影响到系统各个方面。

 

Nanokernel线程处理器

 

每一个Nanokernel线程可以定义以下的处理:

  • 退出处理,线程终止前在要退出线程的上下文中调用。
  • 异常处理,在执行线程时CPU发生异常时调用,在线称的上下文中调用。
  • 超时处理,当线程等待超时处于阻塞状态或不可知状态时调用,它在Nanokernel时钟线程的上下文中调用,并允许抢占。
  • 状态处理,在线程挂起、重新启动、释放、优先级改变、线程等待超时且无超时处理或线程处于无法识别的状态时调用。

 

时钟管理

Nanokernel提供了基本的时钟对象,NTimer,可以生成一次性或周期性中断。当时钟到期时会从时钟ISRNanokernel时钟线程调用超时处理,时钟对象可以在任何上下文中操作。时钟由系统周期性脉冲中断驱动,通常是1毫秒一次。

 

 

原创粉丝点击