mirror of
https://gitee.com/Lamdonn/varch.git
synced 2025-12-06 16:56:42 +08:00
72 lines
2.7 KiB
C
72 lines
2.7 KiB
C
/*********************************************************************************************************
|
|
* ------------------------------------------------------------------------------------------------------
|
|
* file description
|
|
* ------------------------------------------------------------------------------------------------------
|
|
* \file init.h
|
|
* \brief This is a C language initialize export module.
|
|
* \author Lamdonn
|
|
* \version 1.0.0
|
|
* \license GPL-2.0
|
|
* \copyright Copyright (C) 2023 Lamdonn.
|
|
********************************************************************************************************/
|
|
#ifndef __init_H
|
|
#define __init_H
|
|
|
|
/* version infomation */
|
|
|
|
#define INIT_V_MAJOR 1
|
|
#define INIT_V_MINOR 0
|
|
#define INIT_V_PATCH 0
|
|
|
|
/* ***** Important!!! *****
|
|
* Please make sure that the init module is compiled in a higher order than the files using the init module.
|
|
*/
|
|
|
|
/* Define anonymous variable format */
|
|
#define __INIT_ANONY(type, var, line) type var##line
|
|
#define INIT_ANONY_DEFINE(type, var) __INIT_ANONY(type, var, __LINE__)
|
|
|
|
/* Special instructions for compilation */
|
|
#if defined(__CC_ARM) || defined(__GNUC__) /* ARM,GCC*/
|
|
#define INIT_SECTION(x) __attribute__((section(x)))
|
|
#define INIT_USED __attribute__((used))
|
|
#elif defined (__ICCARM__) /*IAR */
|
|
#define INIT_SECTION(x) @ x
|
|
#define INIT_USED __root
|
|
#else
|
|
#error "Current tool chain haven't supported yet!"
|
|
#endif
|
|
|
|
/* Initialization function format */
|
|
typedef void (*init_handler_t)(void);
|
|
|
|
/* Initialization structure definition */
|
|
typedef struct {
|
|
init_handler_t handler;
|
|
} init_item;
|
|
|
|
/* Initialize export instead of macro definition */
|
|
#define __initialize(func, level) \
|
|
INIT_USED INIT_ANONY_DEFINE(const init_item, init_item_##func) \
|
|
INIT_SECTION("init."level) = {func}
|
|
|
|
/**
|
|
* \brief different levels of initialization are exported. The smaller the number, the more priority the initialization will be executed.
|
|
* \param[in] func: initialization function that needs to be executed
|
|
* \return none
|
|
*/
|
|
#define init_export_hardware(func) __initialize(func, "1")
|
|
#define init_export_driver(func) __initialize(func, "2")
|
|
#define init_export_system(func) __initialize(func, "3")
|
|
#define init_export_module(func) __initialize(func, "4")
|
|
#define init_export_app(func) __initialize(func, "5")
|
|
|
|
/**
|
|
* \brief All initialization functions are called in this function,
|
|
this function needs to be called as early as possible to execute each initialization function.
|
|
* \return none
|
|
*/
|
|
void init_execute(void);
|
|
|
|
#endif
|