机顶盒开发教程
程序模块化结构设计
版本:0
编写:技术开发部软件2

版本历史
版本号
日期
作者
更新内容
2011/3/24
倪海涛
建立文档,完成第一版。

模块化程序设计
一、模块化设计目的
模块化产品设计的目的是以少变应多变,以尽可能少的投入生产尽可能多的产品,以最为经济的方法满足各种要求。
二、名词解释
模块(Block-based)在程序设计中,为完成某一功能所需的一段程序或子程序;或指能由编译程序、装配程序等处理的独立程序单位;或指大型软件系统的一部分。
模块化程序设计(Block-based design)是对一定范围内的不同功能或相同功能不同平台、不同规格的产品进行功能分析的基础上,划分并设计出一系列功能模块,通过模块的选择和组合构成不同的顾客定制的程序,以满足市场的不同需求。
三、模块化具体思路
从目前机顶盒产品的发展来看,机顶盒产品方案繁多,并且各家机顶盒方案在开发应用功能程序部分时,程序设计思路不一样,导致开发同一个功能,在不同的方案上都要从新做一遍,耗时费力,但是不一定效果都好。对于以应用开发为主的公司,这样的重复设计就相当的严重。
为提高开发效率和开发质量,我们必须要做的一件事情就是统一设计功能模块,将其与系统平台剥离,形成一套统一的应用层模块势在必行。
要将平台与应用进行剥离,最关键的一点就是明确平台与应用的接口,将接口形成一种标准。在这种标准接口的规范下,无论平台系统如何变化,应用模块都能无差异化的重复使用,既提高了开发效率,又可以在不断的应用中,针对性的不断提高开发质量。
模块化程序设计的重点就是程序接口的标准化。
四、基础知识
指针为模块化设计最关键的知识点。
指针是一个用来指示一个内存地址的计算机语言的变量或中央处理器(CPU)中寄存器(Register)。
指针可以用来有效地表示复杂的数据结构可以用于函数参数传递并达到更加灵活使用函数的目的使C语言程序的设计具有灵活、实用、高效的特点。
五、设计流程
    程序设计模块化示意图:
系统注册功能模块
应用与功能模块之间的接口
功能实现
系统调用接口
系统注销功能模块
模块化应用三部曲:
第一步:注册模块;
第二步:调用模块功能;
第三部:注销模块;
    模块化设计三部曲:
        第一步:实现模块功能;
        第二步:完成应用与功能模块接口之间的对接;
        第三步:应用根据需要调用中间接口;
六、具体设计
    5.1 实现模块化管理框架
数据结构
模块公共数据结构:
struct module_com_interface {
UINT32    type;                        /* 模块类型(前16位)&&同类型模块ID(后16位) */
INT8        * module_name;                /* 模块名字模块化设计的产品举例 */
struct module_com _interface  *next;        /* 指向下一个模块结构,用于模块管理 */
};
Demo模块数据结构:
struct module_demo_interface {
UINT32    type;                        /* 模块类型(前16位)&&同类型模块ID(后16位) */
INT8        * module_name;                /* 模块名字 */
struct module_demo_interface  *next;        /* 指向下一个模块结构,用于模块管理 */
    /* 模块私有数据结构 */
    void    *priv;                            /* 私有数据指针*/
    /* Demo模块功能函数 */
    INT32    (*init)();                        /* Demo模块初始化 */
    INT32    (*io_ctl)(struct module_demo_interface * module, INT32 cmd, UINT32 param);/*Demo模块功能控制 */
};
模块公共数据结构成员,是每一个实体Demo模块数据结构所必须的;在公共模块的基础上,实体Demo模块数据结构可根据模块的需求,扩展结构体成员,以满足自己的需要。
static struct module_com_interface *module_com_base = NULL;
module_com_base为管理模块链表的一个基础头指针,用于管理所有模块链表使用。
5.1.2系统管理模块函数
定义
#define MODULE_TYPE_MASK        0xFFFF0000            /* 模块类型掩码 */
#define MODULE_ID_MASK        0x0000FFFF            /* 模块ID掩码 */
    声明
void * module _get_by_name(char *name);                /* 通过名字查模块*/
void * module _get_by_ type (UINT32 type, UINT16 id);        /* 通过类型查模块*/
INT32 module_malloc(UINT32 type,char *name, UINT32 size);    /* 分配模块空间,并将模块添加入模块链表 */
INT32 module_free(struct module_demo_interface * module);    /* 释放模块空间,并将模块从模块链表删除 */
实现:
/* 分配模块空间,并将模块添加入模块链表 */
INT32 module_malloc(UINT32 type,char *name, UINT32 size)
{
    UINT16 id;
    struct module_com_interface *module = (struct module_com_interface *)malloc(size);
    struct module_com_interface *pmodule;
    if (module == NULL)
    {
        MODULE_PRINTF("module_malloc: error - device %s not enough memory: %08x!\n",name, size);
        return NULL;
    }
    /* 在模块列表中出相同name的模块 */
    for (id = 0, pmodule = module_com_base; pmodule!= NULL; pmodule = pmodule ->next)
    {
        /* Find the module */
        if (strcmp(pmodule ->name, name) == 0)
        {
            MODULE_PRINTF("module_malloc: error - device %s same name!\n", name);
            free(module);
            return NULL;
        }
        /* Check ID */
        if ((pmodule ->type & MODULE_TYPE_MASK) == type)
        {
            id++;
        }
    }
    /* Clear module structure */
    memset((UINT8 *) module, 0, size);
    module->type = (type | id);
    module->name = name;
    /* 将模块加入列表,统一管理 */
    if(module_com_base == NULL)
    {
        module_com_base  = module;
        module->next = NULL;
    }
    else
    {
        for (pmodule = module_com_base; pmodule->next != NULL; pmodule = pmodule ->next);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。