⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 regist.h

📁 modem数据通信源码
💻 H
字号:
#ifndef __REGISTER_H__
#define __REGISTER_H__


// 出口表中每一个结构中最大项的个数
#define EXPORT_TABLE_MAX_ITEM           128


// 申明第n级类型为ExportType的出口表
#define DECLARE_EXPORT_TABLE(ExportType, n) \
    static ulong theExport##n##ExportType[EXPORT_TABLE_MAX_ITEM]

// 将ExportType类型的第n2级结构注册到n1级中
#define REGISTER_STRUCT(ExportType, n1, n2) \
    do\
    {\
        uint i;\
        ulong *paddr = (ulong*)&theExport##n1##ExportType[0];\
        \
        /* 将n1数组里的每个分量都赋值为n2数组的首地址 */ \
        for (i = 0; i < sizeof(theExport##n1##ExportType)/sizeof(ulong); i++)\
        {\
            *paddr++ = (ulong)&theExport##n2##ExportType[0];\
        }\
    }while(0)

// 将函数注册到ExportType类型第n级结构中,用于注册缺省函数
#define REGISTER_FUNCTION(ExportType, n, Function) \
    do\
    {\
        uint i;\
        ulong *paddr = (ulong*)&theExport##n##ExportType[0];\
        \
        /* 将数组里的每个分量都赋值为函数地址 */ \
        for (i = 0; i < sizeof(theExport##n##ExportType)/sizeof(ulong); i++)\
        {\
            *paddr++ = (ulong)Function;\
        }\
    }while(0)

// 检查模块ModuleName,类型TypeName的模块是否已经载入,如果载入,将模块提供的出口表
// 赋给ExportPonter,否则将我们默认的ExportType结构类型的第n级结构地址赋给ExportPonter
// 这样当模块没有载入的时候,调用模块提供的然后函数都会跳到我们定义的函数去
#define RETRIEVE_EXPORT_TABLE(ExportType, n, ModuleName, TypeName, ExportPonter) \
    do\
    { \
        uint ModuleID;\
        \
        ExportPonter = NULL; \
        /* 检查模块是否已经载入 */ \
        EA_vGetModuleID(ModuleName, TypeName, &ModuleID);\
        if (ModuleID != EM_rtos_INVALID)\
        {\
            ExportPonter = EA_pvRetrieveExportTable(ModuleID,0); \
        }\
        \
        /* 如果模块没有载入或获取出口表失败则使用我们默认的出口表 */ \
        if (!ExportPonter)\
        {\
			ExportPonter = (ExportType *)&theExport##n##ExportType[0];\
        }\
    }while(0)


#endif   // __REGISTER_H__

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -