您的位置:首页 > 运维架构 > 网站架构

开源软件SkyEye外设建模架构探索---关键字

2013-10-09 14:34 176 查看
由于内部wiki维护,暂时使用博客备份一下。

因为硬件更新速度较快,SkyEye作为仿真平台,没办法对所有架构的所有板级以及外设全面支持,所以仿真平台对架构要求略高于一般软件,其目的如下:

1. 支持大多数架构的扩展,例如SkyEye支持arm, ppc, sparc等等,不同架构都是基于SkyEye核心库提供的接口进行开发,所以SkyEye核心库需要将不同架构的逻辑总结并进行抽象。

2. SkyEye作为仿真平台,还要具备一些仿真平台应具备的调试功能,如:断点,单步,查看内存,读写寄存器等等,这些调试功能的实现也需要通过一个中间层将不同架构与调试模块桥接起来,在调试端不关心我要调试某个平台,只要我单步,PC就可以走一条指令就OK。

3. 文章开始就提到,SkyEye没办法对所有外设进行支持,所以在外设建模接口设计这块,需要花很多心思。建模接口既要能支持所有外设的实现,又要通俗易懂,让建模者很快的扩展自己需要的外设。SkyEye建模接口也是现在SkyEye团队重点花心思的地方,我们也借鉴了国内外比较成功的仿真平台建模架构的实现,根据SkyEye自己的情况不断完善。

下面介绍一下SkyEye建模架构:

一. 建模关键字

1.1 关键字概述

1. Class:每个模块对于SkyEye平台来说都是一个类(尽管SkyEye是用C语言实现,对C语言面向对象编程感兴趣可以参照http://c.group.iteye.com/group/wiki/1291-object-oriented-programming-language-c),例如SkyEye的s3c6410触摸屏,它就是一个外设类,当我们想在仿真平台添加一块触摸屏时,只需要通过SkyEye核心库接口(后面简称为common接口)实例该外设类即可。
2. 基类:顾名思义,是一个最基本的类型,它可以携带任何类型的变量,设计基类的原因是:每个外设类彼此是封闭不可见(模块化设计,独立编译),外设与外设难免会有必要的调用,如:串口接收数据触发中断,调用中断控制器的signal_raise接口,所以各个模块需要通过基类进行沟通(后面会进行讲解)。
3. 属性:每个外设都具备自己的属性,如LCD的长宽,有的时候在实例后要根据我们的需求进行配置,但外设类是封闭的,我们不能直接对LCD类成员进行操作(在C语言中),所以属性是我们封装的一个关键字,通过调用属性的设置接口,可以在外界设置指定对象的指定属性。
4. 连接(connect):这是刚刚添加的关键字,当串口需要调用中断控制器的接口时,串口需要声明一个Connect,将中断控制器的signal_raise接口注册给Connect,串口只需要调用自己connect,就实现了对中断控制器的调用。其实属性也可以完成connect的工作,但区分属性与connect的关键在于:connect用于与外接模块的沟通,属性用于本模块固有的性质。
5. 接口(interface):接口与连接是相对的两个关键字,connect是调用端的一个接入点,interface是被调用者提供的一个接口,如上面说的signal_raise就是一个接口,注册到串口的conncet上。

1.2 关键字结构

1. Class

typedef struct skyeye_class{

const char* class_name;

const char* class_desc;

conf_object_t* (*new_instance)(const char* obj_name);

exception_t (*free_instance)(conf_object_t* obj);

exception_t (*reset_instance)(conf_object_t* obj, const char* parameter);

attr_value_t* (*get_attr)(const char* attr_name, conf_object_t* obj);

exception_t (*set_attr)(conf_object_t* obj, const char* attr_name, attr_value_t* value);

const struct ConnectDescription *connects;

}skyeye_class_t;

2. 基类

typedef struct conf_object_s{

char* objname;

void* obj;

char* class_name;

}conf_object_t;

3. 属性

typedef struct attr_value {

value_type_t type;

union {

const char *string; /* Sim_Val_String */

integer_t integer; /* Sim_Val_Integer */

integer_t uinteger; /* Sim_Val_Integer */

bool_t boolean; /* Sim_Val_Boolean */

double floating; /* Sim_Val_Floating */

/* Sim_Val_List */

struct {

size_t size;

struct attr_value *vector; /* [size] */

} list;

/* data array */

struct {

size_t size;

uint8 *data; /* [size] */

} data;

conf_object_t* object; /* Sim_Val_Object */

void* ptr;

} u;

} attr_value_t;

4. 连接(Connect)

struct ConnectDescription {

const char *name;

const char *iface_name;

connect_set_t set;

connect_get_t get;

};

5. 接口

被调用者对外提供接口需要使用接口注册函数,将接口注册给SkyEye,通过对应Connect的set方法将被调用的接口注册给调用者。要注意的是connect与接口连接是单向的,例如串口与终端连接,串口的connect连接终端的serial接口,当终端接到输入后又要将接收到的输入传输给串口寄存器,此时还需要将终端的connect连接串口的serial接口。

先总结这么多,后面慢慢补充一些关于SkyEye外设建模的方法和一些简单的实例。
SkyEye git 仓库地址:git://git.code.sf.net/p/skyeye/code
SkyEye 官网:www.skyeye.org
SkyEye的sourceforge: http://sourceforge.net/projects/skyeye/?source=directory
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: