ITRON的内存管理,中断处理,时钟管理

来源:互联网 发布:淘宝渐变背景素材 编辑:程序博客网 时间:2024/05/18 03:37
 内存管理
任务在运行过程中对内存的需求是不断变化的不同的任务有不同的需要,OS 将内存当作一种资源来看并且在竞争的任务之间分配,这种资源就如同在竞争的任务间分配CPU 控制权一样。
 概述
在ITRON系统中所指的内存管理是通过对软件的内存区域进行动态的管理,也就是说在需要申请使用的时候就要确保,如果不需要的时候就进行归还的功能。
 图: Memory Pool示意图

在ITRON系统中,内存管理方法采用的是固定分区方式雏形,并且对内存区域分为内核区域核用户区域两个部分,并且这两个部分是单独进行管理的。系统内存池是否生成内核管理的各个对象时候使用的内存区域,这个区域里禁止作为用户内存池使用的。用户内存池是任务对内存区域进行申请时所使用的内存区域,并且这些内存池是相互独立的,所以可以通过给每个任务分配不同的内存池来避免任务见内存领域的竞争。
分区管理采用的是静态的内存分配方法, 系统分配和回收固定大小的存储块,其优点是存储块的分配和回收时间是确定的, 因为不会出现存储碎片, 因而也不需要做回收存储碎片, 进行合并等工作。
 图:内存分区

系统中, 可定义多个分区, 每个分区中存储块的大小可不同, 且可在分区中定义分区例如一个分区可以是另一个分区中的一块这就意味着存储块,可以很容易地被分为子存储块,另外还可以为同一块存储区域定义两个分区这样就可以从同一块存储区中分配两种不同尺寸的存储块。
 基本调用
cre_mpl: Generates a memory pool.
del_mpl: Deletes the memory pool.
get_blk: Acquires a memory block.
pget_blk: Acquires a memory block (by polling).
tget_blk: Acquires a memory block (with timeout setting).
rel_blk: Release a memory block.
ref_mpl: Acquires memory pool information.
vget_pid: Acquires ID information of the memory pool.
 内存池的创建
存在两种方式来创建内存池,一种是静态注册,另外一种方式是动态创建。动态创建的方法是通过cre_mpl调用来实现的。
 内存池的清除
del_mpl调用可以实现内存池的删除,当执行删除操作时,如果存在内存申请的任务处于等待状态的话,这些任务将直接迁移到Ready状态。
 内存申请
Itron系统中存在三种方式来实现内存的申请,get_blk, pget_blk,和 tget_blk,这三种调用的使用方式如下:
get_blk:申请指定大小的内存块,如果申请失败,任务状态将迁移到等待状态,直到有满足任务使用的内存被释放。
pget_blk:申请指定大小的内存块,如果申请成功,任务保持执行状态,如果失败,系统也不进行等待,直接运行其他指令。
tget_blk:如果没有申请到制订大小的内存,任务将等待指定的时间,之后迁移到Ready状态。
 内存释放
当系统发行rel_blk调用之后,内存被归还给系统。

 中断处理
中断是硬件机制,它向CPU发送信号,表示外部异步事件(无时序关系的随机事件)发生,如设备发送数据请求 内部运行异常等。
对中断的管理是OS的特征之一,一般来说当发生中断时,控制会转移到中断处理程序中,而控制转移到中断处理程序中的是硬件,软件不参与。但是在ITRON系统中,为了方便管理,内核提供了进行中断的通知,并将控制权转移给中断处理程序中的功能。
 中断处理的管理
为了提高中断的吞吐率,ITRON系统将中断分成两个处理等级来进行中断处理,一种是直接启动的中断Handler;另一种是中断任务。
 直接启动的中断Handler,处理时间可以在短时间内完成,并且要求响应速度的中断请求,这种中断Handler不需要通过OS的管理也能够启动的中断处理专用程序。
下图给出这种中断处理的执行过程。

 

中断任务,需要的处理时间比较长,并且对中断响应要求不是特别严格的场合使用。所谓中断任务指被中断处理程序唤醒或启动的中断处理专用任务。下图给出中断任务的处理流程。

 中断例程的登录
直接启动中断的登录方法需要将中断服务Handler的地址登录到中断向量表中,但是如果中断任务就不能采用这种方式来定义,否则Itron系统将无法识别,所以中断任务的登陆方法就需要使用ITRON系统提供的支持来实现。下面图解表示了系统对中断任务的管理方式,请参考:

在Itron系统中,为了实现对中断任务的管理,在idt中登陆了缺省的中断处理程序,在调用用户注册的Isr之前,需要将中断请求登陆到Itron管理的虚拟IDT表中,这样系统就能够通过对虚拟中断向量表的管理来实现对中断任务的管理。

 中断中的处理
因为中断例程的特殊性,所以在进行中断程序的设计和使用需要特别注意,否则会发生一些意想不到的问题,下面从几个方面进行说明。
 寄存器的保存和恢复;
这个部分是每个使用中断例程的系统都需要考虑的,但是这个部分需要根据实际CPU使用要求进行,本教材中仅仅提出提示,并不给出具体的限定条件。
 系统调用的限制;
一般说来,在中断例程中发行Itron系统调用与通常任务没有特别的区别,所以为了保证系统的安全性,在中断中,对于创建/删除Itron管理对象、有迁移到资源获取等待状态可能的调用以及可能产生tron式样中没有定义的状态迁移等,都被禁止使用,下面是否详细信息,请在、设计时候务必遵守。
不能被中断例程使用的系统调用:
sta_tsk、ext_tsk、ter_tsk、dis_dsp、ena_dsp、chg_pri、rot_rdq、rel_wai、sus_tsk、rsm_tsk、slp_tsk、tslp_tsk、dly_tsk、wup_tsk、set_flg、wai_flg、twai_flg、sig_sem、snd_msg、rcv_msg、trcv_msg、pget_blf、tget_blk、loc_cpu、unl_cpu等。

 时钟管理
在实时系统中,时间是操作任务过程中最基础的要素,在内核中的周期唤醒、延迟唤醒、Time Out等的操作都以它来作为基础。
 周期唤醒
对任务发行周期性的唤醒要求叫做周期唤醒。在ITRON系统中提供了周期唤醒任务来实现本机能。
下面方法实现了周期唤醒任务的实现:
def_cyc: Registers a cyclically activated handler.
act_cyc: Controls the activity state of the cyclically activated handler.
ref_cyc: Acquires cyclically activated handler information.

 延迟唤醒
从当前时刻开始,经过指定的时间后唤醒的任务称作延迟唤醒。产生延迟唤醒的调用是dly_tsk,当调用发生时,系统的运行状态将迁移到等待状态,直到指定的时间Time Out之后才能迁移到Ready状态。Itron系统中管理的时钟是以毫秒为单位的,所以上面的计数都是以毫秒为单位进行累加,当计数到100时,系统唤醒任务,并切换任务到Ready状态,等待系统的调度。

 Time Out指定
发行event flag等待、semaphore等待、Mailbox等待等功能调用时,可以指定等待的时间,这样的指定称作TimeOut指定。
tslp_tsk system call
twai_sem system call
twai_flg system call
trcv_msg system call