首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

linux任务响应模型&linux实时化&RTAI 3.2分析&Adeos分析(7)

linux任务响应模型&linux实时化&RTAI 3.2分析&Adeos分析(7)

int __adeos_event_monitors[ADEOS_NR_EVENTS] = { [ 0 ... ADEOS_NR_EVENTS - 1] = 0 };

在文件kernel/adeos.c中定义;此数组中的每个元素对应着Linux中的一个系统事件(例如,进入系统调用事件、退出系统调用事件等),当某个域想要跟踪某个系统事件是,它就调用adeos_catch_event,告诉Adeos它想要跟踪这个系统事件,并将事件的处理函数传递给Adeos。Adeos根据事件的类型将__adeos_event_monitors数组中的某个元素的值加一或减一(当事件处理函数为空时减一,否则加一)。当某个系统事件发生时,Adeos根据事件类型,检查__adeos_event_monitors数组中的相应元素的值是否大于零,如果大于零,则说明某个域想跟踪这个系统事件,那么就将这个事件传递给中断管道处理,处理过程中会调用域的事件处理程序。

static struct irqdesc __adeos_std_irq_desc[NR_IRQS];

在文件adeos/armv.c中定义的,它的赋值是在__adeos_enable_pipeline中进行的,代码段如下:

for (irq = 0; irq < NR_IRQS; irq++)
        __adeos_std_irq_desc[irq] = irq_desc[irq];

其中的数组irq_desc[]是标准Linux中用来保存中断描述符的;所以,从这里就可以看出,__adeos_std_irq_desc[]数组保存的是标准的Linux中断描述符;由于Adeos需要接管Linux的中断管理,就要修改irq_desc[]数组的内容,因此,就将修改前的标准的Linux中断描述符保存起来。一方面,在卸载Adeos模块的时候可以恢复(在函数__adeos_disable_pipeline中调用),另一方面,在Adeos的代码中还需要调用标准描述符中的代码(例如,在__adeos_override_irq_mask中)。

unsigned long __adeos_virtual_irq_map = 0;

在文件kernel/adeos.c中定义的;变量__adeos_virtual_irq_map记录着虚拟中断的分配情况,在32位处理器上,共有32个虚拟中断,从0到31;当某一位为1时,表示虚拟中断已经被分配了,为0时,则没有分配;Adeos用虚拟中断来提供域之间的通信,当某个域需要执行另一个域的某些操作时,可以触发一个虚拟中断,当这个虚拟中断沿着中断管道传播时,接收这个虚拟中断的域就会执行相应的操作,这在处理上和硬件中断类似,只不过这个中断是由域触发的而已。

int adp_pipelined = 0;

在文件arch/arm/kernel/adeos.c中定义的;表示Adeos是否已经接管根域的中断管理,也就是说,表示中断管道当前是否有效。很多代码都要通过判断这个标志量来确定应该执行的操作。
----------------------------
3.2.2        域(Domain)相关实体
Adeos中的每个域都由一个域结构变量表示,这个结构变量保存着域的属性和和状态;域结构adomain_t的定义如下:

typedef struct adomain {

    /* -- Section: offset-based references are made on these fields
       from inline assembly code. Please don't move or reorder. */
    void (*dswitch)(void);        /* Domain switch hook */
    int *esp[ADEOS_NR_CPUS];        /* Domain stack pointers */
    /* -- End of section. */

    int *estackbase[ADEOS_NR_CPUS];

    unsigned domid;

    const char *name;

    int priority;

    struct adcpudata {
        unsigned long status;
        unsigned long irq_pending_hi;
        unsigned long irq_pending_lo[IPIPE_IRQ_IWORDS];
        unsigned irq_hits[IPIPE_NR_IRQS];
        adevinfo_t event_info;
    } cpudata[ADEOS_NR_CPUS];

    struct {
        int (*acknowledge)(unsigned irq);
        void (*handler)(unsigned irq);
        unsigned long control;
    } irqs[IPIPE_NR_IRQS];

    struct {
        void (*handler)(adevinfo_t *evinfo);
    } events[ADEOS_NR_EVENTS];

    int ptd_keymax;
    int ptd_keycount;
    unsigned long ptd_keymap;
    void (*ptd_setfun)(int, void *);
    void *(*ptd_getfun)(int);

    struct adomain *m_link;        /* Link in mutex sleep queue */

    struct list_head p_link;        /* Link in pipeline */

} adomain_t;
继承事业,薪火相传
返回列表