【简介】
在RTD 的驱动库中经常能看到如下的代码编写方式,以下是LP_UART 的驱动代码中截取的代码段。
#define UART_START_SEC_CONST_BOOLEAN #include "Uart_MemMap.h" /** @brief Table storing DMA capabilities for LPUART instances. */ static const boolean Lpuart_Uart_Ip_InstHasLoopbackEnabled[LPUART_INSTANCE_COUNT] = LPUART_UART_IP_ENABLE_INTERNAL_LOOPBACK_PER_INSTANCE; #define UART_STOP_SEC_CONST_BOOLEAN #include "Uart_MemMap.h"
上述代码的目的是为了将变量放到特定的section 中进行管理。
首先定义UART_START_SEC_CONST_BOOLEAN宏,然后包含Uart_MemMap.h头文件。在这个头文件中,对应的宏控制代码如下:
上述代码展开后如下
#define UART_START_SEC_CONST_UNSPECIFIED # 1 "D:/git/s32-k3-328/s32k328/s32k328_M7_0_0/RTD_Plugin_TS_T40D34M40I0R0/BaseNXP_TS_T40D34M40I0R0/include/Uart_MemMap.h" 1 # 57 "D:/git/s32-k3-328/s32k328/s32k328_M7_0_0/RTD_Plugin_TS_T40D34M40I0R0/BaseNXP_TS_T40D34M40I0R0/include/Uart_MemMap.h" #define UART_MEMMAP_VENDOR_ID 43 #define UART_MEMMAP_AR_RELEASE_MAJOR_VERSION 4 #define UART_MEMMAP_AR_RELEASE_MINOR_VERSION 7 #define UART_MEMMAP_AR_RELEASE_REVISION_VERSION 0 #define UART_MEMMAP_SW_MAJOR_VERSION 4 #define UART_MEMMAP_SW_MINOR_VERSION 0 #define UART_MEMMAP_SW_PATCH_VERSION 0 # 81 "D:/git/s32-k3-328/s32k328/s32k328_M7_0_0/RTD_Plugin_TS_T40D34M40I0R0/BaseNXP_TS_T40D34M40I0R0/include/Uart_MemMap.h" #define MEMMAP_ERROR # 6802 "D:/git/s32-k3-328/s32k328/s32k328_M7_0_0/RTD_Plugin_TS_T40D34M40I0R0/BaseNXP_TS_T40D34M40I0R0/include/Uart_MemMap.h" #undef UART_START_SEC_CONST_UNSPECIFIED #define ENTERED_UART_START_SEC_CONST_UNSPECIFIED #define MEMMAP_MATCH_ERROR # 6814 "D:/git/s32-k3-328/s32k328/s32k328_M7_0_0/RTD_Plugin_TS_T40D34M40I0R0/BaseNXP_TS_T40D34M40I0R0/include/Uart_MemMap.h" #undef MEMMAP_ERROR #pragma GCC section rodata ".mcal_const" # 167 "../RTD/src/Lpuart_Uart_Ip.c" 2 static LPUART_Type * const Lpuart_Uart_Ip_apBases[(16u)] = { ((LPUART_Type *)(0x40328000u)), ((LPUART_Type *)(0x4032C000u)), ((LPUART_Type *)(0x40330000u)), ((LPUART_Type *)(0x40334000u)), ((LPUART_Type *)(0x40338000u)), ((LPUART_Type *)(0x4033C000u)), ((LPUART_Type *)(0x40340000u)), ((LPUART_Type *)(0x40344000u)), ((LPUART_Type *)(0x4048C000u)), ((LPUART_Type *)(0x40490000u)), ((LPUART_Type *)(0x40494000u)), ((LPUART_Type *)(0x40498000u)), ((LPUART_Type *)(0x4049C000u)), ((LPUART_Type *)(0x404A0000u)), ((LPUART_Type *)(0x404A4000u)), ((LPUART_Type *)(0x404A8000u)) };
同理 UART_STOP_SEC_CONST_BOOLEAN 定义如下
UART_START_SEC_CONST_BOOLEAN/UART_STOP_SEC_CONST_BOOLEAN 的调用需要配对使用不配对使用会触发编译错误分支以下代码定义时也是成对使用
上面只是RTD 代码中的一处使用方式,RTD中这样的使用方法随处可见,RTD驱动中对memory 的管理都是采用的这种方式统一进行管理。
【总结】
RTD(Runtime Run-Time Driver)驱动库采用了一种非常系统化的内存区域管理机制,这种机制在嵌入式系统开发中非常常见且重要。我来详细解析一下这种机制的设计思路和优势:核心机制:基于宏的内存段管理这种方式通过宏定义UART_START_SEC_xxx和UART_STOP_SEC_xxx来包裹变量定义,配合Uart_MemMap.h头文件实现: