feat: Add rfid feature and .gitignore file
This commit is contained in:
133
include_lib/system/generic/version.h
Normal file
133
include_lib/system/generic/version.h
Normal file
@ -0,0 +1,133 @@
|
||||
#ifndef VERSION_H
|
||||
#define VERSION_H
|
||||
|
||||
#include "typedef.h"
|
||||
|
||||
|
||||
typedef int (*version_t)(int);
|
||||
|
||||
|
||||
//定义模块的版本号,由主版本号和次版本号组成
|
||||
//如果两个模块的主版本号相同即表示兼容
|
||||
#define VERSION(major, minor) (((major)<<8) | (minor))
|
||||
|
||||
#define MAJOR(v) ((v) >> 16)
|
||||
#define MINOR(v) (((v) >> 8) & 0xff)
|
||||
|
||||
#define version_match(module_a, module_b) \
|
||||
({ \
|
||||
extern int module_a##_version(int ); \
|
||||
extern int module_b##_version(int ); \
|
||||
int version_a = module_a##_version(0); \
|
||||
int version_b = module_b##_version(0); \
|
||||
MAJOR(version_a) == MAJOR(version_b);\
|
||||
})
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#define __MODULE_VERSION_EXPORT_BEGIN(module, version) \
|
||||
int module##_version(int prt) \
|
||||
{ \
|
||||
if (prt) { \
|
||||
log_i(#module": %d.%d.%d build at: %s\n", (version)>>16, \
|
||||
((version) >> 8) & 0xff, (version) & 0xff, __DATE__); \
|
||||
} \
|
||||
|
||||
#define __MODULE_VERSION_EXPORT_END(module, version) \
|
||||
return version; \
|
||||
} \
|
||||
const version_t __version_##module \
|
||||
__attribute__((section(".lib_version"),used)) = module##_version
|
||||
|
||||
#define __MODULE_VERSION_EXPORT(module, version) \
|
||||
__MODULE_VERSION_EXPORT_BEGIN(module, version) \
|
||||
__MODULE_VERSION_EXPORT_END(module, version);
|
||||
|
||||
|
||||
#define __MODULE_VERSION_EXPORT_SECTION(module, version, section) \
|
||||
__MODULE_VERSION_EXPORT_BEGIN(module, version) \
|
||||
(void *)§ion; \
|
||||
__MODULE_VERSION_EXPORT_END(module, version)
|
||||
|
||||
#define __MODULE_DEPEND_BEGIN(module) \
|
||||
int module##_version_check() \
|
||||
{ \
|
||||
|
||||
|
||||
#define _MODULE_DEPEND_BEGIN(module) \
|
||||
__MODULE_DEPEND_BEGIN(module)
|
||||
|
||||
|
||||
#define __VERSION_CHECK(module, version) \
|
||||
do { \
|
||||
int module##_version(int prt); \
|
||||
int v = module##_version(0); \
|
||||
if (MAJOR(version) != MAJOR(v) || MINOR(version) > MINOR(v)) { \
|
||||
log_i("=======version not match=======\n"); \
|
||||
module##_version(1); \
|
||||
log_i("==================================\n"); \
|
||||
while(1); \
|
||||
} \
|
||||
} while(0)
|
||||
/*-------------------上面的宏请勿调用------------------------------------*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//定义当前模块的版本检测函数
|
||||
#define MODULE_VERSION_EXPORT(module, version) \
|
||||
__MODULE_VERSION_EXPORT(module, version)
|
||||
|
||||
#define MODULE_VERSION_EXPORT_SECTION(module, version, section) \
|
||||
__MODULE_VERSION_EXPORT_SECTION(module, version, section)
|
||||
|
||||
#define MODULE_VERSION_EXPORT_BEGIN(module, version) \
|
||||
__MODULE_VERSION_EXPORT_BEGIN(module, version)
|
||||
|
||||
#define MODULE_VERSION_EXPORT_END(module, version) \
|
||||
__MODULE_VERSION_EXPORT_END(module, version)
|
||||
|
||||
//以下3个宏定义当前模块依赖的其它模块列表
|
||||
#define MODULE_DEPEND_BEGIN() \
|
||||
_MODULE_DEPEND_BEGIN(THIS_MODULE)
|
||||
|
||||
#define MODULE_DEPEND(module_d, version) \
|
||||
__VERSION_CHECK(module_d, version)
|
||||
|
||||
#define MODULE_DEPEND_END() \
|
||||
return 0; \
|
||||
}
|
||||
|
||||
|
||||
#define VERSION_CHECK(module, version) \
|
||||
__VERSION_CHECK(module, version)
|
||||
|
||||
|
||||
//通过调用版本检测函数使的模块的代码能够被链接
|
||||
#define load_module(module) \
|
||||
({ \
|
||||
int ret; \
|
||||
extern int module##_version_check(); \
|
||||
ret = module##_version_check();\
|
||||
ret; \
|
||||
})
|
||||
|
||||
extern version_t lib_version_begin[], lib_version_end[];
|
||||
|
||||
#define lib_version_check() \
|
||||
do { \
|
||||
version_t *version; \
|
||||
log_i("=========version check===========\n"); \
|
||||
for (version = lib_version_begin; version < lib_version_end; version++) { \
|
||||
(*version)(1); \
|
||||
}; \
|
||||
log_i("==================================\n\n"); \
|
||||
} while (0)
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user