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

 

 中断

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

 
ISR

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

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

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

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

Nanokernel
Nanokernel是Kernel的内核,它是一个小型的RTOS(real-time operation system)用来运行Symbian OS。


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

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

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

NFastSemaphore对象,一个快速的信号量。
它是特定Nanokernel线程所拥有的一个轻量级信号量,任何线程可以发信号给它,但只有它的所有者可以等待这个信号量。

NFastMutex对象,一个快速的互斥体。
它是一个轻量级的互斥体。它为快速请求和释放作了优化,并提供优先级继承。
它不可以嵌套,如一个线程不能同时拥有或等待两个互斥体。
另外,拥有互斥体的线程不能阻塞任何其他的等待对象。
延迟调用(DFC,Deferred function calls)。

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

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

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

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值