*===========================================================================*/
/* Create and include board definition file. */
/*===========================================================================*/
/* Define board initialization function */
/**
* @brief Concatenates two strings
* @param \_a\_ first string
* @param \_b\_ second string
*/
#define concatenate(_a_,_b_) _a_ ## _b_
/**
* @brief Builds the board initialization function
* @param \_a\_ board name
*/
#define BOARD_INIT_FUNC(_a_) concatenate(_a_,_init())
/* Define board configuration file */
/**
* @brief Macro to convert a parameter into a string
* @param \_x\_ name to be converted
*/
#define stringify(_x_) #_x_
/**
* @brief Macro to create the board header file
* @param \_a\_ file basename
*/
#define BOARD_FILE(_a_) stringify(_a_.h)
/**
* @brief Includes board configuration file
* @param BOARD_NAME name of the board
*/
#if defined(BUILD_PLATFORM_BOARD)
#include BOARD_FILE(BOARD_NAME)
#endif
这段代码是用于动态地创建和包含特定的板载设备定义文件和配置文件。让我们逐步解释每个部分的作用:
1. **concatenate(_a_, _b_) 宏定义**:
- 这个宏用于将两个输入参数 `_a_` 和 `_b_` 连接起来。在代码中,它的作用是用来组合形成函数名。
- 示例:如果 `_a_` 是 `board_name`,`_b_` 是 `_init()`,那么 `concatenate(_a_, _b_)` 将会生成 `board_name_init()`。
2. **BOARD_INIT_FUNC(_a_) 宏定义**:
- 这个宏用于构建板载设备初始化函数的名称。
- 它利用了 `concatenate` 宏,将传入的参数 `_a_` 与 `_init()` 结合起来形成函数名。
- 示例:如果传入的 `_a_` 是 `my_board`,那么 `BOARD_INIT_FUNC(my_board)` 将被展开为 `my_board_init()`。
3. **stringify(_x_) 宏定义**:
- 这个宏用于将传入的参数 `_x_` 转换成字符串字面量。
- 示例:如果 `_x_` 是 `my_board`,则 `stringify(my_board)` 将被展开为 `"my_board"`。
4. **BOARD_FILE(_a_) 宏定义**:
- 这个宏用于生成包含特定文件的文件名的字符串。
- 它使用了 `stringify` 宏,将传入的 `_a_` 与 `.h` 结合起来形成头文件名的字符串字面量。
- 示例:如果 `_a_` 是 `my_board`,那么 `BOARD_FILE(my_board)` 将被展开为 `"my_board.h"`。
5. **#if defined(BUILD_PLATFORM_BOARD) 和 #include BOARD_FILE(BOARD_NAME)**:
- 这部分代码是条件编译和包含文件的部分。
- `#if defined(BUILD_PLATFORM_BOARD)` 检查是否定义了 `BUILD_PLATFORM_BOARD` 宏。
- 如果定义了,就会包含 `BOARD_FILE(BOARD_NAME)` 所展开的文件名,这里 `BOARD_NAME` 应该是预定义或者通过其他方式定义的板名称。
总结来说,这些宏定义和条件编译结合起来,可以根据预定义的板名称动态地生成和包含相应的设备定义文件和配置文件,使代码能够根据不同的板载设备进行灵活的配置和编译。